diff --git a/composer.json b/composer.json
index 06a33909a..099478af4 100755
--- a/composer.json
+++ b/composer.json
@@ -10,7 +10,7 @@
"php": "8.1"
}
},
- "version": "3.1.1",
+ "version": "3.1.3",
"keywords": ["passwords", "manager", "collaborative", "vault", "security"],
"homepage": "https://www.teampass.net",
"license": [
@@ -144,19 +144,19 @@
"ext-iconv": "*",
"ext-xml": "*",
"ext-gd": "*",
- "teampassclasses/sessionmanager": "dev-master",
- "teampassclasses/superglobal": "dev-master",
- "teampassclasses/nestedtree": "dev-master",
- "ezimuel/php-secure-session": "dev-master",
- "teampassclasses/performchecks": "dev-master",
- "teampassclasses/encryption": "dev-master",
- "teampassclasses/language": "dev-master",
- "teampassclasses/ldapextra": "dev-master",
- "teampassclasses/passwordmanager": "dev-master",
- "teampassclasses/oauth2controller": "dev-master",
- "teampassclasses/configmanager": "dev-master",
- "teampassclasses/emailservice": "dev-master",
- "teampassclasses/folderservices": "dev-master",
+ "teampassclasses/sessionmanager": "dev-hotfix/code_clean",
+ "teampassclasses/superglobal": "dev-hotfix/code_clean",
+ "teampassclasses/nestedtree": "dev-hotfix/code_clean",
+ "ezimuel/php-secure-session": "dev-hotfix/code_clean",
+ "teampassclasses/performchecks": "dev-hotfix/code_clean",
+ "teampassclasses/encryption": "dev-hotfix/code_clean",
+ "teampassclasses/language": "dev-hotfix/code_clean",
+ "teampassclasses/ldapextra": "dev-hotfix/code_clean",
+ "teampassclasses/passwordmanager": "dev-hotfix/code_clean",
+ "teampassclasses/oauth2controller": "dev-hotfix/code_clean",
+ "teampassclasses/configmanager": "dev-hotfix/code_clean",
+ "teampassclasses/emailservice": "dev-hotfix/code_clean",
+ "teampassclasses/folderservices": "dev-hotfix/code_clean",
"illuminate/contracts": "^10.32",
"illuminate/collections": "^10.48",
"nesbot/carbon": "^2.71",
@@ -167,7 +167,7 @@
"owasp/csrf-protector-php": "^1.0",
"phpmailer/phpmailer": "^6.8",
"moxiecode/plupload": "^3.1",
- "tecnickcom/tcpdf": "^6.6",
+ "tecnickcom/tcpdf": "^6.8",
"paragonie/random_compat": "^9.99",
"elegantweb/sanitizer": "^2.1",
"defuse/php-encryption": "^2.4",
diff --git a/composer.lock b/composer.lock
index 373210563..86476b6e3 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "d1155633d409330b1905ac8b6fb21840",
+ "content-hash": "e770f08857e869e962b2dc3a76834161",
"packages": [
{
"name": "bjeavons/zxcvbn-php",
@@ -193,16 +193,16 @@
},
{
"name": "composer/ca-bundle",
- "version": "1.5.3",
+ "version": "1.5.4",
"source": {
"type": "git",
"url": "https://github.com/composer/ca-bundle.git",
- "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2"
+ "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3b1fc3f0be055baa7c6258b1467849c3e8204eb2",
- "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/bc0593537a463e55cadf45fd938d23b75095b7e1",
+ "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1",
"shasum": ""
},
"require": {
@@ -249,7 +249,7 @@
"support": {
"irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/ca-bundle/issues",
- "source": "https://github.com/composer/ca-bundle/tree/1.5.3"
+ "source": "https://github.com/composer/ca-bundle/tree/1.5.4"
},
"funding": [
{
@@ -265,20 +265,20 @@
"type": "tidelift"
}
],
- "time": "2024-11-04T10:15:26+00:00"
+ "time": "2024-11-27T15:35:25+00:00"
},
{
"name": "composer/class-map-generator",
- "version": "1.4.0",
+ "version": "1.5.0",
"source": {
"type": "git",
"url": "https://github.com/composer/class-map-generator.git",
- "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783"
+ "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/class-map-generator/zipball/98bbf6780e56e0fd2404fe4b82eb665a0f93b783",
- "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783",
+ "url": "https://api.github.com/repos/composer/class-map-generator/zipball/4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915",
+ "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915",
"shasum": ""
},
"require": {
@@ -287,10 +287,10 @@
"symfony/finder": "^4.4 || ^5.3 || ^6 || ^7"
},
"require-dev": {
- "phpstan/phpstan": "^1.6",
- "phpstan/phpstan-deprecation-rules": "^1",
- "phpstan/phpstan-phpunit": "^1",
- "phpstan/phpstan-strict-rules": "^1.1",
+ "phpstan/phpstan": "^1.12 || ^2",
+ "phpstan/phpstan-deprecation-rules": "^1 || ^2",
+ "phpstan/phpstan-phpunit": "^1 || ^2",
+ "phpstan/phpstan-strict-rules": "^1.1 || ^2",
"phpunit/phpunit": "^8",
"symfony/filesystem": "^5.4 || ^6"
},
@@ -322,7 +322,7 @@
],
"support": {
"issues": "https://github.com/composer/class-map-generator/issues",
- "source": "https://github.com/composer/class-map-generator/tree/1.4.0"
+ "source": "https://github.com/composer/class-map-generator/tree/1.5.0"
},
"funding": [
{
@@ -338,20 +338,20 @@
"type": "tidelift"
}
],
- "time": "2024-10-03T18:14:00+00:00"
+ "time": "2024-11-25T16:11:06+00:00"
},
{
"name": "composer/composer",
- "version": "2.8.3",
+ "version": "2.8.4",
"source": {
"type": "git",
"url": "https://github.com/composer/composer.git",
- "reference": "2a7c71266b2545a3bed9f4860734081963f6e688"
+ "reference": "112e37d1dca22b3fdb81cf3524ab4994f47fdb8c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/composer/zipball/2a7c71266b2545a3bed9f4860734081963f6e688",
- "reference": "2a7c71266b2545a3bed9f4860734081963f6e688",
+ "url": "https://api.github.com/repos/composer/composer/zipball/112e37d1dca22b3fdb81cf3524ab4994f47fdb8c",
+ "reference": "112e37d1dca22b3fdb81cf3524ab4994f47fdb8c",
"shasum": ""
},
"require": {
@@ -395,13 +395,13 @@
],
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "2.8-dev"
- },
"phpstan": {
"includes": [
"phpstan/rules.neon"
]
+ },
+ "branch-alias": {
+ "dev-main": "2.8-dev"
}
},
"autoload": {
@@ -436,7 +436,7 @@
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/composer/issues",
"security": "https://github.com/composer/composer/security/policy",
- "source": "https://github.com/composer/composer/tree/2.8.3"
+ "source": "https://github.com/composer/composer/tree/2.8.4"
},
"funding": [
{
@@ -452,7 +452,7 @@
"type": "tidelift"
}
],
- "time": "2024-11-17T12:13:04+00:00"
+ "time": "2024-12-11T10:57:47+00:00"
},
{
"name": "composer/metadata-minifier",
@@ -550,13 +550,13 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "3.x-dev"
- },
"phpstan": {
"includes": [
"extension.neon"
]
+ },
+ "branch-alias": {
+ "dev-main": "3.x-dev"
}
},
"autoload": {
@@ -898,16 +898,16 @@
},
{
"name": "directorytree/ldaprecord",
- "version": "v3.7.5",
+ "version": "v3.7.6",
"source": {
"type": "git",
"url": "https://github.com/DirectoryTree/LdapRecord.git",
- "reference": "d66344ab2db16049d1611ebd66916c7a314753fc"
+ "reference": "9df53be0893d361f2a383d41f715268a8a7f596c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/DirectoryTree/LdapRecord/zipball/d66344ab2db16049d1611ebd66916c7a314753fc",
- "reference": "d66344ab2db16049d1611ebd66916c7a314753fc",
+ "url": "https://api.github.com/repos/DirectoryTree/LdapRecord/zipball/9df53be0893d361f2a383d41f715268a8a7f596c",
+ "reference": "9df53be0893d361f2a383d41f715268a8a7f596c",
"shasum": ""
},
"require": {
@@ -970,7 +970,7 @@
"type": "github"
}
],
- "time": "2024-11-13T22:43:56+00:00"
+ "time": "2024-12-07T01:11:37+00:00"
},
{
"name": "dittertp/gibberish-aes-php",
@@ -1298,16 +1298,16 @@
},
{
"name": "egulias/email-validator",
- "version": "4.0.2",
+ "version": "4.0.3",
"source": {
"type": "git",
"url": "https://github.com/egulias/EmailValidator.git",
- "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e"
+ "reference": "b115554301161fa21467629f1e1391c1936de517"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e",
- "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517",
+ "reference": "b115554301161fa21467629f1e1391c1936de517",
"shasum": ""
},
"require": {
@@ -1353,7 +1353,7 @@
],
"support": {
"issues": "https://github.com/egulias/EmailValidator/issues",
- "source": "https://github.com/egulias/EmailValidator/tree/4.0.2"
+ "source": "https://github.com/egulias/EmailValidator/tree/4.0.3"
},
"funding": [
{
@@ -1361,7 +1361,7 @@
"type": "github"
}
],
- "time": "2023-10-06T06:47:41+00:00"
+ "time": "2024-12-27T00:36:43+00:00"
},
{
"name": "elegantweb/sanitizer",
@@ -1389,12 +1389,12 @@
"type": "library",
"extra": {
"laravel": {
- "providers": [
- "Elegant\\Sanitizer\\Laravel\\SanitizerServiceProvider"
- ],
"aliases": {
"Sanitizer": "Elegant\\Sanitizer\\Laravel\\Facade"
- }
+ },
+ "providers": [
+ "Elegant\\Sanitizer\\Laravel\\SanitizerServiceProvider"
+ ]
}
},
"autoload": {
@@ -1434,7 +1434,7 @@
},
{
"name": "ezimuel/php-secure-session",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/ezimuel/phpsecuresession",
@@ -1468,16 +1468,16 @@
},
{
"name": "firebase/php-jwt",
- "version": "v6.10.1",
+ "version": "v6.10.2",
"source": {
"type": "git",
"url": "https://github.com/firebase/php-jwt.git",
- "reference": "500501c2ce893c824c801da135d02661199f60c5"
+ "reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5",
- "reference": "500501c2ce893c824c801da135d02661199f60c5",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/30c19ed0f3264cb660ea496895cfb6ef7ee3653b",
+ "reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b",
"shasum": ""
},
"require": {
@@ -1525,9 +1525,9 @@
],
"support": {
"issues": "https://github.com/firebase/php-jwt/issues",
- "source": "https://github.com/firebase/php-jwt/tree/v6.10.1"
+ "source": "https://github.com/firebase/php-jwt/tree/v6.10.2"
},
- "time": "2024-05-18T18:05:11+00:00"
+ "time": "2024-11-24T11:22:49+00:00"
},
{
"name": "goodby/csv",
@@ -1962,16 +1962,16 @@
},
{
"name": "illuminate/collections",
- "version": "v10.48.24",
+ "version": "v10.48.25",
"source": {
"type": "git",
"url": "https://github.com/illuminate/collections.git",
- "reference": "37c863cffb345869dd134eff8e646bc82a19cc96"
+ "reference": "48de3d6bc6aa779112ddcb608a3a96fc975d89d8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/collections/zipball/37c863cffb345869dd134eff8e646bc82a19cc96",
- "reference": "37c863cffb345869dd134eff8e646bc82a19cc96",
+ "url": "https://api.github.com/repos/illuminate/collections/zipball/48de3d6bc6aa779112ddcb608a3a96fc975d89d8",
+ "reference": "48de3d6bc6aa779112ddcb608a3a96fc975d89d8",
"shasum": ""
},
"require": {
@@ -2013,20 +2013,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2024-06-19T14:25:05+00:00"
+ "time": "2024-11-21T14:02:44+00:00"
},
{
"name": "illuminate/conditionable",
- "version": "v10.48.24",
+ "version": "v10.48.25",
"source": {
"type": "git",
"url": "https://github.com/illuminate/conditionable.git",
- "reference": "d0958e4741fc9d6f516a552060fd1b829a85e009"
+ "reference": "3ee34ac306fafc2a6f19cd7cd68c9af389e432a5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/conditionable/zipball/d0958e4741fc9d6f516a552060fd1b829a85e009",
- "reference": "d0958e4741fc9d6f516a552060fd1b829a85e009",
+ "url": "https://api.github.com/repos/illuminate/conditionable/zipball/3ee34ac306fafc2a6f19cd7cd68c9af389e432a5",
+ "reference": "3ee34ac306fafc2a6f19cd7cd68c9af389e432a5",
"shasum": ""
},
"require": {
@@ -2059,20 +2059,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2023-02-03T08:06:17+00:00"
+ "time": "2024-11-21T14:02:44+00:00"
},
{
"name": "illuminate/container",
- "version": "v10.48.24",
+ "version": "v10.48.25",
"source": {
"type": "git",
"url": "https://github.com/illuminate/container.git",
- "reference": "ddc26273085fad3c471b2602ad820e0097ff7939"
+ "reference": "ed6253f7dd3a67d468b2cc7a69a657e1f14c7ba3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/container/zipball/ddc26273085fad3c471b2602ad820e0097ff7939",
- "reference": "ddc26273085fad3c471b2602ad820e0097ff7939",
+ "url": "https://api.github.com/repos/illuminate/container/zipball/ed6253f7dd3a67d468b2cc7a69a657e1f14c7ba3",
+ "reference": "ed6253f7dd3a67d468b2cc7a69a657e1f14c7ba3",
"shasum": ""
},
"require": {
@@ -2110,20 +2110,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2023-06-18T09:12:03+00:00"
+ "time": "2024-11-21T14:02:44+00:00"
},
{
"name": "illuminate/contracts",
- "version": "v10.48.24",
+ "version": "v10.48.25",
"source": {
"type": "git",
"url": "https://github.com/illuminate/contracts.git",
- "reference": "8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac"
+ "reference": "f90663a69f926105a70b78060a31f3c64e2d1c74"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/contracts/zipball/8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac",
- "reference": "8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac",
+ "url": "https://api.github.com/repos/illuminate/contracts/zipball/f90663a69f926105a70b78060a31f3c64e2d1c74",
+ "reference": "f90663a69f926105a70b78060a31f3c64e2d1c74",
"shasum": ""
},
"require": {
@@ -2158,11 +2158,11 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2024-01-15T18:52:32+00:00"
+ "time": "2024-11-21T14:02:44+00:00"
},
{
"name": "illuminate/filesystem",
- "version": "v10.48.24",
+ "version": "v10.48.25",
"source": {
"type": "git",
"url": "https://github.com/illuminate/filesystem.git",
@@ -2229,7 +2229,7 @@
},
{
"name": "illuminate/macroable",
- "version": "v10.48.24",
+ "version": "v10.48.25",
"source": {
"type": "git",
"url": "https://github.com/illuminate/macroable.git",
@@ -2275,16 +2275,16 @@
},
{
"name": "illuminate/support",
- "version": "v10.48.24",
+ "version": "v10.48.25",
"source": {
"type": "git",
"url": "https://github.com/illuminate/support.git",
- "reference": "56c6d9895605b019e3debb9440454596ef99312a"
+ "reference": "64b258f80175c658aef9e22dd3f2ba18c99b243c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/support/zipball/56c6d9895605b019e3debb9440454596ef99312a",
- "reference": "56c6d9895605b019e3debb9440454596ef99312a",
+ "url": "https://api.github.com/repos/illuminate/support/zipball/64b258f80175c658aef9e22dd3f2ba18c99b243c",
+ "reference": "64b258f80175c658aef9e22dd3f2ba18c99b243c",
"shasum": ""
},
"require": {
@@ -2342,11 +2342,11 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2024-05-20T13:31:33+00:00"
+ "time": "2024-11-21T14:02:44+00:00"
},
{
"name": "illuminate/translation",
- "version": "v10.48.24",
+ "version": "v10.48.25",
"source": {
"type": "git",
"url": "https://github.com/illuminate/translation.git",
@@ -2397,16 +2397,16 @@
},
{
"name": "illuminate/validation",
- "version": "v10.48.24",
+ "version": "v10.48.25",
"source": {
"type": "git",
"url": "https://github.com/illuminate/validation.git",
- "reference": "c9be8b183279f0175233e0758285a297431045ac"
+ "reference": "1daeb12f3608a0c5dfd80c4978ceb34e690f2f3c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/validation/zipball/c9be8b183279f0175233e0758285a297431045ac",
- "reference": "c9be8b183279f0175233e0758285a297431045ac",
+ "url": "https://api.github.com/repos/illuminate/validation/zipball/1daeb12f3608a0c5dfd80c4978ceb34e690f2f3c",
+ "reference": "1daeb12f3608a0c5dfd80c4978ceb34e690f2f3c",
"shasum": ""
},
"require": {
@@ -2454,7 +2454,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2024-03-08T02:31:57+00:00"
+ "time": "2024-11-21T14:02:44+00:00"
},
{
"name": "justinrainbow/json-schema",
@@ -2523,35 +2523,30 @@
},
{
"name": "league/oauth2-client",
- "version": "2.7.0",
+ "version": "2.8.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/oauth2-client.git",
- "reference": "160d6274b03562ebeb55ed18399281d8118b76c8"
+ "reference": "3d5cf8d0543731dfb725ab30e4d7289891991e13"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/160d6274b03562ebeb55ed18399281d8118b76c8",
- "reference": "160d6274b03562ebeb55ed18399281d8118b76c8",
+ "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/3d5cf8d0543731dfb725ab30e4d7289891991e13",
+ "reference": "3d5cf8d0543731dfb725ab30e4d7289891991e13",
"shasum": ""
},
"require": {
- "guzzlehttp/guzzle": "^6.0 || ^7.0",
- "paragonie/random_compat": "^1 || ^2 || ^9.99",
- "php": "^5.6 || ^7.0 || ^8.0"
+ "ext-json": "*",
+ "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5",
+ "php": "^7.1 || >=8.0.0 <8.5.0"
},
"require-dev": {
"mockery/mockery": "^1.3.5",
- "php-parallel-lint/php-parallel-lint": "^1.3.1",
- "phpunit/phpunit": "^5.7 || ^6.0 || ^9.5",
- "squizlabs/php_codesniffer": "^2.3 || ^3.0"
+ "php-parallel-lint/php-parallel-lint": "^1.4",
+ "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11",
+ "squizlabs/php_codesniffer": "^3.11"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-2.x": "2.0.x-dev"
- }
- },
"autoload": {
"psr-4": {
"League\\OAuth2\\Client\\": "src/"
@@ -2587,9 +2582,9 @@
],
"support": {
"issues": "https://github.com/thephpleague/oauth2-client/issues",
- "source": "https://github.com/thephpleague/oauth2-client/tree/2.7.0"
+ "source": "https://github.com/thephpleague/oauth2-client/tree/2.8.0"
},
- "time": "2023-04-16T18:19:15+00:00"
+ "time": "2024-12-11T05:05:52+00:00"
},
{
"name": "moxiecode/plupload",
@@ -2674,16 +2669,16 @@
},
{
"name": "nesbot/carbon",
- "version": "2.72.5",
+ "version": "2.72.6",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
- "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed"
+ "reference": "1e9d50601e7035a4c61441a208cb5bed73e108c5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/afd46589c216118ecd48ff2b95d77596af1e57ed",
- "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/1e9d50601e7035a4c61441a208cb5bed73e108c5",
+ "reference": "1e9d50601e7035a4c61441a208cb5bed73e108c5",
"shasum": ""
},
"require": {
@@ -2703,7 +2698,7 @@
"doctrine/orm": "^2.7 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.0",
"kylekatarnls/multi-tester": "^2.0",
- "ondrejmirtes/better-reflection": "*",
+ "ondrejmirtes/better-reflection": "<6",
"phpmd/phpmd": "^2.9",
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^0.12.99 || ^1.7.14",
@@ -2716,10 +2711,6 @@
],
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "3.x-dev",
- "dev-2.x": "2.x-dev"
- },
"laravel": {
"providers": [
"Carbon\\Laravel\\ServiceProvider"
@@ -2729,6 +2720,10 @@
"includes": [
"extension.neon"
]
+ },
+ "branch-alias": {
+ "dev-2.x": "2.x-dev",
+ "dev-master": "3.x-dev"
}
},
"autoload": {
@@ -2777,7 +2772,7 @@
"type": "tidelift"
}
],
- "time": "2024-06-03T19:18:41+00:00"
+ "time": "2024-12-27T09:28:11+00:00"
},
{
"name": "owasp/csrf-protector-php",
@@ -3047,16 +3042,16 @@
},
{
"name": "phpmailer/phpmailer",
- "version": "v6.9.2",
+ "version": "v6.9.3",
"source": {
"type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git",
- "reference": "a7b17b42fa4887c92146243f3d2f4ccb962af17c"
+ "reference": "2f5c94fe7493efc213f643c23b1b1c249d40f47e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a7b17b42fa4887c92146243f3d2f4ccb962af17c",
- "reference": "a7b17b42fa4887c92146243f3d2f4ccb962af17c",
+ "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/2f5c94fe7493efc213f643c23b1b1c249d40f47e",
+ "reference": "2f5c94fe7493efc213f643c23b1b1c249d40f47e",
"shasum": ""
},
"require": {
@@ -3116,7 +3111,7 @@
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues",
- "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.2"
+ "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.3"
},
"funding": [
{
@@ -3124,7 +3119,7 @@
"type": "github"
}
],
- "time": "2024-10-09T10:07:50+00:00"
+ "time": "2024-11-24T18:04:13+00:00"
},
{
"name": "phpseclib/phpseclib",
@@ -4302,16 +4297,16 @@
},
{
"name": "symfony/contracts",
- "version": "v3.5.0",
+ "version": "v3.5.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/contracts.git",
- "reference": "f8cd5313753cfac8329ebc4033e2013b874208e1"
+ "reference": "a1a717e017c8c30e5c339807ca47d7da1a19489f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/contracts/zipball/f8cd5313753cfac8329ebc4033e2013b874208e1",
- "reference": "f8cd5313753cfac8329ebc4033e2013b874208e1",
+ "url": "https://api.github.com/repos/symfony/contracts/zipball/a1a717e017c8c30e5c339807ca47d7da1a19489f",
+ "reference": "a1a717e017c8c30e5c339807ca47d7da1a19489f",
"shasum": ""
},
"require": {
@@ -4377,7 +4372,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/contracts/tree/v3.5.0"
+ "source": "https://github.com/symfony/contracts/tree/v3.5.2"
},
"funding": [
{
@@ -4393,7 +4388,7 @@
"type": "tidelift"
}
],
- "time": "2024-04-18T09:32:20+00:00"
+ "time": "2024-12-07T08:49:48+00:00"
},
{
"name": "symfony/filesystem",
@@ -4527,16 +4522,16 @@
},
{
"name": "symfony/http-foundation",
- "version": "v6.4.15",
+ "version": "v6.4.16",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6"
+ "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6",
- "reference": "9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/431771b7a6f662f1575b3cfc8fd7617aa9864d57",
+ "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57",
"shasum": ""
},
"require": {
@@ -4584,7 +4579,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v6.4.15"
+ "source": "https://github.com/symfony/http-foundation/tree/v6.4.16"
},
"funding": [
{
@@ -4600,7 +4595,7 @@
"type": "tidelift"
}
],
- "time": "2024-11-08T16:09:24+00:00"
+ "time": "2024-11-13T18:58:10+00:00"
},
{
"name": "symfony/mime",
@@ -4785,8 +4780,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -4864,8 +4859,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -4941,8 +4936,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -5020,8 +5015,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -5102,8 +5097,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -5186,8 +5181,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -5260,8 +5255,8 @@
"type": "metapackage",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -5325,8 +5320,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -5401,8 +5396,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -5481,8 +5476,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -5557,8 +5552,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -5857,7 +5852,7 @@
},
{
"name": "teampassclasses/configmanager",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/configmanager",
@@ -5888,7 +5883,7 @@
},
{
"name": "teampassclasses/emailservice",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/emailservice",
@@ -5922,7 +5917,7 @@
},
{
"name": "teampassclasses/encryption",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/encryption",
@@ -5957,7 +5952,7 @@
},
{
"name": "teampassclasses/folderservices",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/folderservices",
@@ -5991,7 +5986,7 @@
},
{
"name": "teampassclasses/language",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/language",
@@ -6022,7 +6017,7 @@
},
{
"name": "teampassclasses/ldapextra",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/ldapextra",
@@ -6057,7 +6052,7 @@
},
{
"name": "teampassclasses/nestedtree",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/nestedtree",
@@ -6092,7 +6087,7 @@
},
{
"name": "teampassclasses/oauth2controller",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/oauth2controller",
@@ -6128,7 +6123,7 @@
},
{
"name": "teampassclasses/passwordmanager",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/passwordmanager",
@@ -6163,7 +6158,7 @@
},
{
"name": "teampassclasses/performchecks",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/performchecks",
@@ -6198,7 +6193,7 @@
},
{
"name": "teampassclasses/sessionmanager",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/sessionmanager",
@@ -6233,7 +6228,7 @@
},
{
"name": "teampassclasses/superglobal",
- "version": "dev-master",
+ "version": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/superglobal",
@@ -6268,20 +6263,21 @@
},
{
"name": "tecnickcom/tcpdf",
- "version": "6.7.7",
+ "version": "6.8.0",
"source": {
"type": "git",
"url": "https://github.com/tecnickcom/TCPDF.git",
- "reference": "cfbc0028cc23f057f2baf9e73bdc238153c22086"
+ "reference": "14ffa0e308f5634aa2489568b4b90b24073b6731"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/cfbc0028cc23f057f2baf9e73bdc238153c22086",
- "reference": "cfbc0028cc23f057f2baf9e73bdc238153c22086",
+ "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/14ffa0e308f5634aa2489568b4b90b24073b6731",
+ "reference": "14ffa0e308f5634aa2489568b4b90b24073b6731",
"shasum": ""
},
"require": {
- "php": ">=5.5.0"
+ "ext-curl": "*",
+ "php": ">=7.1.0"
},
"type": "library",
"autoload": {
@@ -6328,7 +6324,7 @@
],
"support": {
"issues": "https://github.com/tecnickcom/TCPDF/issues",
- "source": "https://github.com/tecnickcom/TCPDF/tree/6.7.7"
+ "source": "https://github.com/tecnickcom/TCPDF/tree/6.8.0"
},
"funding": [
{
@@ -6336,7 +6332,7 @@
"type": "custom"
}
],
- "time": "2024-10-26T12:15:02+00:00"
+ "time": "2024-12-23T13:34:57+00:00"
},
{
"name": "thenetworg/oauth2-azure",
@@ -6899,16 +6895,16 @@
},
{
"name": "symfony/cache",
- "version": "v6.4.14",
+ "version": "v6.4.16",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
- "reference": "36fb8aa88833708e9f29014b6f15fac051a8b613"
+ "reference": "70d60e9a3603108563010f8592dff15a6f15dfae"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/cache/zipball/36fb8aa88833708e9f29014b6f15fac051a8b613",
- "reference": "36fb8aa88833708e9f29014b6f15fac051a8b613",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/70d60e9a3603108563010f8592dff15a6f15dfae",
+ "reference": "70d60e9a3603108563010f8592dff15a6f15dfae",
"shasum": ""
},
"require": {
@@ -6975,7 +6971,7 @@
"psr6"
],
"support": {
- "source": "https://github.com/symfony/cache/tree/v6.4.14"
+ "source": "https://github.com/symfony/cache/tree/v6.4.16"
},
"funding": [
{
@@ -6991,7 +6987,7 @@
"type": "tidelift"
}
],
- "time": "2024-11-05T15:34:40+00:00"
+ "time": "2024-11-20T10:10:54+00:00"
},
{
"name": "symfony/css-selector",
@@ -7060,16 +7056,16 @@
},
{
"name": "symfony/dom-crawler",
- "version": "v6.4.13",
+ "version": "v6.4.16",
"source": {
"type": "git",
"url": "https://github.com/symfony/dom-crawler.git",
- "reference": "ae074dffb018c37a57071990d16e6152728dd972"
+ "reference": "4304e6ad5c894a9c72831ad459f627bfd35d766d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/ae074dffb018c37a57071990d16e6152728dd972",
- "reference": "ae074dffb018c37a57071990d16e6152728dd972",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4304e6ad5c894a9c72831ad459f627bfd35d766d",
+ "reference": "4304e6ad5c894a9c72831ad459f627bfd35d766d",
"shasum": ""
},
"require": {
@@ -7107,7 +7103,7 @@
"description": "Eases DOM navigation for HTML and XML documents",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/dom-crawler/tree/v6.4.13"
+ "source": "https://github.com/symfony/dom-crawler/tree/v6.4.16"
},
"funding": [
{
@@ -7123,7 +7119,7 @@
"type": "tidelift"
}
],
- "time": "2024-10-25T15:07:50+00:00"
+ "time": "2024-11-13T15:06:22+00:00"
},
{
"name": "symfony/var-exporter",
@@ -7206,20 +7202,20 @@
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {
- "teampassclasses/sessionmanager": 20,
- "teampassclasses/superglobal": 20,
- "teampassclasses/nestedtree": 20,
"ezimuel/php-secure-session": 20,
- "teampassclasses/performchecks": 20,
+ "passwordlib/passwordlib": 15,
+ "teampassclasses/configmanager": 20,
+ "teampassclasses/emailservice": 20,
"teampassclasses/encryption": 20,
+ "teampassclasses/folderservices": 20,
"teampassclasses/language": 20,
"teampassclasses/ldapextra": 20,
- "teampassclasses/passwordmanager": 20,
+ "teampassclasses/nestedtree": 20,
"teampassclasses/oauth2controller": 20,
- "teampassclasses/configmanager": 20,
- "teampassclasses/emailservice": 20,
- "teampassclasses/folderservices": 20,
- "passwordlib/passwordlib": 15
+ "teampassclasses/passwordmanager": 20,
+ "teampassclasses/performchecks": 20,
+ "teampassclasses/sessionmanager": 20,
+ "teampassclasses/superglobal": 20
},
"prefer-stable": true,
"prefer-lowest": false,
@@ -7233,7 +7229,7 @@
"ext-xml": "*",
"ext-gd": "*"
},
- "platform-dev": [],
+ "platform-dev": {},
"platform-overrides": {
"php": "8.1"
},
diff --git a/includes/config/include.php b/includes/config/include.php
index 8fe76d2d2..98358d1d2 100755
--- a/includes/config/include.php
+++ b/includes/config/include.php
@@ -28,7 +28,7 @@
define('TP_VERSION', '3.1.3');
define("UPGRADE_MIN_DATE", "1732981987");
-define('TP_VERSION_MINOR', '8');
+define('TP_VERSION_MINOR', 'TBD');
define('TP_TOOL_NAME', 'Teampass');
define('TP_ONE_DAY_SECONDS', 86400);
define('TP_ONE_WEEK_SECONDS', 604800);
diff --git a/includes/language/bulgarian.php b/includes/language/bulgarian.php
index 133837816..32657a610 100755
--- a/includes/language/bulgarian.php
+++ b/includes/language/bulgarian.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/catalan.php b/includes/language/catalan.php
index f575dc56f..41962bcf5 100755
--- a/includes/language/catalan.php
+++ b/includes/language/catalan.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/chinese.php b/includes/language/chinese.php
index f34efa53e..0bb02c1bd 100755
--- a/includes/language/chinese.php
+++ b/includes/language/chinese.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/czech.php b/includes/language/czech.php
index 1b73d92d7..e7e5d3d0c 100755
--- a/includes/language/czech.php
+++ b/includes/language/czech.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/dutch.php b/includes/language/dutch.php
index 02048a3cd..0d83230bc 100755
--- a/includes/language/dutch.php
+++ b/includes/language/dutch.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/english.php b/includes/language/english.php
index fd383a146..c4b97355a 100755
--- a/includes/language/english.php
+++ b/includes/language/english.php
@@ -28,6 +28,9 @@
* @see https://www.teampass.net
*/
return array(
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
'user_password_expired' => 'Your password has expired. Please change it.',
'oauth2_client_urlResourceOwnerDetails' => 'URL to get user details',
'oauth2_client_urlResourceOwnerDetails_tip' => 'URL to get user details. It is used to get user details after authentication.',
diff --git a/includes/language/estonian.php b/includes/language/estonian.php
index fa83259e9..91edb81d0 100755
--- a/includes/language/estonian.php
+++ b/includes/language/estonian.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/french.php b/includes/language/french.php
index 3515ddc19..a568058a5 100755
--- a/includes/language/french.php
+++ b/includes/language/french.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Les utilisateurs ne peuvent plus changer de stratégie de chargement',
'bruteforce_wait' => 'Trop de tentatives échouées, votre compte est bloqué jusqu'à : ',
'disable_drag_drop' => 'Désactiver le glisser-déposer d'objets',
+ 'clipboard_cleared' => 'Presse-papier nettoyé',
+ 'error_data_not_consistent' => 'Données non consistantes',
+ 'error_permission_denied' => 'Permission refusée',
+ 'error_invalid_action' => 'Action invalide',
);
diff --git a/includes/language/german.php b/includes/language/german.php
index 183929642..28f77e586 100755
--- a/includes/language/german.php
+++ b/includes/language/german.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/greek.php b/includes/language/greek.php
index fcb2cfb80..cc5ba331b 100755
--- a/includes/language/greek.php
+++ b/includes/language/greek.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/hungarian.php b/includes/language/hungarian.php
index 6b593ae64..440a641c6 100755
--- a/includes/language/hungarian.php
+++ b/includes/language/hungarian.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/italian.php b/includes/language/italian.php
index 8bacd9fb7..3996ab0a3 100755
--- a/includes/language/italian.php
+++ b/includes/language/italian.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/japanese.php b/includes/language/japanese.php
index 92daa2578..a6232e584 100755
--- a/includes/language/japanese.php
+++ b/includes/language/japanese.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/norwegian.php b/includes/language/norwegian.php
index 1a32a8461..db2e1dcdd 100755
--- a/includes/language/norwegian.php
+++ b/includes/language/norwegian.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/polish.php b/includes/language/polish.php
index 773285d99..47781ade1 100755
--- a/includes/language/polish.php
+++ b/includes/language/polish.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/portuguese.php b/includes/language/portuguese.php
index ba2384abc..9357ea7d0 100755
--- a/includes/language/portuguese.php
+++ b/includes/language/portuguese.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/portuguese_br.php b/includes/language/portuguese_br.php
index f98ffc857..0557e82fc 100755
--- a/includes/language/portuguese_br.php
+++ b/includes/language/portuguese_br.php
@@ -1011,7 +1011,7 @@
'execution_time' => 'Tempo de execução',
'maximum_number_of_items_to_treat' => 'Número máximos de itens a serem tratados em um único ciclo',
'maximum_number_of_items_to_treat_tip' => 'De forma a garantir que o script seja executado em sua totalidade antes de alcançar o tempo limite, é possível definir um valor personalizado.',
- 'maximum_time_script_allowed_to_run' => 'Duranção em segundos permitidos para a execução de scripts em segundo-plano',
+ 'maximum_time_script_allowed_to_run' => 'Duração permitida em segundos para a execução de scripts em segundo-plano',
'maximum_time_script_allowed_to_run_tip' => 'Por padrão, scripts PHP não podem executar mais tempo do que a duração definida no parâmetro max_execution_time no arquivo php.ini. O objetivo aqui é definir um valor maior para garantir que esse script seja executado em sua totalidade.',
'refresh_data_every_on_screen' => 'Tempo de atualização de tela (em segundos)',
'refresh_data_every_on_screen_tip' => 'Quando navegando através da visão de tarefas, essa opção permite atualizar a lista.',
@@ -1160,60 +1160,63 @@
'otp_secret' => 'Chave secreta OTP',
'settings_ldap_group_objectclasses_attibute' => 'Atributo da Classe de Objeto do Grupo AD',
'settings_ldap_group_objectclasses_attibute_tip' => 'As classes de objetos a serem usadas ao procurar grupos. Várias classes são separadas por vírgula (,). Exemplo: NomeGrupo, Grupo ou Top',
- 'display_warning_icons' => 'Display warning icons',
- 'password_length_by_default' => 'By default password length',
- 'progress' => 'Progress',
- 'tasks_log_retention_delay_in_days' => 'Tasks log retention delay (in days)',
- 'tasks_log_table_size' => 'Tasks log table size',
- 'error_otp_secret' => 'Enable to decode the OTP secret, is the secret correct?',
- 'users_api_access_info' => 'Users can access the API with same access rights as in Teampass.',
- 'error_folder_not_allowed_for_this_user' => 'Folder is not allowed for this user',
- 'allowed_to_create' => 'Allowed to create',
- 'allowed_to_read' => 'Allowed to read',
- 'allowed_to_update' => 'Allowed to update',
- 'allowed_to_delete' => 'Allowed to delete',
- 'folder_created' => 'Folder created',
- 'login_with_sso' => 'Login with SSO',
- 'server_connected_to_internet' => 'Server is connected to internet',
- 'server_not_connected_to_internet' => 'Server is connected to internet',
- 'server_not_connected_to_internet_tip' => 'This could lead to several functionnalities not working properly. Especially MFA',
- 'tools' => 'Tools',
- 'user_config_not_compliant' => 'User configuration is not compliant',
- 'fix_personal_items_empty' => 'Fix personal items are empty',
- 'fix_personal_items_empty_tip' => 'This tool permits to fix the issue where personal items are empty after a Teampass upgrade. It requires to have restored a copy of table teampass_items from Teampass version 2. The table needs to be named teampass_items_v2.',
- 'table_not_exists' => 'Expected table does not exist. Please restore it from a backup.',
- 'tools_usage_warning' => 'Using tools can have a direct impact on the database. Please be careful. Always perform a dump before and define a maintenance period.',
- 'select_user' => 'Select user',
- 'show_item_data' => 'Show item data in items list',
- 'show_item_data_tip' => 'Permits to display extra information in the items list (username, email and url). This could be useful to have a quick view of the item content.',
- 'items_page_split_view_mode' => 'Show item details in page split view mode',
- 'replace_tenant_id' => 'Adapt the URL but keep {tenant-id} as is. It will be replaced live by the tenant ID.',
- 'user_not_allowed_to_auth_to_teampass_app' => 'User is not allowed to authenticate with Teampass application',
- 'user_is_not_auth_with_oauth2' => 'User should not authenticate with Entra/Azure AD',
- 'highlight_favorites' => 'Highlight favorites',
+ 'display_warning_icons' => 'Mostrar ícones de alerta',
+ 'password_length_by_default' => 'Tamanho padrão de senha',
+ 'progress' => 'Progresso',
+ 'tasks_log_retention_delay_in_days' => 'Retenção de log de tarefas (em dias)',
+ 'tasks_log_table_size' => 'Tamanho da tabela de log de tarefas',
+ 'error_otp_secret' => 'Habilite a decodificação da chave OTP. A chave está correta?',
+ 'users_api_access_info' => 'Os usuários podem acessar a API com os mesmos direitos de acesso do Teampass.',
+ 'error_folder_not_allowed_for_this_user' => 'A pasta não é permitida para este usuário',
+ 'allowed_to_create' => 'Criação permitida',
+ 'allowed_to_read' => 'Leitura permitida',
+ 'allowed_to_update' => 'Alteração permitida',
+ 'allowed_to_delete' => 'Exclusão permitida',
+ 'folder_created' => 'Pasta criada',
+ 'login_with_sso' => 'Login com SSO',
+ 'server_connected_to_internet' => 'Servidor está conectado a internet',
+ 'server_not_connected_to_internet' => 'Servidor não está conectado a internet',
+ 'server_not_connected_to_internet_tip' => 'Isso pode levar a várias funcionalidades que não funcionam corretamente, especialmente MFA.',
+ 'tools' => 'Ferramentas',
+ 'user_config_not_compliant' => 'A configuração do usuário não está correta',
+ 'fix_personal_items_empty' => 'Corrigir itens pessoais que estão vazios',
+ 'fix_personal_items_empty_tip' => 'Esta ferramenta permite corrigir o problema em que itens pessoais ficam vazios após uma atualização do Teampass. Ela requer ter restaurado uma cópia da tabela teampass_items do Teampass versão 2. A tabela precisa ser nomeada teampass_items_v2.',
+ 'table_not_exists' => 'A tabela esperada não existe. Por favor, restaure-a de um backup.',
+ 'tools_usage_warning' => 'Usar ferramentas pode ter um impacto direto no banco de dados. Tenha cuidado. Sempre execute um dump antes e defina um período de manutenção.',
+ 'select_user' => 'Selecione o usuário',
+ 'show_item_data' => 'Mostrar dados do item na lista de itens',
+ 'show_item_data_tip' => 'Permite exibir informações extras na lista de itens (nome de usuário, e-mail e url). Isso pode ser útil para ter uma visualização rápida do conteúdo do item.',
+ 'items_page_split_view_mode' => 'Mostrar detalhes do item no modo de visualização de divisão de página',
+ 'replace_tenant_id' => 'Adapte a URL, mas mantenha {tenant-id} como está. Ela será substituída ao vivo pelo ID do locatário.',
+ 'user_not_allowed_to_auth_to_teampass_app' => 'O usuário não está autorizado a se autenticar pelo Teampass',
+ 'user_is_not_auth_with_oauth2' => 'O usuário não deve se autenticar com o Entra/Azure AD',
+ 'highlight_favorites' => 'Sinalizar favoritos',
'highlight_favorites_tip' => '',
- 'limited_search_default' => 'Limited search selected by default',
+ 'limited_search_default' => 'Pesquisa limitada selecionada por padrão',
'limited_search_default_tip' => '',
'highlight_selected_tip' => '',
- 'encryptClientServer' => 'Encrypt client-server exchanges',
- 'encryptClientServer_tip' => 'When enabled, the client encrypts the data before sending it to the server. The server only stores encrypted data. It can be disabled.',
- 'oauth2_client_urlResourceOwnerDetails' => 'URL to get user details',
- 'oauth2_client_urlResourceOwnerDetails_tip' => 'URL to get user details. It is used to get user details after authentication.',
- 'duo_redirect_uri' => 'Redirecting to Duo Prompt',
+ 'encryptClientServer' => 'Criptografar trocas cliente-servidor',
+ 'encryptClientServer_tip' => 'Quando habilitado, o cliente criptografa os dados antes de enviá-los ao servidor. O servidor armazena apenas dados criptografados. Ele pode ser desabilitado posteriormente.',
+ 'oauth2_client_urlResourceOwnerDetails' => 'URL para obter detalhes do usuário',
+ 'oauth2_client_urlResourceOwnerDetails_tip' => 'URL para obter detalhes do usuário. É usado para obter detalhes do usuário após autenticação.',
+ 'duo_redirect_uri' => 'Redirecionando para o Duo Prompt',
'number_users_build_cache_tree' => '',
- 'number_users_build_cache_tree_tip' => 'Number of users processed for build_cache_tree task at each run of the scheduler.',
- 'user_password_expired' => 'Your password has expired. Please change it.',
- 'user_password_policy_tip' => 'Th
-e new password must: - Be different from the previous one - Contain at least 10 characters - Contain at least one uppercase letter and one lowercase letter - Contain at least one number or special character - Not contain your name, first name, username, or email.',
- 'bruteforce_unlock_at' => 'Account unlocked at (anti bruteforce): ',
- 'bruteforce_reset_account' => 'Reset anti bruteforce of user',
- 'bruteforce_reset_mail_subject' => 'TEAMPASS - Your account is disabled',
- 'bruteforce_reset_mail_body' => 'Hello #name#,
Your teampass account has been locked due to a large number of authentication failures.
You can unblock it by clicking on this link #reset_url#
Automatic unlock: #unlock_at#',
- 'disable_user_edit_profile' => 'Users can no longer edit their profile',
- 'disable_user_edit_language' => 'Users can no longer change language',
- 'disable_user_edit_timezone' => 'Users can no longer change time zones',
- 'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
- 'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
- 'disable_drag_drop' => 'Disable item drag and drop',
+ 'number_users_build_cache_tree_tip' => 'Número de usuários processados para a tarefa build_cache_tree em cada execução do agendador.',
+ 'user_password_expired' => 'Sua senha expirou. Altere-a por favor.',
+ 'user_password_policy_tip' => 'A nova senha deve: - Ser diferente da anterior - Conter pelo menos 10 caracteres - Conter pelo menos uma letra maiúscula e uma letra minúscula - Conter pelo menos um número ou caractere especial - Não conter seu nome, nome, nome de usuário ou e-mail.',
+ 'bruteforce_unlock_at' => 'Conta desbloqueada em (anti força bruta):',
+ 'bruteforce_reset_account' => 'Redefinir anti-força bruta do usuário',
+ 'bruteforce_reset_mail_subject' => 'TEAMPASS - Sua conta está desabilitada',
+ 'bruteforce_reset_mail_body' => 'Olá #nome#,
Sua conta do TeamPass foi bloqueada devido a um grande número de falhas de autenticação.
Você pode desbloqueá-la clicando neste link #reset_url#
Desbloqueio automático: #unlock_at#',
+ 'disable_user_edit_profile' => 'Os usuários não podem mais editar seus perfis',
+ 'disable_user_edit_language' => 'Os usuários não podem mais alterar o idioma',
+ 'disable_user_edit_timezone' => 'Os usuários não podem mais alterar os fusos horários',
+ 'disable_user_edit_tree_load_strategy' => 'Os usuários não podem mais alterar a estratégia de carregamento de menus',
+ 'bruteforce_wait' => 'Muitas tentativas frustradas, sua conta será bloqueada até:',
+ 'disable_drag_drop' => 'Desabilidar arrastar e soltar',
+ 'clipboard_cleared' => 'Área de transferência limpa',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/romanian.php b/includes/language/romanian.php
index 9ccf8a22e..8203b3f46 100755
--- a/includes/language/romanian.php
+++ b/includes/language/romanian.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/russian.php b/includes/language/russian.php
index bc8fd699c..ac92ec913 100755
--- a/includes/language/russian.php
+++ b/includes/language/russian.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/spanish.php b/includes/language/spanish.php
index 6aadf1f57..7db15d97b 100755
--- a/includes/language/spanish.php
+++ b/includes/language/spanish.php
@@ -1202,18 +1202,21 @@
'duo_redirect_uri' => 'Redirigiendo al aviso de Duo',
'number_users_build_cache_tree' => 'Número de usuarios procesados para la tarea build_cache_tree.',
'number_users_build_cache_tree_tip' => 'Número de usuarios procesados para la tarea build_cache_tree en cada ejecución del programador.',
- 'user_password_expired' => 'Your password has expired. Please change it.',
- 'user_password_policy_tip' => 'Th
-e new password must: - Be different from the previous one - Contain at least 10 characters - Contain at least one uppercase letter and one lowercase letter - Contain at least one number or special character - Not contain your name, first name, username, or email.',
- 'bruteforce_unlock_at' => 'Account unlocked at (anti bruteforce): ',
- 'bruteforce_reset_account' => 'Reset anti bruteforce of user',
- 'bruteforce_reset_mail_subject' => 'TEAMPASS - Your account is disabled',
- 'bruteforce_reset_mail_body' => 'Hello #name#,
Your teampass account has been locked due to a large number of authentication failures.
You can unblock it by clicking on this link #reset_url#
Automatic unlock: #unlock_at#',
- 'disable_user_edit_profile' => 'Users can no longer edit their profile',
- 'disable_user_edit_language' => 'Users can no longer change language',
- 'disable_user_edit_timezone' => 'Users can no longer change time zones',
- 'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
- 'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
- 'disable_drag_drop' => 'Disable item drag and drop',
+ 'user_password_expired' => 'Tu contraseña ha expirado. Por favor, cámbiala.',
+ 'user_password_policy_tip' => 'La nueva contraseña debe cumplir con los siguientes requisitos: - Ser diferente a la anterior - Contener al menos 10 caracteres - Incluir al menos una letra mayúscula y una minúscula - Incluir al menos un número o un carácter especial - No contener tu nombre, apellidos, nombre de usuario o correo electrónico.',
+ 'bruteforce_unlock_at' => 'Cuenta desbloqueada a las (anti fuerza bruta): ',
+ 'bruteforce_reset_account' => 'Restablecer protección anti fuerza bruta del usuario',
+ 'bruteforce_reset_mail_subject' => 'TEAMPASS - Tu cuenta está deshabilitada',
+ 'bruteforce_reset_mail_body' => 'Hola #name#,
Tu cuenta de Teampass ha sido bloqueada debido a numerosos intentos fallidos de autenticación.
Puedes desbloquearla haciendo clic en este enlace #reset_url#
Desbloqueo automático: #unlock_at#',
+ 'disable_user_edit_profile' => 'Los usuarios ya no pueden editar su perfil',
+ 'disable_user_edit_language' => 'Los usuarios ya no pueden cambiar el idioma',
+ 'disable_user_edit_timezone' => 'Los usuarios ya no pueden cambiar la zona horaria',
+ 'disable_user_edit_tree_load_strategy' => 'Los usuarios ya no pueden cambiar la estrategia de carga del árbol',
+ 'bruteforce_wait' => 'Demasiados intentos fallidos, tu cuenta está bloqueada hasta: ',
+ 'disable_drag_drop' => 'Deshabilitar la función de arrastrar y soltar elementos',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/swedish.php b/includes/language/swedish.php
index 03f710921..fde506309 100755
--- a/includes/language/swedish.php
+++ b/includes/language/swedish.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/turkish.php b/includes/language/turkish.php
index ebb4ee9a4..65d834a3e 100755
--- a/includes/language/turkish.php
+++ b/includes/language/turkish.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/ukrainian.php b/includes/language/ukrainian.php
index 5603dad56..8c3781ad7 100755
--- a/includes/language/ukrainian.php
+++ b/includes/language/ukrainian.php
@@ -185,7 +185,7 @@
'no_item_found' => 'Елемент не знайдено',
'reading_file' => 'Читання файлу',
'where_shall_items_be_created' => 'Де створюються об'єкти',
- 'target_folder' => 'Цільова папка',
+ 'target_folder' => 'Цільова тека',
'select_file' => 'Вибрати файл',
'data_type_for_import' => 'Почніть з вибору типу даних для імпорту',
'get_tips_about_importation' => 'Отримайте поради щодо імпорту',
@@ -224,7 +224,7 @@
'caution_on_field_encryption_change' => 'Увага - Зверніть увагу, що зміна типу шифрування вимагатиме обробки всіх існуючих даних для зміни шифрування в базі даних.',
'caution_while_deleting_field' => 'Увага - Видалення цього поля також видалить пов'язані дані в елементах.',
'error_could_not_update_the_field' => 'Помилка - Поле не вдалося оновити. Будь ласка, спробуйте ще раз після перезавантаження сторінки.',
- 'caution_while_deleting_category' => 'Увага - Видалення цієї папки видалить усі її поля та всі пов'язані дані полів.',
+ 'caution_while_deleting_category' => 'Увага - Видалення цієї теки видалить усі її поля та всі пов'язані дані полів.',
'your_attention_please' => 'Увага, будь ласка',
'all_fields_are_required' => 'Усі поля обов'язкові',
'position' => 'Позиція',
@@ -262,21 +262,21 @@
'your_attention_is_required' => 'Потрібна ваша увага',
'favorite' => 'Улюблене',
'unfavorite' => 'Не улюблене',
- 'you_need_to_select_at_least_one_folder' => 'Вам потрібно вибрати принаймні одну папку',
+ 'you_need_to_select_at_least_one_folder' => 'Вам потрібно вибрати принаймні одну теку',
'no_value_defined_please_fix' => 'Значення не визначено! Будь ласка, виправте.',
'apply' => 'Застосувати',
'from' => 'Від',
'please_confirm_by_clicking_checkbox' => 'Будь ласка, підтвердіть, натиснувши на прапорець',
'date_range' => 'Діапазон дат',
'purge' => 'Очищення',
- 'belong_of_deleted_folder' => 'Належить до видаленої папки',
+ 'belong_of_deleted_folder' => 'Належить до видаленої теки',
'highlight_selected' => 'Виділити вибране',
'number_of_selected_objects' => 'Кількість вибраних об'єктів',
'confirm_selection_restore' => 'Будь ласка, підтвердіть відновлення вибраних елементів.',
'confirm_selection_delete' => 'Будь ласка, підтвердіть видалення вибраних елементів.',
'refreshing' => 'Оновлення',
'empty_list' => 'Порожній список',
- 'deleted_folders' => 'Видалені папки',
+ 'deleted_folders' => 'Видалені теки',
'deleted_items' => 'Видалені елементи',
'recycled_bin' => 'Кошик',
'database' => 'База даних',
@@ -298,7 +298,7 @@
'please_confirm' => 'Підтвердьте, будь ласка',
'by_clicking_this_checkbox_confirm_user_deletion' => 'Натиснувши цей прапорець, ви підтверджуєте видалення цього користувача.',
'fields_with_mandatory_information_are_missing' => 'Відсутні поля з обов'язковою інформацією',
- 'enable_personal_folder_for_this_user' => 'Увімкнути функцію особистої папки для цього користувача',
+ 'enable_personal_folder_for_this_user' => 'Увімкнути функцію особистої теки для цього користувача',
'special' => 'Спеціальний',
'administrator' => 'Адміністратор',
'super_manager' => 'Менеджер Teampass',
@@ -310,7 +310,7 @@
'no_selection_done' => 'Вибір не зроблено',
'tick_confirmation_box' => 'Будь ласка, встановіть прапорець для підтвердження',
'next_list_to_be_deleted' => 'Наступний список буде видалено',
- 'delete_folders' => 'Видалити папки',
+ 'delete_folders' => 'Видалити теки',
'submit' => 'Надіслати',
'label' => 'Мітка',
'parent' => 'Батьківський',
@@ -318,7 +318,7 @@
'access_right_for_roles' => 'Права доступу для ролей',
'create_without_password_minimal_complexity_target' => 'Дозволити створення нового елемента без мінімального рівня складності пароля',
'edit_without_password_minimal_complexity_target' => 'Дозволити редагування елемента без мінімального рівня складності пароля',
- 'add_new_folder' => 'Додати нову папку',
+ 'add_new_folder' => 'Додати нову теку',
'new' => 'Новий',
'id' => 'Ідентифікатор',
'mfa_short' => 'MFA',
@@ -358,11 +358,11 @@
'automatic_deletion_engaged' => 'Автоматичне видалення',
'auto_update_enabled' => 'Увімкнено автоматичну зміну пароля користувача. Наступна зміна запланована',
'copy_folder' => 'Копіювати теку',
- 'select_source_folder' => 'Виберіть папку для копіювання',
- 'select_destination_folder' => 'Виберіть папку призначення',
- 'delete_folder' => 'Видалити папку',
- 'select_folder_to_delete' => 'Виберіть папку для видалення',
- 'folder_delete_confirm' => 'Вибрана папка та її елементи будуть видалені. Будь ласка, встановіть прапорець для підтвердження цього видалення.',
+ 'select_source_folder' => 'Виберіть теку для копіювання',
+ 'select_destination_folder' => 'Виберіть теку призначення',
+ 'delete_folder' => 'Видалити теку',
+ 'select_folder_to_delete' => 'Виберіть теку для видалення',
+ 'folder_delete_confirm' => 'Вибрана тека та її елементи будуть видалені. Будь ласка, встановіть прапорець для підтвердження цього видалення.',
'json_error_format' => 'Невірний формат JSON',
'password_cannot_be_empty' => 'Пароль не може бути порожнім',
'password_too_long' => 'Пароль занадто довгий',
@@ -371,8 +371,8 @@
'emails' => 'Електронні листи',
'backups' => 'Резервні копії',
'api' => 'API',
- 'add_folder' => 'Додати нову папку',
- 'select_folder_parent' => 'Вибрати батьківську папку',
+ 'add_folder' => 'Додати нову теку',
+ 'select_folder_parent' => 'Вибрати батьківську теку',
'add' => 'Додати',
'key_is_not_correct' => 'Наданий ключ сесії неправильний',
'suggestion_information' => 'Ви можете запропонувати будь-які зміни цього елемента автору. Використовуйте форму вище, щоб зробити свої пропозиції щодо змін, і натисніть кнопку Виконати, щоб повідомити автора.',
@@ -391,7 +391,7 @@
'copy_item' => 'Копіювати елемент',
'new_item' => 'Новий елемент',
'error_not_allowed_to_edit_item' => 'Вам не дозволено редагувати цей елемент',
- 'error_not_allowed_to_access_this_folder' => 'Вам не дозволено доступ до цієї папки',
+ 'error_not_allowed_to_access_this_folder' => 'Вам не дозволено доступ до цієї теки',
'error_personal_saltkey_is_not_set' => 'Ваш особистий ключ солі не надано.',
'provide_your_personal_saltkey' => 'Будь ласка, надайте свій особистий ключ солі',
'no_fields' => 'Жодне поле не пов'язане з цим елементом.',
@@ -409,7 +409,7 @@
'item_deleted_after_date' => 'Елемент буде видалено після визначеної дати',
'password' => 'Пароль',
'save' => 'Зберегти',
- 'folder' => 'Папка',
+ 'folder' => 'Тека',
'main' => 'Головна',
'fields' => 'Поля',
'details' => 'Деталі',
@@ -429,12 +429,12 @@
'users' => 'Користувачі',
'folders' => 'Теки',
'find_message' => 'об'єктів знайдено',
- 'auto_update_server_password_info' => 'Clicking start will automatically perform these steps:
Connect through SSH to server using login credentials and field `URL`,
Change user password on server
Save the new password in Teampass
Close SSH connection
Please ensure that user has rights to log in and change password on the server (if not, indicate the root login and password) before starting.',
- 'share' => 'Поділитися цим об'єктом',
+ 'auto_update_server_password_info' => 'Наступні кроки будуть виконані автоматично:
Підключення через SSH до сервера, використовуючи облікові дані для входу та поле `URL`,
Зміна пароля користувача на сервері
Збереження нового пароля в Teampass
Закриття SSH-з'єднання
Будь ласка, переконайтеся, що користувач має права на вхід і зміну пароля на сервері (якщо ні, вкажіть логін і пароль root) перед початком.',
+ 'share' => 'Поділитися',
'notify' => 'Повідомити',
'error_no_selected_folder' => 'Необхідно вибрати теку',
'email_subject_item_updated' => '[Teampass] Один елемент, за яким ви стежите, оновлено',
- 'email_body_item_updated' => 'Привіт,
Це згенерований лист від менеджера паролів Teampass.
Ви просили сповіщати вас про зміни, виконані в елементі `#мітка_елемента#` в папці `#назва_папки#`.
Користувач #ім'я# #прізвище# зробив принаймні одну зміну.
Ви можете відкрити його, натиснувши наступне ПОСИЛАННЯ.
Всього найкращого',
+ 'email_body_item_updated' => 'Привіт,
Це згенерований лист від менеджера паролів Teampass.
Ви просили сповіщати вас про зміни, виконані в елементі `#мітка_елемента#` в теці `#назва_теки#`.
Користувач #ім'я# #прізвище# зробив принаймні одну зміну.
Ви можете відкрити його, натиснувши наступне ПОСИЛАННЯ.
Всього найкращого',
'import_kp_finished' => 'Імпорт за допомогою файлу KeePass завершено! Необхідну складність пароля для нових папок встановлено на Середню.',
'password_is_empty' => 'Елемент не має пароля',
'bug_report_to_github' => 'Заповніть вміст звіту, потім скопіюйте його в буфер обміну та вставте на сторінку нової проблеми Github',
@@ -484,9 +484,9 @@
'error_no_email' => 'У цього користувача не вказано електронну пошту!',
'error_no_user' => 'Користувач не знайдений!',
'email_ga_subject' => 'Ваш Google Authenticator флеш код для Teampass',
- 'email_ga_text' => 'Вітаю, перейдіть за цим посиланням і зіскануйте QR-код за допомогою застосунка Google Authenticator. Це потрібно для налаштування вашого флеш-коду',
+ 'email_ga_text' => 'Привіт,
Це згенерований електронний лист від менеджера паролів Teampass.
Ваш адміністратор очікує, що ви будете використовувати двофакторну аутентифікацію для підключення до Teampass. Для вашого першого підключення до Teampass з використанням двофакторної аутентифікації, будь ласка, використовуйте код, який ви знайдете нижче в полі "Ідентифікаційний код":
Після цього у вас буде можливість налаштувати ваші одноразові облікові дані для менеджера паролів Teampass.
З найкращими побажаннями',
'settings_attachments_encryption' => 'Ввімкнути шифрування для вкладень',
- 'settings_attachments_encryption_tip' => 'ЦЕ НАЛАШТУВАННЯ МОЖЕ ПОШКОДИТИ ІСНУЮЧІ ВКЛАДЕННЯ',
+ 'settings_attachments_encryption_tip' => 'Якщо ввімкнено, вкладення елементів шифруються на сервері за допомогою системного ключа соль. Шифрування потребує більше ресурсів сервера. -- Попередження! -- Зміна цієї опції може призвести до пошкодження існуючих вкладених файлів! Після зміни цього налаштування необхідно запустити завдання для шифрування або дешифрування існуючих вкладених файлів.',
'admin_action_attachments_cryption' => 'Зашифрувати або розшифрувати всі вкладення',
'admin_action_attachments_cryption_tip' => 'Застереження: шифруйте або розшифровуйте файли лише після зміни налаштувань шифрування вкладень. Виберіть, чи потрібно зашифрувати чи розшифрувати, а потім натисніть «Пуск». Перед запуском цієї функції створіть резервну копію теки завантаження.',
'encrypt' => 'Зашифрувати',
@@ -568,15 +568,15 @@
'email_bodyalt_item_updated' => 'Пароль для',
'admin_email_send_backlog_tip' => 'Повторно надіслати будь-які відкладені вихідні листи, що очікують у базі даних.',
'please_wait' => 'Будь ласка, зачекайте',
- 'admin_path_to_files_folder' => 'Папка файлів (повний шлях)',
- 'admin_path_to_files_folder_tip' => 'Папка файлів використовується для зберігання як системних файлів, так і деяких завантажених файлів. Для найвищої безпеки вона не повинна знаходитися у папці www вашого сайту - вона повинна бути створена у папці за межами каталогу вашого вебсайту та доступна через правило перенаправлення або переписування.',
- 'admin_path_to_upload_folder_tip' => 'Вкладення файлів зберігаються у папці завантажень з випадковими іменами. Вміст цієї папки ніколи не повинен видалятися вручну. Для найвищої безпеки вона не повинна знаходитися у папці www вашого сайту - вона повинна бути створена у папці за межами каталогу вашого вебсайту та доступна через правило перенаправлення або переписування.',
+ 'admin_path_to_files_folder' => 'Тека файлів (повний шлях)',
+ 'admin_path_to_files_folder_tip' => 'Тека файлів використовується для зберігання як системних файлів, так і деяких завантажених файлів. Для найвищої безпеки вона не повинна знаходитися у папці www вашого сайту - вона повинна бути створена у теці за межами каталогу вашого вебсайту та доступна через правило перенаправлення або переписування.',
+ 'admin_path_to_upload_folder_tip' => 'Вкладення файлів зберігаються у папці завантажень з випадковими іменами. Вміст цієї теці ніколи не повинен видалятися вручну. Для найвищої безпеки вона не повинна знаходитися у папці www вашого сайту - вона повинна бути створена у папці за межами каталогу вашого вебсайту та доступна через правило перенаправлення або переписування.',
'pdf_password_warning' => 'Ви повинні надати ключ шифрування!',
'admin_pwd_maximum_length' => 'Максимальна довжина пароля',
'admin_pwd_maximum_length_tip' => 'Максимальна довжина пароля за замовчуванням становить 40 символів. Збільшення розміру дозволених паролів займе більше часу при шифруванні, дешифруванні та відображенні паролів.',
'settings_insert_manual_entry_item_history' => 'Дозволені ручні вставки в історію елементів',
'settings_insert_manual_entry_item_history_tip' => 'Зазвичай ви захочете залишити це вимкненим. Коли увімкнено, історія елемента пароля може бути відредагована або змінена.',
- 'admin_path_to_upload_folder' => 'Папка завантажень (повний шлях)',
+ 'admin_path_to_upload_folder' => 'Тека завантажень (повний шлях)',
'admin_setting_enable_delete_after_consultation' => 'Паролі можуть закінчитися після обмеженої кількості переглядів',
'admin_setting_enable_delete_after_consultation_tip' => 'Коли увімкнено, творці елементів можуть вирішити, чи буде елемент пароля автоматично видалено після обмеженої кількості переглядів.',
'at_email' => 'електронна адреса',
@@ -584,7 +584,7 @@
'share_sent_ok' => 'Лист надіслано',
'see_item_title' => 'Деталі елемента',
'email_on_open_notification_subject' => 'Сповіщення про перегляд елемента пароля',
- 'email_on_open_notification_mail' => 'Hello,
This is a generated email from Teampass passwords manager.
#tp_user# has opened and viewed the password item '#tp_item#'. Click this link to access the item.',
+ 'email_on_open_notification_mail' => 'Привіт,
Це згенерований електронний лист від менеджера паролів Teampass.
#tp_user# відкрив та переглянув елемент пароля '#tp_item#'. Натисніть це посилання, щоб отримати доступ до елементу.',
'pdf' => 'PDF',
'email_subject_new_user' => 'Обліковий запис для управління паролями створено для вас',
'email_new_user_mail' => 'Привіт,
Це автоматично згенерований лист від менеджера паролів Teampass.
Адміністратор створив для вас обліковий запис у менеджері паролів. Безпечні паролі для вашої організації лише за один клік!
Використовуйте ці облікові дані для першого входу: - Логін: #tp_login# - Пароль: #tp_pw#
Натисніть це посилання, щоб увійти та змінити свій пароль.',
@@ -609,7 +609,7 @@
'admin' => 'Адміністрування',
'admin_action_db_backup' => 'Резервне копіювання бази даних',
'admin_action_db_clean_items' => 'Видалити сирітські елементи з бази даних',
- 'admin_action_db_clean_items_tip' => 'Видаляє будь-які елементи або інші записи, що залишилися після видалення папки. Будь ласка, зробіть резервну копію перед виконанням цього завдання.',
+ 'admin_action_db_clean_items_tip' => 'Видаляє будь-які елементи або інші записи, що залишилися після видалення теки. Будь ласка, зробіть резервну копію перед виконанням цього завдання.',
'admin_action_db_optimize' => 'Оптимізувати базу даних',
'admin_action_db_restore' => 'Відновити базу даних',
'admin_action_purge_old_files' => 'Очистити тимчасові файли',
@@ -633,7 +633,7 @@
'all' => 'всі',
'anyone_can_modify' => 'Дозволити цей елемент змінювати будь-кому, хто має до нього доступ',
'at' => 'в',
- 'at_category' => 'Папка',
+ 'at_category' => 'Тека',
'at_copy' => 'Копіювання виконано',
'at_delete' => 'Видалення',
'at_description' => 'Опис',
@@ -645,11 +645,11 @@
'at_shown' => 'Доступ',
'at_url' => 'URL',
'author' => 'Автор',
- 'authorized_groups' => 'Дозволені папки',
+ 'authorized_groups' => 'Дозволені теки',
'auth_creation_without_complexity' => 'Дозволити створення елементів без необхідної складності пароля',
'auth_modification_without_complexity' => 'Дозволити зміну елементів без необхідної складності пароля',
'cancel' => 'Скасувати',
- 'can_create_root_folder' => 'Може створювати папку на кореневому рівні',
+ 'can_create_root_folder' => 'Може створювати теку на кореневому рівні',
'changelog' => 'Останні оновлення програмного забезпечення',
'close' => 'Закрити',
'complexity' => 'Мінімальна складність пароля',
@@ -675,17 +675,17 @@
'description' => 'Опис',
'disconnect' => 'Вийти',
'done' => 'Готово',
- 'duplicate_folder' => 'Папки можуть мати однакові імена',
+ 'duplicate_folder' => 'Теки можуть мати однакові імена',
'duplicate_item' => 'Елементи можуть мати однакові імена',
'email' => 'Електронна пошта',
'email_subject' => 'Створено новий елемент пароля в менеджері паролів',
'enable_favourites' => 'Функція закладок обраного увімкнена',
- 'enable_personal_folder' => 'Персональні папки з приватним зберіганням паролів',
- 'enable_personal_folder_feature' => 'Персональні папки з приватним зберіганням паролів',
- 'enable_user_can_create_folders' => 'Підпапки, керовані будь-ким, хто може керувати батьківською папкою',
+ 'enable_personal_folder' => 'Персональні теки з приватним зберіганням паролів',
+ 'enable_personal_folder_feature' => 'Персональні теки з приватним зберіганням паролів',
+ 'enable_user_can_create_folders' => 'Підтеки, керовані будь-ким, хто може керувати батьківською текою',
'encrypt_key' => 'Ключ шифрування',
'errors' => 'помилки',
- 'error_group_exist' => 'Ця папка вже існує!',
+ 'error_group_exist' => 'Ця тека вже існує!',
'error_html_codes' => 'Деякий текст містить HTML-коди! Це не дозволено.',
'error_item_exists' => 'Цей елемент вже існує!',
'error_label' => 'Мітка обов'язкова!',
@@ -695,13 +695,13 @@
'error_user_exists' => 'Користувач вже існує',
'expiration_date' => 'Дата закінчення терміну дії',
'find' => 'Пошук',
- 'forbidden_groups' => 'Заборонені папки',
+ 'forbidden_groups' => 'Заборонені теки',
'forgot_my_pw_email_sent' => 'Лист надіслано',
'functions' => 'Ролі',
'gestionnaire' => 'Менеджер',
'god' => 'Адміністратор',
- 'group' => 'Папка',
- 'group_parent' => 'Батьківська папка',
+ 'group' => 'Тека',
+ 'group_parent' => 'Батьківська тека',
'group_pw_duration' => 'Період оновлення',
'group_pw_duration_tip' => 'У місяцях. Використовуйте 0 для відключення.',
'history' => 'Історія',
@@ -709,7 +709,7 @@
'home_personal_saltkey_label' => 'Введіть ваш особистий ключ солі',
'import_error_no_read_possible' => 'Неможливо прочитати файл!',
'import_error_no_read_possible_kp' => 'Неможливо прочитати файл! Це має бути файл KeePass.',
- 'import_keepass_to_folder' => 'Виберіть папку призначення',
+ 'import_keepass_to_folder' => 'Виберіть теку призначення',
'index_add_one_hour' => 'Продовжити сесію на 1 годину',
'index_change_pw_confirmation' => 'Підтвердити',
'index_expiration_in' => 'закінчення сесії через',
@@ -780,7 +780,7 @@
'settings_maintenance_mode' => 'Увімкнути режим обслуговування (відключити вхід користувачів)',
'settings_manager_edit' => 'Менеджери можуть редагувати або видаляти будь-які елементи, які вони можуть переглядати',
'settings_printing' => 'Експорт у PDF або CSV увімкнено',
- 'settings_printing_tip' => 'Додає опцію експорту в меню дерева елементів, дозволяючи експортувати цілі папки у PDF або CSV. Паролі у CSV будуть експортовані без шифрування, тоді як файли PDF можуть бути захищені паролем.',
+ 'settings_printing_tip' => 'Додає опцію експорту в меню дерева елементів, дозволяючи експортувати цілі теки у PDF або CSV. Паролі у CSV будуть експортовані без шифрування, тоді як файли PDF можуть бути захищені паролем.',
'settings_restricted_to' => 'Увімкнути функцію обмежено для на елементах',
'settings_show_description' => 'Показувати поле опису елемента у списках елементів',
'size' => 'Розмір',
@@ -800,10 +800,10 @@
'settings_api_key' => 'Ключ',
'settings_api_add_ip' => 'Нова IP-адреса',
'settings_api_ip' => 'IP-адреса',
- 'subfolder_rights_as_parent' => 'Нові підпапки успадковують дозволи від батьківської папки',
- 'subfolder_rights_as_parent_tip' => 'Якщо увімкнено, кожна нова підпапка успадковує ролі та дозволи батьківської папки. В іншому випадку дозвіл на папку призначається на основі ролі користувача, який її створює.',
- 'show_only_accessible_folders_tip' => 'За замовчуванням користувачі бачать повне дерево папок елементів паролів, навіть якщо деякі папки недоступні для користувача. Ви можете видалити недоступні папки з перегляду, щоб спростити навігацію.',
- 'show_only_accessible_folders' => 'Приховати недоступні папки паролів',
+ 'subfolder_rights_as_parent' => 'Нові підтеки успадковують дозволи від батьківської теки',
+ 'subfolder_rights_as_parent_tip' => 'Якщо увімкнено, кожна нова підтека успадковує ролі та дозволи батьківської теки. В іншому випадку дозвіл на теку призначається на основі ролі користувача, який її створює.',
+ 'show_only_accessible_folders_tip' => 'За замовчуванням користувачі бачать повне дерево папок елементів паролів, навіть якщо деякі теки недоступні для користувача. Ви можете видалити недоступні теки з перегляду, щоб спростити навігацію.',
+ 'show_only_accessible_folders' => 'Приховати недоступні теки паролів',
'comment' => 'Коментар',
'suggestion_menu' => 'Пропозиції',
'settings_suggestion' => 'Функція пропозицій паролів увімкнена',
@@ -821,10 +821,10 @@
'write' => 'Запис',
'read' => 'Читання',
'no_access' => 'Немає доступу',
- 'right_types_label' => 'Виберіть тип доступу до цієї папки для вибраної групи користувачів',
+ 'right_types_label' => 'Виберіть тип доступу до цієї теки для вибраної групи користувачів',
'duplicate_item_in_folder' => 'Елементи в одній папці можуть мати схожі назви',
'settings_roles_allowed_to_print' => 'Експорт дозволено для цих ролей (мультивибір)',
- 'settings_roles_allowed_to_print_tip' => 'Виберіть кілька ролей, утримуючи CTRL під час вибору. Члени цих ролей зможуть експортувати папки у CSV або PDF, якщо експорт також увімкнено глобально.',
+ 'settings_roles_allowed_to_print_tip' => 'Виберіть кілька ролей, утримуючи CTRL під час вибору. Члени цих ролей зможуть експортувати теки у CSV або PDF, якщо експорт також увімкнено глобально.',
'admin_email_security' => 'Тип безпеки SMTP',
'alert_page_will_reload' => 'Сторінка зараз буде перезавантажена',
'file_protection_password' => 'Визначити пароль для файлу',
@@ -858,9 +858,9 @@
'searching' => 'Пошук ...',
'list_items_with_tag' => 'Перелічити елементи з цим тегом',
'no_item_to_display' => 'Немає елементів для відображення',
- 'opening_folder' => 'Читання папки ...',
+ 'opening_folder' => 'Читання теки ...',
'suggestion_notify_subject' => 'Подано нову пропозицію елемента пароля',
- 'suggestion_notify_body' => 'Користувач подав пропозицію елемента пароля до менеджера паролів. Ви повинні прийняти подання, перш ніж його зможуть використовувати інші користувачі. Інформація: - Мітка: #tp_label# - Папка: #tp_folder# - Користувач: #tp_user#
Цей лист надіслано всім менеджерам.',
+ 'suggestion_notify_body' => 'Користувач подав пропозицію елемента пароля до менеджера паролів. Ви повинні прийняти подання, перш ніж його зможуть використовувати інші користувачі. Інформація: - Мітка: #tp_label# - Тека: #tp_folder# - Користувач: #tp_user#
Цей лист надіслано всім менеджерам.',
'error_unknown' => 'Сталася несподівана помилка!',
'no_edit' => 'Запис без редагування',
'role_cannot_edit_item' => 'Не можна редагувати елементи',
@@ -895,17 +895,17 @@
'settings_ldap_object_class_tip' => 'Клас LDAP для пошуку, наприклад, обліковий запис користувача або обліковий запис POSIX',
'rebuild_config_file' => 'Перебудувати конфігураційний файл',
'rebuild_config_file_tip' => 'Конфігураційний файл містить системні змінні і використовується, коли ці налаштування потрібні до встановлення з'єднання з базою даних. Перебудова конфігураційного файлу зберігає значення бази даних у файл і може бути виконана в будь-який час. Місце за замовчуванням - ./includes/config/tp.config.php, але файл повинен знаходитися поза каталогом www для безпеки.',
- 'error_folder_complexity_lower_than_top_folder' => 'Підпапки повинні мати силу пароля, встановлену на тому ж рівні або вище, ніж у батьківської папки',
+ 'error_folder_complexity_lower_than_top_folder' => 'Підтеки повинні мати силу пароля, встановлену на тому ж рівні або вище, ніж у батьківської теки',
'new_item_email_body' => 'Привіт,
Це згенерований лист від менеджера паролів Teampass.
Новий елемент '#label' був створений у Teampass. Ви можете отримати до нього доступ, натиснувши на це ПОСИЛАННЯ.
З повагою.',
'failed_logins' => 'Невдалі спроби входу',
- 'error_only_numbers_in_folder_name' => 'Назва папки не може бути лише числом. Будь ласка, дайте вашій папці ім'я, яке містить літери.',
+ 'error_only_numbers_in_folder_name' => 'Назва теки не може бути лише числом. Будь ласка, дайте вашій папці ім'я, яке містить літери.',
'encrypted_data' => 'Дані зашифровані в базі даних',
'settings_ldap_port' => 'Порт LDAP',
'user_profile_agses_card_id' => 'Ваш ідентифікатор картки Agses',
'ga_flash_qr_and_login' => 'Скануйте цей QR-код за допомогою мобільного пристрою, введіть код двофакторної автентифікації та натисніть кнопку `Enter`.',
'i_need_to_generate_new_ga_code' => 'Мені потрібен новий QR-код. Будь ласка, надішліть мені тимчасовий ідентифікаційний код електронною поштою.',
'settings_manager_move_item' => 'Менеджери можуть переміщувати будь-які елементи, які вони можуть переглядати',
- 'user_folders_rights' => 'Видимі папки',
+ 'user_folders_rights' => 'Видимі теки',
'create_item_without_password' => 'Дозволити створення елемента без визначеного пароля',
'share_rights_info' => 'Це діалогове вікно дозволяє вам поділитися правами одного користувача з вибраними користувачами. Зверніть увагу, що вибрані користувачі матимуть свої існуючі права скинуті та замінені точно такими ж правами, як у вихідного користувача.',
'share_rights_source' => 'Вихідний користувач',
@@ -924,14 +924,14 @@
'error_source_and_destination_are_equal' => 'Джерело та призначення не можуть бути однаковими!',
'sending_anonymous_statistics' => 'Надсилання анонімної статистики',
'favourites_option_enabled' => 'Опція "Вибране" увімкнена',
- 'personalfolders_option_enabled' => 'Опція "Особисті папки" увімкнена',
+ 'personalfolders_option_enabled' => 'Опція "Особисті теки" увімкнена',
'country_statistics' => 'Використання на карті світу',
'country' => 'Країна',
'users_statistics' => 'Середня кількість користувачів на інстанцію',
'items_all' => 'Усі елементи',
- 'folders_all' => 'Усі папки',
+ 'folders_all' => 'Усі теки',
'items_shared' => 'Усі спільні елементи (не включаючи особисті)',
- 'folders_shared' => 'Усі спільні папки (не включаючи особисті)',
+ 'folders_shared' => 'Усі спільні теки (не включаючи особисті)',
'items_statistics' => 'Середня кількість елементів на інстанцію',
'folders_statistics' => 'Середня кількість папок на інстанцію',
'administrators_number' => 'Кількість користувачів-адміністраторів',
@@ -1045,13 +1045,13 @@
'upgrade_requested' => 'База даних Teampass не оновлена.',
'upgrade_requested_more' => 'Виявлено деякі невідповідності між файлами та конфігурацією. Ваш адміністратор повинен виконати процес оновлення перед тим, як ви продовжите.',
'settings_ldap_group_object_filter' => 'Фільтр об'єктів групи LDAP',
- 'settings_ldap_group_object_filter_tip' => ''Фільтр LDAP для використання для пошуку об'єкта групи. Наприклад: (objectClass=group1)(objectClass=group2)'',
+ 'settings_ldap_group_object_filter_tip' => 'Фільтр LDAP для використання для пошуку об'єкта групи. Наприклад: (objectClass=group1)(objectClass=group2)',
'settings_ad_users_with_ad_groups' => 'Ролі користувачів AD, зіставлені з їхніми групами AD',
'settings_ad_users_with_ad_groups_tip' => 'Дозволяє зіставити ролі користувачів AD з їхніми групами AD. Ці ролі будуть додані до тих, що визначені в їхньому профілі.',
'settings_ad_user_auto_creation' => 'Автоматичне створення користувача AD',
'settings_ad_user_auto_creation_tip' => 'Дозволяє автоматично створити користувача AD у Teampass, коли він вперше входить у систему. Зверніть увагу, що якщо увімкнено опцію зіставлення ролей користувачів AD з їхніми групами AD, то він отримає ролі, зіставлені з його групами AD.',
'settings_ldap_guid_attibute' => 'Атрибут GUID LDAP',
- 'settings_ldap_guid_attibute_tip' => ''Атрибут LDAP для використання для ідентифікації GUID об'єкта. Наприклад: objectGUID, objectSid, GUID, gidNumber, ...'',
+ 'settings_ldap_guid_attibute_tip' => 'Атрибут LDAP для використання для ідентифікації GUID об'єкта. Наприклад: objectGUID, objectSid, GUID, gidNumber, ...',
'ad_group' => 'AD група',
'mapped_with_role' => 'Відповідає ролі',
'ad_groupe_and_roles_mapping' => 'Відповідність AD групи та ролей',
@@ -1084,7 +1084,7 @@
'error_data_not_valid' => 'Дані недійсні',
'mfa_enabled' => 'MFA увімкнено',
'mfa_disabled_for_user' => 'MFA відключено для користувача',
- 'users_personal_folder' => 'Особиста папка користувачів',
+ 'users_personal_folder' => 'Особиста тека користувачів',
'maintenance_operations' => 'Операції з обслуговування',
'maintenance_operations_tip' => 'Вибрані операції з обслуговування бази даних Teampass.',
'purge_temporary_files' => 'Очищення тимчасових файлів',
@@ -1167,12 +1167,12 @@
'tasks_log_table_size' => 'Розмір таблиці журналу завдань',
'error_otp_secret' => 'Неможливо декодувати секрет OTP, чи правильний секрет?',
'users_api_access_info' => 'Користувачі можуть отримати доступ до API з тими ж правами доступу, що й у Teampass.',
- 'error_folder_not_allowed_for_this_user' => 'Папка не дозволена для цього користувача',
+ 'error_folder_not_allowed_for_this_user' => 'Тека не дозволена для цього користувача',
'allowed_to_create' => 'Дозволено створювати',
'allowed_to_read' => 'Дозволено читати',
'allowed_to_update' => 'Дозволено оновлювати',
'allowed_to_delete' => 'Дозволено видаляти',
- 'folder_created' => 'Папка створена',
+ 'folder_created' => 'Тека створена',
'login_with_sso' => 'Вхід за допомогою SSO',
'server_connected_to_internet' => 'Сервер підключений до інтернету',
'server_not_connected_to_internet' => 'Сервер не підключений до інтернету',
@@ -1203,17 +1203,20 @@
'number_users_build_cache_tree' => 'Кількість користувачів для обробки завдання build_cache_tree під час кожного запуску планувальника.',
'number_users_build_cache_tree_tip' => 'Порада щодо кількості користувачів для обробки завдання build_cache_tree під час кожного запуску планувальника.',
'user_password_expired' => 'Термін дії вашого пароля закінчився. Будь ласка, змініть його.',
- 'user_password_policy_tip' => 'Th
-e new password must: - Be different from the previous one - Contain at least 10 characters - Contain at least one uppercase letter and one lowercase letter - Contain at least one number or special character - Not contain your name, first name, username, or email.',
- 'bruteforce_unlock_at' => 'Account unlocked at (anti bruteforce): ',
- 'bruteforce_reset_account' => 'Reset anti bruteforce of user',
- 'bruteforce_reset_mail_subject' => 'TEAMPASS - Your account is disabled',
- 'bruteforce_reset_mail_body' => 'Hello #name#,
Your teampass account has been locked due to a large number of authentication failures.
You can unblock it by clicking on this link #reset_url#
Automatic unlock: #unlock_at#',
- 'disable_user_edit_profile' => 'Users can no longer edit their profile',
- 'disable_user_edit_language' => 'Users can no longer change language',
- 'disable_user_edit_timezone' => 'Users can no longer change time zones',
- 'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
- 'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
- 'disable_drag_drop' => 'Disable item drag and drop',
+ 'user_password_policy_tip' => 'Новий пароль має відповідати таким вимогам: - Відрізнятися від попереднього - Містити принаймні 10 символів - Містити принаймні одну велику літеру та одну маленьку літеру - Містити принаймні одну цифру або спеціальний символ - Не містити ваше ім'я, прізвище, ім'я користувача чи електронну пошту.',
+ 'bruteforce_unlock_at' => 'Рахунок розблоковано (анти-брутфорс): ',
+ 'bruteforce_reset_account' => 'Скидання анти-брутфорсу для користувача',
+ 'bruteforce_reset_mail_subject' => 'TEAMPASS - Ваш обліковий запис відключено',
+ 'bruteforce_reset_mail_body' => 'Привіт, #name#,
Ваш обліковий запис teampass було заблоковано через велику кількість невдалих спроб аутентифікації.
Ви можете розблокувати його, натиснувши на це посилання #reset_url#
Автоматичне розблокування: #unlock_at#',
+ 'disable_user_edit_profile' => 'Користувачі більше не можуть редагувати свій профіль',
+ 'disable_user_edit_language' => 'Користувачі більше не можуть змінювати мову',
+ 'disable_user_edit_timezone' => 'Користувачі більше не можуть змінювати часові зони',
+ 'disable_user_edit_tree_load_strategy' => 'Користувачі більше не можуть змінювати стратегію завантаження дерева',
+ 'bruteforce_wait' => 'Забагато невдалих спроб, ваш обліковий запис заблоковано до:',
+ 'disable_drag_drop' => 'Вимкнути перетягування елементів',
+ 'clipboard_cleared' => 'Буфер обміну очищено',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/language/vietnamese.php b/includes/language/vietnamese.php
index 5737ce001..29ab64fa2 100755
--- a/includes/language/vietnamese.php
+++ b/includes/language/vietnamese.php
@@ -1215,5 +1215,9 @@
'disable_user_edit_tree_load_strategy' => 'Users can no longer change tree loading strategy',
'bruteforce_wait' => 'Too many failed attempts, your account is blocked until: ',
'disable_drag_drop' => 'Disable item drag and drop',
+ 'clipboard_cleared' => 'Clipboard cleared',
+ 'error_data_not_consistent' => 'Data is not consistent',
+ 'error_permission_denied' => 'Permission denied',
+ 'error_invalid_action' => 'Invalid action',
);
diff --git a/includes/libraries/teampassclasses/nestedtree/src/NestedTree.php b/includes/libraries/teampassclasses/nestedtree/src/NestedTree.php
index de06291e1..04b8be83d 100755
--- a/includes/libraries/teampassclasses/nestedtree/src/NestedTree.php
+++ b/includes/libraries/teampassclasses/nestedtree/src/NestedTree.php
@@ -196,15 +196,16 @@ public function getDescendants($folder_id = 0, $includeSelf = false, $childrenOn
* Gives the same results as $this->getDescendants(10, true, false, true);
* Without any sql call (useful in loops on very big teampass instances).
*
- * @param int $treeAray $this->getDescendants() array
- * @param bool $parentId ID of the parent node.
+ * @param array $treeArray The tree array
+ * @param int $parentId ID of the parent node.
+ * @param bool $parentId ID of the parent node.
*
* @return array The children of the passed node
*/
- public function getDescendantsFromTreeArray(&$treeAray, $parentId, $firstIteration = true) {
+ public function getDescendantsFromTreeArray(array &$treeArray, int $parentId, bool $firstIteration = true) {
$descendants = $firstIteration ? [$parentId] : [];
- foreach ($treeAray as $key => $object) {
+ foreach ($treeArray as $key => $object) {
// If the object's parent_id matches parentId, it is added to the list of descendants
if ($object->parent_id == $parentId) {
// Ajouter l'id du descendant
@@ -212,7 +213,7 @@ public function getDescendantsFromTreeArray(&$treeAray, $parentId, $firstIterati
// If nb_subfolders > 0, recursive call to find the descendants of this element
if ($object->nb_subfolders > 0) {
- $descendants = array_merge($descendants, $this->getDescendantsFromTreeArray($treeAray, $object->id, false));
+ $descendants = array_merge($descendants, $this->getDescendantsFromTreeArray($treeArray, $object->id, false));
}
}
}
diff --git a/pages/items.js.php b/pages/items.js.php
index 59b88cf8a..c052377f9 100755
--- a/pages/items.js.php
+++ b/pages/items.js.php
@@ -6391,17 +6391,21 @@ function(teampassItem) {
secure_pwd = true;
}
+ data = {
+ size: $('#pwd-definition-size').val() ?? 20,
+ lowercase: $('#pwd-definition-lcl').prop("checked"),
+ numerals: $('#pwd-definition-numeric').prop("checked"),
+ capitalize: $('#pwd-definition-ucl').prop("checked"),
+ symbols: $('#pwd-definition-symbols').prop("checked"),
+ secure_pwd: secure_pwd,
+ force: "false",
+ };
+
$.post(
"sources/main.queries.php", {
type: "generate_password",
type_category: 'action_user',
- size: $('#pwd-definition-size').val() ?? 20,
- lowercase: $('#pwd-definition-lcl').prop("checked"),
- numerals: $('#pwd-definition-numeric').prop("checked"),
- capitalize: $('#pwd-definition-ucl').prop("checked"),
- symbols: $('#pwd-definition-symbols').prop("checked"),
- secure_pwd: secure_pwd,
- force: "false",
+ data: prepareExchangedData(JSON.stringify(data), "encode", "get('key'); ?>"),
key: "get('key'); ?>"
},
function(data) {
diff --git a/sources/identify.php b/sources/identify.php
index 21dba18fd..6baedb43d 100755
--- a/sources/identify.php
+++ b/sources/identify.php
@@ -175,7 +175,7 @@ function identifyUser(string $sentData, array $SETTINGS): bool
$session->set('user-duo_data','');
if($duo_data_dec === false) {
// Add failed authentication log
- addFailedAuthentication($username, getClientIpServer());
+ addFailedAuthentication($sentData['login'], getClientIpServer());
echo prepareExchangedData(
[
@@ -418,7 +418,7 @@ function identifyUser(string $sentData, array $SETTINGS): bool
$session->set('pwd_attempts', 0);
// Check if any unsuccessfull login tries exist
- $attemptsInfos = handleLoginAttempts(
+ handleLoginAttempts(
$userInfo['id'],
$userInfo['login'],
$userInfo['last_connexion'],
@@ -2356,123 +2356,168 @@ function shouldUserAuthWithOauth2(
];
}
+/**
+ * Creates or manages an OAuth2 user in Teampass.
+ *
+ * @param array $SETTINGS Global application settings.
+ * @param array $userInfo User information retrieved from the authentication process.
+ * @param string $username The username of the user.
+ * @param string $passwordClear The user's password in plain text.
+ * @param int $userLdapHasBeenCreated Flag indicating if the user was created via LDAP (1 = yes, 0 = no).
+ * @return array Result of the operation, including status, user data, and connection details.
+ */
function createOauth2User(
array $SETTINGS,
array $userInfo,
string $username,
string $passwordClear,
int $userLdapHasBeenCreated
-): array
-{
- // Prepare creating the new oauth2 user in Teampass
- if ((int) $SETTINGS['oauth2_enabled'] === 1
+): array {
+ // Check if a new OAuth2 user should be created
+ if (shouldCreateOauth2User($SETTINGS, $userInfo, $username, $userLdapHasBeenCreated)) {
+ return handleOauth2UserCreation($SETTINGS, $userInfo, $username, $passwordClear);
+ }
+
+ // Check if the user is already existing and authenticated with OAuth2
+ if (isset($userInfo['id']) && !empty($userInfo['id'])) {
+ return handleExistingOauth2User($SETTINGS, $userInfo, $username, $passwordClear);
+ }
+
+ // Default case: User creation or authentication not applicable
+ return [
+ 'error' => false,
+ 'retLDAP' => [],
+ 'ldapConnection' => false,
+ 'userPasswordVerified' => false,
+ ];
+}
+
+/**
+ * Determines if a new OAuth2 user should be created.
+ *
+ * @param array $SETTINGS Application settings.
+ * @param array $userInfo User information.
+ * @param string $username Username of the user.
+ * @param int $userLdapHasBeenCreated Flag indicating if the user was created via LDAP.
+ * @return bool True if the user should be created, false otherwise.
+ */
+function shouldCreateOauth2User(array $SETTINGS, array $userInfo, string $username, int $userLdapHasBeenCreated): bool {
+ return (int) $SETTINGS['oauth2_enabled'] === 1
&& $username !== 'admin'
&& (bool) $userInfo['oauth2_user_to_be_created'] === true
- && $userLdapHasBeenCreated !== 1
- ) {
- $session = SessionManager::getSession();
- $lang = new Language($session->get('user-language') ?? 'english');
-
- // Create Oauth2 user if not exists and tasks enabled
- $ret = externalAdCreateUser(
- $username,
- $passwordClear,
- $userInfo['mail'],
- is_null($userInfo['givenname']) ? (is_null($userInfo['givenName']) ? '' : $userInfo['givenName']) : $userInfo['givenname'],
- is_null($userInfo['surname']) ? '' : $userInfo['surname'],
- 'oauth2',
- is_null($userInfo['groups']) ? [] : $userInfo['groups'],
- $SETTINGS
- );
- $userInfo = $userInfo + $ret;
-
- // prepapre background tasks for item keys generation
- handleUserKeys(
- (int) $userInfo['id'],
- (string) $passwordClear,
- (int) (isset($SETTINGS['maximum_number_of_items_to_treat']) === true ? $SETTINGS['maximum_number_of_items_to_treat'] : NUMBER_ITEMS_IN_BATCH),
- uniqidReal(20),
- true,
- true,
- true,
- false,
- $lang->get('email_body_user_config_2'),
- );
+ && $userLdapHasBeenCreated !== 1;
+}
- // Complete $userInfo
- $userInfo['has_been_created'] = 1;
+/**
+ * Handles the creation of a new OAuth2 user.
+ *
+ * @param array $SETTINGS Application settings.
+ * @param array $userInfo User information.
+ * @param string $username Username of the user.
+ * @param string $passwordClear User's plain text password.
+ * @return array Result of the user creation process.
+ */
+function handleOauth2UserCreation(array $SETTINGS, array &$userInfo, string $username, string $passwordClear): array {
+ $session = SessionManager::getSession();
+ $lang = new Language($session->get('user-language') ?? 'english');
- if (WIP === true) error_log("--- USER CREATED ---");
+ // Create the user via external AD integration
+ $ret = externalAdCreateUser(
+ $username,
+ $passwordClear,
+ $userInfo['mail'],
+ $userInfo['givenname'] ?? $userInfo['givenName'] ?? '',
+ $userInfo['surname'] ?? '',
+ 'oauth2',
+ $userInfo['groups'] ?? [],
+ $SETTINGS
+ );
+ $userInfo += $ret;
- return [
- 'error' => false,
- 'retExternalAD' => $userInfo,
- 'oauth2Connection' => true,
- 'userPasswordVerified' => true,
- ];
-
- } elseif (isset($userInfo['id']) === true && empty($userInfo['id']) === false) {
- // CHeck if user should use oauth2
- $ret = shouldUserAuthWithOauth2(
- $SETTINGS,
- $userInfo,
- $username
- );
- if ($ret['error'] === true) {
- return [
- 'error' => true,
- 'message' => $ret['message'],
- ];
- }
+ // Handle background tasks for generating item keys
+ handleUserKeys(
+ (int) $userInfo['id'],
+ $passwordClear,
+ (int) ($SETTINGS['maximum_number_of_items_to_treat'] ?? NUMBER_ITEMS_IN_BATCH),
+ uniqidReal(20),
+ true,
+ true,
+ true,
+ false,
+ $lang->get('email_body_user_config_2')
+ );
- // login/password attempt on a local account:
- // Return to avoid overwrite of user password that can allow a user
- // to steal a local account.
- if (!$ret['oauth2Connection'] || !$ret['userPasswordVerified']) {
- return [
- 'error' => false,
- 'message' => $ret['message'],
- 'ldapConnection' => false,
- 'userPasswordVerified' => false,
- ];
- }
+ // Mark the user as created
+ $userInfo['has_been_created'] = 1;
- // Oauth2 user already exists and authenticated
- if (WIP === true) error_log("--- USER AUTHENTICATED ---");
- $userInfo['has_been_created'] = 0;
+ if (defined('WIP') && WIP === true) {
+ error_log("--- USER CREATED ---");
+ }
- $passwordManager = new PasswordManager();
+ return [
+ 'error' => false,
+ 'retExternalAD' => $userInfo,
+ 'oauth2Connection' => true,
+ 'userPasswordVerified' => true,
+ ];
+}
- // Update user hash un database if needed
- if (!$passwordManager->verifyPassword($userInfo['pw'], $passwordClear)) {
- DB::update(
- prefixTable('users'),
- [
- 'pw' => $passwordManager->hashPassword($passwordClear),
- ],
- 'id = %i',
- $userInfo['id']
- );
- }
+/**
+ * Handles authentication or updates for an existing OAuth2 user.
+ *
+ * @param array $SETTINGS Application settings.
+ * @param array $userInfo User information.
+ * @param string $username Username of the user.
+ * @param string $passwordClear User's plain text password.
+ * @return array Result of the authentication process.
+ */
+function handleExistingOauth2User(array $SETTINGS, array $userInfo, string $username, string $passwordClear): array {
+ // Check if the user should authenticate with OAuth2
+ $ret = shouldUserAuthWithOauth2($SETTINGS, $userInfo, $username);
+ if ($ret['error'] === true) {
+ return [
+ 'error' => true,
+ 'message' => $ret['message'],
+ ];
+ }
+ // Prevent overwriting local account passwords
+ if (!$ret['oauth2Connection'] || !$ret['userPasswordVerified']) {
return [
'error' => false,
- 'retExternalAD' => $userInfo,
- 'oauth2Connection' => $ret['oauth2Connection'],
- 'userPasswordVerified' => $ret['userPasswordVerified'],
+ 'message' => $ret['message'],
+ 'ldapConnection' => false,
+ 'userPasswordVerified' => false,
];
}
- // return if no admin
+ // OAuth2 user exists and authenticated
+ if (defined('WIP') && WIP === true) {
+ error_log("--- USER AUTHENTICATED ---");
+ }
+ $userInfo['has_been_created'] = 0;
+
+ // Update user password hash if necessary
+ $passwordManager = new PasswordManager();
+ if (!$passwordManager->verifyPassword($userInfo['pw'], $passwordClear)) {
+ DB::update(
+ prefixTable('users'),
+ ['pw' => $passwordManager->hashPassword($passwordClear)],
+ 'id = %i',
+ $userInfo['id']
+ );
+ }
+
return [
'error' => false,
- 'retLDAP' => [],
- 'ldapConnection' => false,
- 'userPasswordVerified' => false,
+ 'retExternalAD' => $userInfo,
+ 'oauth2Connection' => $ret['oauth2Connection'],
+ 'userPasswordVerified' => $ret['userPasswordVerified'],
];
}
+
function identifyDoMFAChecks(
$SETTINGS,
$userInfo,
diff --git a/sources/items.queries.php b/sources/items.queries.php
index 2004078bc..ce47bb474 100755
--- a/sources/items.queries.php
+++ b/sources/items.queries.php
@@ -333,7 +333,7 @@
// is pwd empty?
if (
- empty($post_password) === true
+ empty($post_password)
&& $session->has('user-create_item_without_password') && null !== $session->get('user-create_item_without_password')
&& (int) $session->get('user-create_item_without_password') !== 1
) {
@@ -439,7 +439,7 @@
// if not allowed then warn user
if (($session->has('user-create_item_without_password') && $session->has('user-create_item_without_password') && null !== $session->get('user-create_item_without_password')
&& (int) $session->get('user-create_item_without_password') !== 1) ||
- empty($post_password) === false ||
+ !empty($post_password) ||
(int) $post_folder_is_personal === 1
) {
// NEW ENCRYPTION
@@ -468,7 +468,7 @@
'id_tree' => $inputData['folderId'],
'login' => $post_login,
'inactif' => 0,
- 'restricted_to' => empty($post_restricted_to) === true ?
+ 'restricted_to' => empty($post_restricted_to) ?
'' : (is_array($post_restricted_to) === true ? implode(';', $post_restricted_to) : $post_restricted_to),
'perso' => (isset($post_folder_is_personal) === true && (int) $post_folder_is_personal === 1) ?
1 : 0,
@@ -499,7 +499,7 @@
&& (int) $SETTINGS['item_extra_fields'] === 1
) {
foreach ($post_fields as $field) {
- if (empty($field['value']) === false) {
+ if (!empty($field['value'])) {
// should we encrypt the data
$dataTmp = DB::queryFirstRow(
'SELECT encrypted_data
@@ -566,7 +566,7 @@
isset($SETTINGS['item_creation_templates']) === true
&& (int) $SETTINGS['item_creation_templates'] === 1
&& isset($post_template_id) === true
- && empty($post_template_id) === false
+ && !empty($post_template_id)
) {
DB::queryFirstRow(
'SELECT *
@@ -585,7 +585,7 @@
);
} else {
// Delete if empty
- if (empty($post_template_id) === true) {
+ if (empty($post_template_id)) {
DB::delete(
prefixTable('templates'),
'item_id = %i',
@@ -613,7 +613,7 @@
&& is_null($post_to_be_deleted_after_date) === false
) {
if (
- empty($post_to_be_deleted_after_date) === false
+ !empty($post_to_be_deleted_after_date)
|| $post_to_be_deleted_after_x_views > 0
) {
// Automatic deletion to be added
@@ -638,7 +638,7 @@
&& (int) $SETTINGS['restricted_to'] === 1
) {
foreach ($post_restricted_to as $userRest) {
- if (empty($userRest) === false) {
+ if (!empty($userRest)) {
$dataTmp = DB::queryfirstrow('SELECT login FROM ' . prefixTable('users') . ' WHERE id= %i', $userRest);
if (empty($listOfRestricted)) {
$listOfRestricted = $dataTmp['login'];
@@ -654,9 +654,9 @@
&& $data['restricted_to'] !== $post_restricted_to
&& (int) $SETTINGS['restricted_to'] === 1
) {
- if (empty($data['restricted_to']) === false) {
+ if (!empty($data['restricted_to'])) {
foreach (explode(';', $data['restricted_to']) as $userRest) {
- if (empty($userRest) === false) {
+ if (!empty($userRest)) {
$dataTmp = DB::queryfirstrow(
'SELECT login
FROM ' . prefixTable('users') . '
@@ -664,7 +664,7 @@
$userRest
);
- if (empty($oldRestrictionList) === true) {
+ if (empty($oldRestrictionList)) {
$oldRestrictionList = $dataTmp['login'];
} else {
$oldRestrictionList .= ';' . $dataTmp['login'];
@@ -715,7 +715,7 @@
// Add tags
$tags = explode(' ', $post_tags);
foreach ($tags as $tag) {
- if (empty($tag) === false) {
+ if (!empty($tag)) {
DB::insert(
prefixTable('tags'),
array(
@@ -727,7 +727,7 @@
}
// Check if any files have been added
- if (empty($post_uploaded_file_id) === false) {
+ if (!empty($post_uploaded_file_id)) {
$rows = DB::query(
'SELECT id
FROM ' . prefixTable('files') . '
@@ -764,7 +764,7 @@
}
// Announce by email?
- if (empty($post_diffusion_list) === false) {
+ if (!empty($post_diffusion_list)) {
// get links url
if (empty($SETTINGS['email_server_url'])) {
$SETTINGS['email_server_url'] = $SETTINGS['cpassman_url'];
@@ -781,7 +781,7 @@
if (is_array($post_diffusion_list) === true && count($post_diffusion_list) > 0) {
$cpt = 0;
foreach ($post_diffusion_list as $emailAddress) {
- if (empty($emailAddress) === false) {
+ if (!empty($emailAddress)) {
prepareSendingEmail(
$lang->get('email_subject_item_updated'),
str_replace(
@@ -876,7 +876,11 @@
);
// Error if not expected data
- if (is_array($dataReceived) === false || count($dataReceived) === 0) {
+ if (
+ (!is_array($dataReceived) && !is_string($dataReceived)) || // Must be array or string
+ (is_array($dataReceived) && count($dataReceived) === 0) || // Empty array
+ (is_string($dataReceived) && trim($dataReceived) === '') // Empty string
+ ) {
echo (string) prepareExchangedData(
array(
'error' => true,
@@ -968,7 +972,7 @@
// Check PWD EMPTY
if (
- empty($pw) === true
+ empty($pw)
&& $session->has('user-create_item_without_password') && $session->has('user-create_item_without_password') && null !== $session->get('user-create_item_without_password')
&& (int) $session->get('user-create_item_without_password') !== 1
) {
@@ -1122,7 +1126,7 @@
if (in_array($session->get('user-id'), $restrictedTo) === true) {
$restrictionActive = false;
}
- if (empty($dataItem['restricted_to']) === true) {
+ if (empty($dataItem['restricted_to'])) {
$restrictionActive = false;
}
@@ -1164,7 +1168,7 @@
$session->get('user-id'),
$inputData['itemId']
);
- if (DB::count() === 0 || empty($data['pw']) === true) {
+ if (DB::count() === 0 || empty($data['pw'])) {
// No share key found
$pw = '';
} else {
@@ -1201,9 +1205,14 @@
}
// encrypt PW on if it has changed, or if it is empty
- if ((($session->has('user-create_item_without_password') && $session->has('user-create_item_without_password') && null !== $session->get('user-create_item_without_password')
- && (int) $session->get('user-create_item_without_password') !== 1)
- || empty($post_password) === false)
+ if (
+ (
+ ($session->has('user-create_item_without_password')
+ && null !== $session->get('user-create_item_without_password')
+ && (int) $session->get('user-create_item_without_password') !== 1
+ )
+ || !empty($post_password)
+ )
&& $post_password !== $pw
) {
//-----
@@ -1248,10 +1257,10 @@
// Add new tags
$postArrayTags = [];
- if (empty($post_tags) === false) {
+ if (!empty($post_tags)) {
$postArrayTags = explode(' ', $post_tags);
foreach ($postArrayTags as $tag) {
- if (empty($tag) === false) {
+ if (!empty($tag)) {
// save in DB
DB::insert(
prefixTable('tags'),
@@ -1296,7 +1305,7 @@
'login' => $post_login,
'url' => $post_url,
'id_tree' => $inputData['folderId'],
- 'restricted_to' => empty($post_restricted_to) === true || count($post_restricted_to) === 0 ? '' : implode(';', $post_restricted_to),
+ 'restricted_to' => empty($post_restricted_to) || count($post_restricted_to) === 0 ? '' : implode(';', $post_restricted_to),
'anyone_can_modify' => (int) $post_anyone_can_modify,
'complexity_level' => (int) $post_complexity_level,
'encryption_type' => TP_ENCRYPTION_NAME,
@@ -1312,10 +1321,10 @@
if (
isset($SETTINGS['item_extra_fields']) === true
&& (int) $SETTINGS['item_extra_fields'] === 1
- && empty($post_fields) === false
+ && !empty($post_fields)
) {
foreach ($post_fields as $field) {
- if (empty($field['value']) === false) {
+ if (!empty($field['value'])) {
$dataTmpCat = DB::queryFirstRow(
'SELECT c.id AS id, c.title AS title, i.data AS data, i.data_iv AS data_iv,
i.encryption_type AS encryption_type, c.encrypted_data AS encrypted_data,
@@ -1525,7 +1534,7 @@
} else {
// Case where field new value is empty
// then delete field
- if (empty($field_data[1]) === true) {
+ if (empty($field_data[1])) {
DB::delete(
prefixTable('categories_items'),
'item_id = %i AND field_id = %s',
@@ -1564,7 +1573,7 @@
WHERE item_id = %i',
$inputData['itemId']
);
- if (DB::count() === 0 && empty($post_template_id) === false) {
+ if (DB::count() === 0 && !empty($post_template_id)) {
// store field text
DB::insert(
prefixTable('templates'),
@@ -1575,7 +1584,7 @@
);
} else {
// Delete if empty
- if (empty($post_template_id) === true) {
+ if (empty($post_template_id)) {
DB::delete(
prefixTable('templates'),
'item_id = %i',
@@ -1611,7 +1620,7 @@
if (DB::count() === 0) {
// No automatic deletion for this item
if (
- empty($post_to_be_deleted_after_date) === false
+ !empty($post_to_be_deleted_after_date)
|| (int) $post_to_be_deleted_after_x_views > 0
) {
// Automatic deletion to be added
@@ -1620,9 +1629,9 @@
array(
'item_id' => $inputData['itemId'],
'del_enabled' => 1,
- 'del_type' => empty($post_to_be_deleted_after_x_views) === false ?
+ 'del_type' => !empty($post_to_be_deleted_after_x_views) ?
1 : 2, //1 = numeric : 2 = date
- 'del_value' => empty($post_to_be_deleted_after_x_views) === false ?
+ 'del_value' => !empty($post_to_be_deleted_after_x_views) ?
(int) $post_to_be_deleted_after_x_views : dateToStamp($post_to_be_deleted_after_date, $SETTINGS['date_format']),
)
);
@@ -1647,16 +1656,16 @@
} else {
// Automatic deletion exists for this item
if (
- empty($post_to_be_deleted_after_date) === false
+ !empty($post_to_be_deleted_after_date)
|| (int) $post_to_be_deleted_after_x_views > 0
) {
// Update automatic deletion
DB::update(
prefixTable('automatic_del'),
array(
- 'del_type' => empty($post_to_be_deleted_after_x_views) === false ?
+ 'del_type' => !empty($post_to_be_deleted_after_x_views) ?
1 : 2, //1 = numeric : 2 = date
- 'del_value' => empty($post_to_be_deleted_after_x_views) === false ?
+ 'del_value' => !empty($post_to_be_deleted_after_x_views) ?
$post_to_be_deleted_after_x_views : dateToStamp($post_to_be_deleted_after_date, $SETTINGS['date_format']),
),
'item_id = %i',
@@ -1703,7 +1712,7 @@
&& (int) $SETTINGS['restricted_to'] === 1
) {
foreach ($post_restricted_to as $userId) {
- if (empty($userId) === false) {
+ if (!empty($userId)) {
$dataTmp = DB::queryfirstrow(
'SELECT id, name, lastname
FROM ' . prefixTable('users') . '
@@ -1725,7 +1734,7 @@
}
if ((int) $SETTINGS['restricted_to'] === 1) {
$diffUsersRestiction = array_diff(
- empty($data['restricted_to']) === false ?
+ !empty($data['restricted_to']) ?
explode(';', $data['restricted_to']) : array(),
$arrayOfUsersIdRestriction
);
@@ -1841,7 +1850,7 @@
$session->get('user-login'),
'at_otp_status:' . ((int) $post_otp_is_enabled === 0 ? 'disabled' : 'enabled')
);
- } elseif (DB::count() === 0 && empty($post_otp_secret) === false) {
+ } elseif (DB::count() === 0 && !empty($post_otp_secret)) {
// Create the entry in items_otp table
// OTP doesn't exist then create it
@@ -2051,7 +2060,7 @@
if (count($reason) > 0) {
$sentence = date($SETTINGS['date_format'] . ' ' . $SETTINGS['time_format'], (int) $record['date']) . ' - '
. $record['login'] . ' - ' . $lang->get($record['action']) . ' - '
- . (empty($record['raison']) === false ? (count($reason) > 1 ? $lang->get(trim($reason[0])) . ' : ' . $reason[1]
+ . (!empty($record['raison']) ? (count($reason) > 1 ? $lang->get(trim($reason[0])) . ' : ' . $reason[1]
: $lang->get(trim($reason[0]))) : '');
if (empty($history)) {
$history = $sentence;
@@ -2068,7 +2077,7 @@
if (is_array($post_diffusion_list) === true && count($post_diffusion_list) > 0) {
$cpt = 0;
foreach ($post_diffusion_list as $emailAddress) {
- if (empty($emailAddress) === false) {
+ if (!empty($emailAddress)) {
prepareSendingEmail(
$lang->get('email_subject_item_updated'),
str_replace(
@@ -2189,8 +2198,8 @@
);
if (
- empty($inputData['itemId']) === false
- && empty($post_dest_id) === false
+ !empty($inputData['itemId'])
+ && !empty($post_dest_id)
) {
// load the original record into an array
$originalRecord = DB::queryfirstrow(
@@ -2267,7 +2276,7 @@
$aSet[$key] = $post_new_label;
} elseif ($key === 'viewed_no') {
$aSet['viewed_no'] = '0';
- } elseif ($key === 'pw' && empty($pw) === false) {
+ } elseif ($key === 'pw' && !empty($pw)) {
$aSet['pw'] = $originalRecord['pw'];
$aSet['pw_iv'] = '';
} elseif ($key === 'perso') {
@@ -2394,6 +2403,17 @@
$SETTINGS['path_to_upload_folder'],
decryptUserObjectKey($record['share_key'], $session->get('user-private_key'))
);
+ // Ensure that the file content is a string
+ if (!is_string($fileContent)) {
+ echo prepareExchangedData(
+ array(
+ 'error' => true,
+ 'message' => $lang->get('error_unknown'),
+ ),
+ 'encode'
+ );
+ break;
+ }
// Step2 - create file
// deepcode ignore InsecureHash: md5 is used jonly for file name in order to get a hashed value in database
@@ -2676,7 +2696,7 @@
) {
$restrictionActive = false;
}
- if (empty($dataItem['restricted_to']) === true) {
+ if (empty($dataItem['restricted_to'])) {
$restrictionActive = false;
}
@@ -2702,7 +2722,7 @@
$session->get('user-id'),
$inputData['id']
);
- if (DB::count() === 0 || empty($dataItem['pw']) === true) {
+ if (DB::count() === 0 || empty($dataItem['pw'])) {
// No share key found
$pwIsEmptyNormally = false;
// Is this a personal and defuse password?
@@ -2726,7 +2746,7 @@
$decryptedObject = decryptUserObjectKey($userKey['share_key'], $session->get('user-private_key'));
// if null then we have an error.
// suspecting bad password
- if (empty($decryptedObject) === false) {
+ if (!empty($decryptedObject)) {
$pw = doDataDecryption(
$dataItem['pw'],
$decryptedObject
@@ -2839,9 +2859,9 @@
$arrData['label'] = $dataItem['label'] === '' ? '' : $dataItem['label'];
$arrData['pw_length'] = strlen($pw);
- $arrData['pw_decrypt_info'] = empty($pw) === true && $pwIsEmptyNormal === false ? 'error_no_sharekey_yet' : '';
- $arrData['email'] = empty($dataItem['email']) === true || $dataItem['email'] === null ? '' : $dataItem['email'];
- $arrData['url'] = empty($dataItem['url']) === true ? '' : $dataItem['url'];
+ $arrData['pw_decrypt_info'] = empty($pw) && $pwIsEmptyNormal === false ? 'error_no_sharekey_yet' : '';
+ $arrData['email'] = empty($dataItem['email']) || $dataItem['email'] === null ? '' : $dataItem['email'];
+ $arrData['url'] = empty($dataItem['url']) ? '' : $dataItem['url'];
$arrData['folder'] = $dataItem['id_tree'];
$arrData['description'] = $dataItem['description'];
$arrData['login'] = $dataItem['login'];
@@ -3006,7 +3026,7 @@
WHERE item_id = %i',
$inputData['id']
);
- $arrData['item_ready'] = DB::count() === 0 ? true : (DB::count() > 0 && empty($rows_tmp['finished_at']) === true ? false : true);
+ $arrData['item_ready'] = DB::count() === 0 ? true : (DB::count() > 0 && empty($rows_tmp['finished_at']) ? false : true);
// Manage user restriction
if (null !== $post_restricted) {
@@ -3095,9 +3115,9 @@
$arrData['show_details'] = 0;
// get readable list of restriction
$listOfRestricted = '';
- if (empty($dataItem['restricted_to']) === false) {
+ if (!empty($dataItem['restricted_to'])) {
foreach (explode(';', $dataItem['restricted_to']) as $userRest) {
- if (empty($userRest) === false) {
+ if (!empty($userRest)) {
$dataTmp = DB::queryfirstrow(
'SELECT login
FROM ' . prefixTable('users') . '
@@ -3267,7 +3287,7 @@
// get OTP enabled for item
$returnArray['otp_for_item_enabled'] = (int) $dataItem['otp_for_item_enabled'];
$returnArray['otp_phone_number'] = (string) $dataItem['otp_phone_number'];
- if (empty($dataItem['otp_secret']) === false) {
+ if (!empty($dataItem['otp_secret'])) {
$secret = cryption(
$dataItem['otp_secret'],
'',
@@ -3350,14 +3370,14 @@
$arbo = $tree->getPath($dataItem['id_tree'], true);
$path = '';
foreach ($arbo as $elem) {
- if (empty($path) === true) {
+ if (empty($path)) {
$path = htmlspecialchars(stripslashes(htmlspecialchars_decode($elem->title, ENT_QUOTES)), ENT_QUOTES) . ' ';
} else {
$path .= '→ ' . htmlspecialchars(stripslashes(htmlspecialchars_decode($elem->title, ENT_QUOTES)), ENT_QUOTES);
}
}
// Build text to show user
- if (empty($path) === true) {
+ if (empty($path)) {
$path = addslashes($dataItem['label']);
} else {
$path = addslashes($dataItem['label']) . ' (' . $path . ')';
@@ -3473,11 +3493,10 @@
$inputData = dataSanitizer(
$data,
- $filters,
- $SETTINGS['cpassman_dir']
+ $filters
);
- if (empty($inputData['itemId']) === true && (empty($inputData['itemKey']) === true || is_null($inputData['itemKey']) === true)) {
+ if (empty($inputData['itemId']) && (empty($inputData['itemKey']) || is_null($inputData['itemKey']) === true)) {
echo (string) prepareExchangedData(
array(
'error' => true,
@@ -3509,7 +3528,7 @@
$inputData['itemId'],
$inputData['itemKey']
);
- if (empty($inputData['itemId']) === true) {
+ if (empty($inputData['itemId'])) {
$inputData['itemId'] = $data['id'];
}
$inputData['label'] = $data['label'];
@@ -3610,7 +3629,7 @@
}
// Generate OTP code
- if (empty($secret) === false) {
+ if (!empty($secret)) {
try {
$otp = TOTP::createFromSecret($secret);
$otpCode = $otp->now();
@@ -3695,7 +3714,7 @@
// Check if duplicate folders name are allowed
if (isset($SETTINGS['duplicate_folder']) && $SETTINGS['duplicate_folder'] === '0') {
$data = DB::queryFirstRow('SELECT id, title FROM ' . prefixTable('nested_tree') . ' WHERE title = %s', $title);
- if (empty($data['id']) === false && $dataReceived['folder'] !== $data['id']) {
+ if (!empty($data['id']) && $dataReceived['folder'] !== $data['id']) {
echo '[ { "error" : "' . $lang->get('error_group_exist') . '" } ]';
break;
}
@@ -3813,7 +3832,7 @@
$showError = 0;
$itemsIDList = $rights = $returnedData = $uniqueLoadData = $html_json = array();
// Build query limits
- if (empty($post_start) === true) {
+ if (empty($post_start)) {
$start = 0;
} else {
$start = $post_start;
@@ -3933,7 +3952,7 @@
// check if items exist
$where = new WhereClause('and');
$session__user_list_folders_limited = $session->get('user-list_folders_limited');
- if (null !== $post_restricted && (int) $post_restricted === 1 && empty($session__user_list_folders_limited[$inputData['id']]) === false) {
+ if (null !== $post_restricted && (int) $post_restricted === 1 && !empty($session__user_list_folders_limited[$inputData['id']])) {
$counter = count($session__user_list_folders_limited[$inputData['id']]);
$uniqueLoadData['counter'] = $counter;
// check if this folder is visible
@@ -4078,7 +4097,7 @@
// prepare query WHere conditions
$where = new WhereClause('and');
$session__user_list_folders_limited = $session->get('user-list_folders_limited');
- if (null !== $post_restricted && (int) $post_restricted === 1 && empty($session__user_list_folders_limited[$inputData['id']]) === false) {
+ if (null !== $post_restricted && (int) $post_restricted === 1 && !empty($session__user_list_folders_limited[$inputData['id']])) {
$where->add('i.id IN %ls', $session__user_list_folders_limited[$inputData['id']]);
} else {
$where->add('i.id_tree=%i', $inputData['id']);
@@ -4099,7 +4118,7 @@
. " WHERE action = 'at_modification' AND raison = 'at_pw'
AND id_item=i.id ORDER BY date DESC LIMIT 1)";
$where->add('l.date=%l', $sql_e);
- if (empty($limited_to_items) === false) {
+ if (!empty($limited_to_items)) {
$where->add('i.id IN %ls', explode(',', $limited_to_items));
}
@@ -4152,7 +4171,7 @@
foreach ($rows as $record) {
// exclude all results except the first one returned by query
- if (empty($idManaged) === true || $idManaged !== $record['id']) {
+ if (empty($idManaged) || $idManaged !== $record['id']) {
// Fix a bug on Personal Item creation - field `perso` must be set to `1`
if ((int) $record['perso'] !== 1 && (int) $folder_is_personal === 1) {
DB::update(
@@ -4193,7 +4212,7 @@
}
// Is user in restricted list of users
- if (empty($record['restricted_to']) === false) {
+ if (!empty($record['restricted_to'])) {
if (
in_array($session->get('user-id'), explode(';', $record['restricted_to'])) === true
|| (((int) $session->get('user-manager') === 1 || (int) $session->get('user-can_manage_all_users') === 1)
@@ -4222,7 +4241,7 @@
$html_json[$record['id']]['item_key'] = (string) $record['item_key'];
$html_json[$record['id']]['tree_id'] = (int) $record['tree_id'];
$html_json[$record['id']]['label'] = strip_tags($record['label']);
- if (isset($SETTINGS['show_description']) === true && (int) $SETTINGS['show_description'] === 1 && is_null($record['description']) === false && empty($record['description']) === false) {
+ if (isset($SETTINGS['show_description']) === true && (int) $SETTINGS['show_description'] === 1 && is_null($record['description']) === false && !empty($record['description'])) {
$html_json[$record['id']]['desc'] = mb_substr(preg_replace('#<[^>]+>#', ' ', $record['description']), 0, 200);
} else {
$html_json[$record['id']]['desc'] = '';
@@ -4552,7 +4571,7 @@
*/
case 'get_complixity_level':
// get some info about ITEM
- if (null !== $inputData['itemId'] && empty($inputData['itemId']) === false) {
+ if (null !== $inputData['itemId'] && !empty($inputData['itemId'])) {
// get if existing edition lock
$dataItemEditionLocks = DB::query(
'SELECT timestamp, user_id
@@ -4570,7 +4589,7 @@
$dataLastItemEditionLock = $dataItemEditionLocks[0];
// Calculate the edition grace delay
- if (isset($SETTINGS['delay_item_edition']) && $SETTINGS['delay_item_edition'] > 0 && empty($dataTmp['timestamp']) === false) {
+ if (isset($SETTINGS['delay_item_edition']) && $SETTINGS['delay_item_edition'] > 0 && !empty($dataTmp['timestamp'])) {
$delay = $SETTINGS['delay_item_edition'];
} else {
$delay = EDITION_LOCK_PERIOD; // One day delay
@@ -4677,7 +4696,7 @@
// check if user can perform this action
if (
null !== $inputData['context']
- && empty($inputData['context']) === false
+ && !empty($inputData['context'])
) {
if (
$inputData['context'] === 'create_folder'
@@ -4716,7 +4735,7 @@
$inputData['folderId']
);
- if (isset($data['valeur']) === true && (empty($data['valeur']) === false || $data['valeur'] === '0')) {
+ if (isset($data['valeur']) === true && (!empty($data['valeur']) || $data['valeur'] === '0')) {
$complexity = TP_PW_COMPLEXITY[$data['valeur']][1];
$folder_is_personal = (int) $data['personal_folder'];
@@ -4967,7 +4986,7 @@
break;
}
- if (empty($data['id_item']) === false) {
+ if (!empty($data['id_item'])) {
// Delete from FILES table
DB::delete(
prefixTable('files'),
@@ -5477,7 +5496,7 @@
// loop on items to move
foreach (explode(';', $post_item_ids) as $item_id) {
- if (empty($item_id) === false) {
+ if (!empty($item_id)) {
// get data about item
$dataSource = DB::queryfirstrow(
'SELECT i.pw, f.personal_folder,i.id_tree, f.title,i.label
@@ -5818,7 +5837,7 @@
// loop on items to move
foreach (explode(';', $post_item_ids) as $item_id) {
- if (empty($item_id) === false) {
+ if (!empty($item_id)) {
// get info
$dataSource = DB::queryfirstrow(
'SELECT label, id_tree
@@ -5916,7 +5935,7 @@
$post_content = $request->request->has('name') ? explode(',', $request->request->filter('content', '', FILTER_SANITIZE_FULL_SPECIAL_CHARS)) : '';
// get links url
- if (empty($SETTINGS['email_server_url']) === true) {
+ if (empty($SETTINGS['email_server_url'])) {
$SETTINGS['email_server_url'] = $SETTINGS['cpassman_url'];
}
if ($inputData['cat'] === 'request_access_to_author') {
@@ -5978,7 +5997,7 @@
'#tp_item#',
),
array(
- empty($SETTINGS['email_server_url']) === false ?
+ !empty($SETTINGS['email_server_url']) ?
$SETTINGS['email_server_url'] . '/index.php?page=items&group=' . $dataItem['id_tree'] . '&id=' . $inputData['id'] : $SETTINGS['cpassman_url'] . '/index.php?page=items&group=' . $dataItem['id_tree'] . '&id=' . $inputData['id'],
addslashes($session->get('user-login')),
addslashes($path),
@@ -6150,7 +6169,7 @@
$session->get('user-id'),
$dataReceived['id']
);
- if (DB::count() === 0 || empty($itemQ['pw']) === true) {
+ if (DB::count() === 0 || empty($itemQ['pw'])) {
// No share key found
$pw = '';
} else {
@@ -6257,7 +6276,7 @@
'stamp' => $orignal_link_parameters['stamp'],
];
- if ((int) $dataReceived['shared_globaly'] === 1 && isset($SETTINGS['otv_subdomain']) === true && empty($SETTINGS['otv_subdomain']) === false) {
+ if ((int) $dataReceived['shared_globaly'] === 1 && isset($SETTINGS['otv_subdomain']) === true && !empty($SETTINGS['otv_subdomain'])) {
// Inject subdomain in URL by convering www. to subdomain.
$domain_scheme = parse_url($SETTINGS['cpassman_url'], PHP_URL_SCHEME);
$domain_host = parse_url($SETTINGS['cpassman_url'], PHP_URL_HOST);
@@ -6311,7 +6330,7 @@
);
// Check if user has this sharekey
- if (empty($file_info['share_key']) === true) {
+ if (empty($file_info['share_key'])) {
echo (string) prepareExchangedData(
array(
'error' => true,
@@ -6431,7 +6450,7 @@
} else {
$listRestrictedFoldersForItemsKeys = array();
}
-
+
//Build tree
$tree->rebuild();
$folders = $tree->getDescendants();
@@ -6447,7 +6466,7 @@
$displayThisNode = false;
// Check if any allowed folder is part of the descendants of this node
- $nodeDescendants = $tree->getDescendantsFromTreeArray($folders, $folder->id);
+ $nodeDescendants = $tree->getDescendantsFromTreeArray($folders, (int) $folder->id);
foreach ($nodeDescendants as $node) {
// manage tree counters
if (
@@ -6486,7 +6505,7 @@
}
}
}
- if (empty($arrayFolders) === false) {
+ if (!empty($arrayFolders)) {
// store array to return
$arr_data['folders'] = $arrayFolders;
@@ -6540,7 +6559,7 @@
implode(',', $foldersArray)
);
foreach ($rows as $record) {
- if (empty($record['categories']) === false) {
+ if (!empty($record['categories'])) {
array_push(
$ret,
array($record['id'] => json_decode($record['categories'], true))
@@ -6597,19 +6616,19 @@
'"at_shown","at_password_copied", "at_shown", "at_password_shown"'
);
foreach ($rows as $record) {
- if (empty($record['raison']) === true) {
+ if (empty($record['raison'])) {
$reason[0] = '';
} else {
$reason = array_map('trim', explode(':', $record['raison']));
}
// imported via API
- if (empty($record['login']) === true) {
+ if (empty($record['login'])) {
$record['login'] = $lang->get('imported_via_api') . ' [' . $record['raison'] . ']';
}
// Prepare avatar
- if (isset($record['avatar_thumb']) && empty($record['avatar_thumb']) === false) {
+ if (isset($record['avatar_thumb']) && !empty($record['avatar_thumb'])) {
if (file_exists($SETTINGS['cpassman_dir'] . '/includes/avatars/' . $record['avatar_thumb'])) {
$avatar = $SETTINGS['cpassman_url'] . '/includes/avatars/' . $record['avatar_thumb'];
} else {
@@ -6626,7 +6645,7 @@
$action = $lang->get($reason[0]);
// get previous password
- if (empty($record['old_value']) === false) {
+ if (!empty($record['old_value'])) {
$previous_pwd = cryption(
$record['old_value'],
'',
@@ -6645,7 +6664,7 @@
$action = $lang->get($record['action']);
} elseif ($reason[0] === 'at_description') {
$action = $lang->get('description_has_changed');
- } elseif (empty($record['raison']) === false && $reason[0] !== 'at_creation') {
+ } elseif (!empty($record['raison']) && $reason[0] !== 'at_creation') {
$action = $lang->get($reason[0]);
if ($reason[0] === 'at_moved') {
$tmp = explode(' -> ', $reason[1]);
@@ -6660,7 +6679,7 @@
}
} elseif (in_array($reason[0], array('at_restriction', 'at_email', 'at_login', 'at_label', 'at_url', 'at_tag')) === true) {
$tmp = explode(' => ', $reason[1]);
- $detail = empty(trim($tmp[0])) === true ?
+ $detail = empty(trim($tmp[0])) ?
$lang->get('no_previous_value') : $lang->get('previous_value') . ': ' . $tmp[0] . ' ';
} elseif ($reason[0] === 'at_automatic_del') {
$detail = $lang->get($reason[1]);
@@ -6698,8 +6717,9 @@
}
// order previous passwords by date
- $key_values = array_column($previous_passwords, 'date');
- array_multisort($key_values, /** @scrutinizer ignore-type */SORT_DESC, $previous_passwords);
+ $key_values = array_column($previous_passwords, 'date');
+ $sort_order = SORT_DESC;
+ array_multisort($key_values, $sort_order, $previous_passwords);
// send data
// deepcode ignore ServerLeak: Data is encrypted before being sent
diff --git a/sources/logs.datatables.php b/sources/logs.datatables.php
index 404073212..d250df7da 100755
--- a/sources/logs.datatables.php
+++ b/sources/logs.datatables.php
@@ -119,7 +119,9 @@
}
// Ordering
-$order = strtoupper($params['order'][0]['dir'] ?? null);
+$order = isset($params['order'][0]['dir']) && is_string($params['order'][0]['dir'])
+ ? strtoupper($params['order'][0]['dir'])
+ : '';
$orderDirection = in_array($order, $aSortTypes, true) ? $order : 'DESC';
// Start building the query and output depending on the action
diff --git a/sources/main.functions.php b/sources/main.functions.php
index bfff84977..c4f9780b6 100755
--- a/sources/main.functions.php
+++ b/sources/main.functions.php
@@ -3557,26 +3557,8 @@ function handleUserKeys(
$session = SessionManager::getSession();
$lang = new Language($session->get('user-language') ?? 'english');
- // prepapre background tasks for item keys generation
- $userTP = DB::queryFirstRow(
- 'SELECT pw, public_key, private_key
- FROM ' . prefixTable('users') . '
- WHERE id = %i',
- TP_USER_ID
- );
- if (DB::count() === 0) {
- return prepareExchangedData(
- array(
- 'error' => true,
- 'message' => 'User not exists',
- ),
- 'encode'
- );
- }
-
- // Do we need to generate new user password
+ // Generate new user password if required
if ($generate_user_new_password === true) {
- // Generate a new password
$passwordClear = GenerateCryptKey(20, false, true, true, false, true);
}
@@ -3593,24 +3575,9 @@ function handleUserKeys(
);
}
- // Check if valid public/private keys
+ // Validate public/private keys if provided
if ($recovery_public_key !== '' && $recovery_private_key !== '') {
- try {
- // Generate random string
- $random_str = generateQuickPassword(12, false);
- // Encrypt random string with user publick key
- $encrypted = encryptUserObjectKey($random_str, $recovery_public_key);
- // Decrypt $encrypted with private key
- $decrypted = decryptUserObjectKey($encrypted, $recovery_private_key);
- // Check if decryptUserObjectKey returns our random string
- if ($decrypted !== $random_str) {
- throw new Exception('Public/Private keypair invalid.');
- }
- } catch (Exception $e) {
- // Show error message to user and log event
- if (defined('LOG_TO_SERVER') && LOG_TO_SERVER === true) {
- error_log('ERROR: User '.$userId.' - '.$e->getMessage());
- }
+ if (!validateKeyPair($recovery_public_key, $recovery_private_key)) {
return prepareExchangedData([
'error' => true,
'message' => $lang->get('pw_encryption_error'),
@@ -3621,17 +3588,96 @@ function handleUserKeys(
}
// Generate new keys
- if ($user_self_change === true && empty($recovery_public_key) === false && empty($recovery_private_key) === false){
- $userKeys = [
+ $userKeys = generateNewKeys($passwordClear, $user_self_change, $recovery_public_key, $recovery_private_key);
+
+ // Save new keys and password in DB
+ saveUserKeysInDB($userId, $hashedPassword, $userKeys);
+
+ // Update session if the user is the current user
+ updateSessionKeys($userId, $userKeys);
+
+ // Manage encryption key
+ $encryptionKey = manageEncryptionKey($encryptWithUserPassword, $encryptionKey, $passwordClear);
+
+ // Create background process
+ $processId = createBackgroundProcess($userId, $passwordClear, $encryptionKey, $sendEmailToUser, $emailBody, $user_self_change);
+
+ // Delete existing keys if required
+ if ($deleteExistingKeys === true) {
+ deleteUserObjetsKeys($userId);
+ }
+
+ // Create background tasks
+ createUserTasks($processId, $nbItemsToTreat);
+
+ // Update user's status
+ updateUserStatus($userId, $processId);
+
+ return prepareExchangedData(
+ array(
+ 'error' => false,
+ 'message' => '',
+ 'user_password' => $generate_user_new_password === true ? $passwordClear : '',
+ ),
+ 'encode'
+ );
+}
+
+/**
+ * Validates a pair of public and private keys.
+ *
+ * @param string $publicKey The public key to validate.
+ * @param string $privateKey The private key to validate.
+ * @return bool Returns true if the key pair is valid, false otherwise.
+ */
+function validateKeyPair(string $publicKey, string $privateKey): bool
+{
+ try {
+ $random_str = generateQuickPassword(12, false);
+ $encrypted = encryptUserObjectKey($random_str, $publicKey);
+ $decrypted = decryptUserObjectKey($encrypted, $privateKey);
+ return $decrypted === $random_str;
+ } catch (Exception $e) {
+ if (defined('LOG_TO_SERVER') && LOG_TO_SERVER === true) {
+ error_log('ERROR: ' . $e->getMessage());
+ }
+ return false;
+ }
+}
+
+/**
+ * Generates new encryption keys.
+ *
+ * @param string $passwordClear The clear text password.
+ * @param bool $user_self_change Indicates if the user is changing the password themselves.
+ * @param string $recovery_public_key The public key used for recovery.
+ * @param string $recovery_private_key The private key used for recovery.
+ *
+ * @return array An array containing the new keys.
+ */
+function generateNewKeys(string $passwordClear, bool $user_self_change, string $recovery_public_key, string $recovery_private_key): array
+{
+ if ($user_self_change === true && !empty($recovery_public_key) && !empty($recovery_private_key)) {
+ return [
'public_key' => $recovery_public_key,
'private_key_clear' => $recovery_private_key,
'private_key' => encryptPrivateKey($passwordClear, $recovery_private_key),
];
} else {
- $userKeys = generateUserKeys($passwordClear);
+ return generateUserKeys($passwordClear);
}
+}
- // Save in DB
+/**
+ * Saves the user's keys in the database.
+ *
+ * @param int $userId The user's ID.
+ * @param string $hashedPassword The hashed password.
+ * @param array $userKeys The user's keys.
+ * @return void
+ */
+function saveUserKeysInDB(int $userId, string $hashedPassword, array $userKeys): void
+{
DB::update(
prefixTable('users'),
array(
@@ -3643,51 +3689,85 @@ function handleUserKeys(
'id=%i',
$userId
);
+}
- // update session too
+/**
+ * Updates the session keys.
+ *
+ * @param int $userId The user's ID.
+ * @param array $userKeys The user's keys.
+ * @return void
+ */
+function updateSessionKeys(int $userId, array $userKeys): void
+{
+ $session = SessionManager::getSession();
if ($userId === $session->get('user-id')) {
$session->set('user-private_key', $userKeys['private_key_clear']);
$session->set('user-public_key', $userKeys['public_key']);
- // Notify user that he must re download his keys:
$session->set('user-keys_recovery_time', NULL);
}
+}
- // Manage empty encryption key
- // Let's take the user's password if asked and if no encryption key provided
- $encryptionKey = $encryptWithUserPassword === true && empty($encryptionKey) === true ? $passwordClear : $encryptionKey;
+/**
+ * Manages the encryption key.
+ *
+ * @param bool $encryptWithUserPassword Indicates if the encryption key should be encrypted with the user's password.
+ * @param string $encryptionKey The encryption key.
+ * @param string $passwordClear The clear text password.
+ * @return string The encryption key.
+ */
+function manageEncryptionKey(bool $encryptWithUserPassword, string $encryptionKey, string $passwordClear): string
+{
+ return $encryptWithUserPassword && empty($encryptionKey) ? $passwordClear : $encryptionKey;
+}
+
+/**
+ * Creates a background process.
+ *
+ * @param int $userId The user's ID.
+ * @param string $passwordClear The clear text password.
+ * @param string $encryptionKey The encryption key.
+ * @param bool $sendEmailToUser Indicates if an email should be sent to the user.
+ * @param string $emailBody The email body.
+ * @param bool $user_self_change Indicates if the user is changing the password themselves.
+ * @return int The ID of the background process.
+ */
+function createBackgroundProcess(int $userId, string $passwordClear, string $encryptionKey, bool $sendEmailToUser, string $emailBody, bool $user_self_change): int
+{
+ $session = SessionManager::getSession();
+ $lang = new Language($session->get('user-language') ?? 'english');
+ $userTP = DB::queryFirstRow(
+ 'SELECT pw, public_key, private_key
+ FROM ' . prefixTable('users') . '
+ WHERE id = %i',
+ TP_USER_ID
+ );
- // Create process
DB::insert(
prefixTable('background_tasks'),
array(
'created_at' => time(),
'process_type' => 'create_user_keys',
'arguments' => json_encode([
- 'new_user_id' => (int) $userId,
- 'new_user_pwd' => cryption($passwordClear, '','encrypt')['string'],
- 'new_user_code' => cryption(empty($encryptionKey) === true ? uniqidReal(20) : $encryptionKey, '','encrypt')['string'],
- 'owner_id' => (int) TP_USER_ID,
+ 'new_user_id' => $userId,
+ 'new_user_pwd' => cryption($passwordClear, '', 'encrypt')['string'],
+ 'new_user_code' => cryption(empty($encryptionKey) ? uniqidReal(20) : $encryptionKey, '', 'encrypt')['string'],
+ 'owner_id' => TP_USER_ID,
'creator_pwd' => $userTP['pw'],
- 'send_email' => $sendEmailToUser === true ? 1 : 0,
+ 'send_email' => $sendEmailToUser ? 1 : 0,
'otp_provided_new_value' => 1,
- 'email_body' => empty($emailBody) === true ? '' : $lang->get($emailBody),
- 'user_self_change' => $user_self_change === true ? 1 : 0,
+ 'email_body' => empty($emailBody) ? '' : $lang->get($emailBody),
+ 'user_self_change' => $user_self_change ? 1 : 0,
]),
)
);
- $processId = DB::insertId();
- // Delete existing keys
- if ($deleteExistingKeys === true) {
- deleteUserObjetsKeys(
- (int) $userId,
- );
- }
+ return DB::insertId();
+}
- // Create tasks
- createUserTasks($processId, $nbItemsToTreat);
- // update user's new status
+function updateUserStatus(int $userId, int $processId): void
+{
DB::update(
prefixTable('users'),
[
@@ -3699,26 +3779,17 @@ function handleUserKeys(
'id=%i',
$userId
);
-
- return prepareExchangedData(
- array(
- 'error' => false,
- 'message' => '',
- 'user_password' => $generate_user_new_password === true ? $passwordClear : '',
- ),
- 'encode'
- );
}
/**
- * Permits to generate a new password for a user
+ * Updates the status of a user based on the given user ID and process ID.
+ *
+ * @param int $userId The ID of the user whose status is to be updated.
+ * @param int $processId The ID of the process that determines the new status of the user.
*
- * @param integer $processId
- * @param integer $nbItemsToTreat
* @return void
-
*/
-function createUserTasks($processId, $nbItemsToTreat): void
+function createUserTasks(int $processId, int $nbItemsToTreat): void
{
DB::insert(
prefixTable('background_subtasks'),
@@ -3813,7 +3884,7 @@ function createUserTasks($processId, $nbItemsToTreat): void
}
/**
- * Permeits to check the consistency of date versus columns definition
+ * Permits to check the consistency of date versus columns definition
*
* @param string $table
* @param array $dataFields
diff --git a/sources/main.queries.php b/sources/main.queries.php
index de0d20afe..5f4941484 100755
--- a/sources/main.queries.php
+++ b/sources/main.queries.php
@@ -167,11 +167,11 @@ function mainQuery(array $SETTINGS)
return false;
}
// decrypt and retreive data in JSON format
- $dataReceived = empty($inputData['data']) === false ? prepareExchangedData(
+ $dataReceived = empty($inputData['data']) === false ? (prepareExchangedData(
$inputData['data'],
'decode'
- ) : '';
-
+ )) : '';
+
switch ($inputData['type_category']) {
case 'action_password':
echo passwordHandler($inputData['type'], $dataReceived, $SETTINGS);
@@ -319,176 +319,251 @@ function passwordHandler(string $post_type, /*php8 array|null|string*/ $dataRece
/**
* Handler for all user tasks
*
- * @param string $post_type
- * @param array|null|string $dataReceived
- * @param array $SETTINGS
- * @param string $post_key
+ * @param string $post_type Type of action to handle.
+ * @param array|null|string $dataReceived Data received from the request.
+ * @param array $SETTINGS Global settings.
+ * @param string $post_key Additional key for post validation.
* @return string
*/
function userHandler(string $post_type, array|null|string $dataReceived, array $SETTINGS, string $post_key): string
{
$session = SessionManager::getSession();
- // List of post types allowed to all users
- $all_users_can_access = [
- 'get_user_info',
- 'increase_session_time',
- 'generate_password',
- 'refresh_list_items_seen',
- 'ga_generate_qr',
- 'user_get_session_time',
- 'save_user_location'
+ // Vérifier si l'utilisateur a les permissions nécessaires
+ if (!userHandlerHasPermission($post_type, $dataReceived, $session)) {
+ return prepareExchangedData(['error' => true], 'encode');
+ }
+
+ // Map des gestionnaires par post_type
+ $handlers = [
+ 'get_user_info' => 'handleGetUserInfo',
+ 'increase_session_time' => 'handleIncreaseSessionTime',
+ 'generate_password' => 'handleGeneratePassword',
+ 'refresh_list_items_seen' => 'handleRefreshListItemsSeen',
+ 'ga_generate_qr' => 'handleGenerateQRCode',
+ 'user_is_ready' => 'handleUserIsReady',
+ 'user_get_session_time' => 'handleUserGetSessionTime',
+ 'save_user_location' => 'handleSaveUserLocation',
];
- // Default values
- $filtered_user_id = $session->get('user-id');
+ // Appeler la fonction correspondante ou retourner une erreur par défaut
+ if (isset($handlers[$post_type]) && function_exists($handlers[$post_type])) {
+ return $handlers[$post_type]($dataReceived, $session, $SETTINGS, $post_key);
+ }
- // User can't manage users and requested type is administrative.
- if ((int) $session->get('user-admin') !== 1 &&
- (int) $session->get('user-manager') !== 1 &&
- (int) $session->get('user-can_manage_all_users') !== 1 &&
- !in_array($post_type, $all_users_can_access)) {
+ // Cas par défaut si le post_type est invalide
+ return prepareExchangedData(['error' => true], 'encode');
+}
- return prepareExchangedData(
- array(
- 'error' => true,
- ),
- 'encode'
- );
- }
+/**
+ * Handler for getting user information.
+ *
+ * @param array $dataReceived The data received from the client.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param string $post_key The additional key for post validation.
+ * @return string The user information.
+ */
+function handleGetUserInfo($dataReceived, $session, $SETTINGS, $post_key): string
+{
+ $userId = (int) $session->get('user-id');
+ return getUserInfo($userId, $SETTINGS);
+}
- if (isset($dataReceived['user_id'])) {
- // Get info about user to modify
- $targetUserInfos = DB::queryfirstrow(
- 'SELECT admin, gestionnaire, can_manage_all_users, isAdministratedByRole FROM ' . prefixTable('users') . '
- WHERE id = %i',
- $dataReceived['user_id']
- );
+/**
+ * Handler for increasing the session time.
+ *
+ * @param array $dataReceived The data received from the client.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param string $post_key The additional key for post validation.
+ * @return string The new session time.
+ */
+function handleIncreaseSessionTime($dataReceived, $session, $SETTINGS, $post_key): string
+{
+ $duration = (int) filter_input(INPUT_POST, 'duration', FILTER_SANITIZE_NUMBER_INT);
+ return increaseSessionDuration($duration);
+}
- if (
- // Administrator user
- (int) $session->get('user-admin') === 1
- // Manager of basic/ro users in this role
- || ((int) $session->get('user-manager') === 1
- && in_array($targetUserInfos['isAdministratedByRole'], $session->get('user-roles_array'))
- && (int) $targetUserInfos['admin'] !== 1
- && (int) $targetUserInfos['can_manage_all_users'] !== 1
- && (int) $targetUserInfos['gestionnaire'] !== 1)
- // Manager of all basic/ro users
- || ((int) $session->get('user-can_manage_all_users') === 1
- && (int) $targetUserInfos['admin'] !== 1
- && (int) $targetUserInfos['can_manage_all_users'] !== 1
- && (int) $targetUserInfos['gestionnaire'] !== 1)
- ) {
- // This user is allowed to modify other users.
- $filtered_user_id = $dataReceived['user_id'];
- }
- }
+/**
+ * Handler for generating a password.
+ *
+ * @param array $dataReceived The data received from the client.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param string $post_key The additional key for post validation.
+ * @return string The generated password.
+ */
+function handleGeneratePassword($dataReceived, $session, $SETTINGS, $post_key): string
+{
+ $validatedData = validateHandlerData($dataReceived, [
+ 'size' => FILTER_SANITIZE_NUMBER_INT,
+ 'secure_pwd' => FILTER_VALIDATE_BOOLEAN,
+ 'lowercase' => FILTER_VALIDATE_BOOLEAN,
+ 'capitalize' => FILTER_VALIDATE_BOOLEAN,
+ 'numerals' => FILTER_VALIDATE_BOOLEAN,
+ 'symbols' => FILTER_VALIDATE_BOOLEAN,
+ ]);
+
+ return generateGenericPassword(
+ (int) $validatedData['size'],
+ (bool) $validatedData['secure_pwd'],
+ (bool) $validatedData['lowercase'],
+ (bool) $validatedData['capitalize'],
+ (bool) $validatedData['numerals'],
+ (bool) $validatedData['symbols'],
+ (array) $SETTINGS
+ );
+}
- switch ($post_type) {
- /*
- * Get info
- */
- case 'get_user_info'://action_user
- return getUserInfo(
- (int) $filtered_user_id,
- $SETTINGS
- );
+/**
+ * Handler for refreshing the list of items seen by the user.
+ *
+ * @param array $dataReceived The data received from the client.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param string $post_key The additional key for post validation.
+ * @return string The refreshed list of items seen by the user.
+ */
+function handleRefreshListItemsSeen($dataReceived, $session, $SETTINGS, $post_key): string
+{
+ if ($session->has('user-id') && (int) $session->get('user-id') > 0) {
+ return refreshUserItemsSeenList($SETTINGS);
+ }
- /*
- * Increase the session time of User
- */
- case 'increase_session_time'://action_user
- return increaseSessionDuration(
- (int) filter_input(INPUT_POST, 'duration', FILTER_SANITIZE_NUMBER_INT)
- );
+ return json_encode(
+ ['error' => '', 'existing_suggestions' => 0, 'html_json' => ''],
+ JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP
+ );
+}
- /*
- * Generate a password generic
- */
- case 'generate_password'://action_user
- return generateGenericPassword(
- (int) filter_input(INPUT_POST, 'size', FILTER_SANITIZE_NUMBER_INT),
- (bool) filter_input(INPUT_POST, 'secure_pwd', FILTER_VALIDATE_BOOLEAN),
- (bool) filter_input(INPUT_POST, 'lowercase', FILTER_VALIDATE_BOOLEAN),
- (bool) filter_input(INPUT_POST, 'capitalize', FILTER_VALIDATE_BOOLEAN),
- (bool) filter_input(INPUT_POST, 'numerals', FILTER_VALIDATE_BOOLEAN),
- (bool) filter_input(INPUT_POST, 'symbols', FILTER_VALIDATE_BOOLEAN),
- $SETTINGS
- );
+/**
+ * Handler for generating a QR code for Google Authenticator.
+ *
+ * @param array $dataReceived The data received from the client.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param string $post_key The additional key for post validation.
+ * @return string The generated QR code.
+ */
+function handleGenerateQRCode($dataReceived, $session, $SETTINGS, $post_key): string
+{
+ $validatedData = validateHandlerData($dataReceived, [
+ 'demand_origin' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
+ 'send_email' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
+ 'login' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
+ 'pwd' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
+ 'token' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
+ ]);
+
+ return generateQRCode(
+ (int) $session->get('user-id'),
+ $validatedData['demand_origin'],
+ $validatedData['send_email'],
+ $validatedData['login'],
+ $validatedData['pwd'],
+ $validatedData['token'],
+ $SETTINGS
+ );
+}
- /*
- * Refresh list of last items seen
- */
- case 'refresh_list_items_seen'://action_user
- if ($session->has('user-id') || (int) $session->get('user-id') && null !== $session->get('user-id') || (int) $session->get('user-id') > 0) {
- return refreshUserItemsSeenList(
- $SETTINGS
- );
+/**
+ * Handler for checking if the user is ready.
+ *
+ * @param array $dataReceived The data received from the client.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param string $post_key The additional key for post validation.
+ * @return string The user's readiness status.
+ */
+function handleUserIsReady($dataReceived, $session, $SETTINGS, $post_key): string
+{
+ $userId = (int) $session->get('user-id');
+ return userIsReady($userId, $SETTINGS['cpassman_dir']);
+}
- } else {
- return json_encode(
- array(
- 'error' => '',
- 'existing_suggestions' => 0,
- 'html_json' => '',
- ),
- JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP
- );
- }
+/**
+ * Handler for getting the user's session time.
+ *
+ * @param array $dataReceived The data received from the client.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param string $post_key The additional key for post validation.
+ * @return string The user's session time.
+ */
+function handleUserGetSessionTime($dataReceived, $session, $SETTINGS, $post_key): string
+{
+ return userGetSessionTime(
+ (int) $session->get('user-id'),
+ $SETTINGS['cpassman_dir'],
+ (int) $SETTINGS['maximum_session_expiration_time']
+ );
+}
- /*
- * This will generate the QR Google Authenticator
- */
- case 'ga_generate_qr'://action_user
- return generateQRCode(
- (int) $filtered_user_id,
- (string) filter_var($dataReceived['demand_origin'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- (string) filter_var($dataReceived['send_email'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- (string) filter_var($dataReceived['login'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- (string) filter_var($dataReceived['pwd'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- (string) filter_var($dataReceived['token'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- $SETTINGS
- );
+/**
+ * Handler for saving the user's location.
+ *
+ * @param array $dataReceived The data received from the client.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param string $post_key The additional key for post validation.
+ * @return string The user's location.
+ */
+function handleSaveUserLocation($dataReceived, $session, $SETTINGS, $post_key): string
+{
+ return userSaveIp(
+ (int) $session->get('user-id'),
+ (string) filter_var($dataReceived['action'], FILTER_SANITIZE_FULL_SPECIAL_CHARS)
+ );
+}
- /*
- * This will set the user ready
- */
- case 'user_is_ready'://action_user
- return userIsReady(
- (int) $filtered_user_id,
- (string) $SETTINGS['cpassman_dir']
- );
+/**
+ * Handler for all system tasks.
+ *
+ * @param string $post_type
+ * @param array|null|string $dataReceived
+ * @param array $SETTINGS
+ * @return bool
+ */
+function userHandlerHasPermission(string $post_type, $dataReceived, $session): bool
+{
+ $all_users_can_access = [
+ 'get_user_info',
+ 'increase_session_time',
+ 'generate_password',
+ 'refresh_list_items_seen',
+ 'ga_generate_qr',
+ 'user_get_session_time',
+ 'save_user_location',
+ ];
- /*
- * This post type is used to check if the user session is still valid
- */
- case 'user_get_session_time'://action_user
- return userGetSessionTime(
- (int) $session->get('user-id'),
- (string) $SETTINGS['cpassman_dir'],
- (int) $SETTINGS['maximum_session_expiration_time'],
- );
+ if (in_array($post_type, $all_users_can_access)) {
+ return true;
+ }
- case 'save_user_location'://action_user
- return userSaveIp(
- (int) $session->get('user-id'),
- (string) filter_var($dataReceived['action'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- );
+ return (int) $session->get('user-admin') === 1
+ || (int) $session->get('user-manager') === 1
+ || (int) $session->get('user-can_manage_all_users') === 1;
+}
- /*
- * Default case
- */
- default :
- return prepareExchangedData(
- array(
- 'error' => true,
- ),
- 'encode'
- );
+/**
+ * Handler for validating data received from the client.
+ *
+ * @param array $data The data received from the client.
+ * @param array $rules The rules to apply to the data.
+ * @return array The validated data.
+ */
+function validateHandlerData(array $data, array $rules): array
+{
+ $validated = [];
+ foreach ($rules as $key => $filter) {
+ $validated[$key] = filter_var($data[$key] ?? null, $filter);
}
+ return $validated;
}
+
+
/**
* Handler for all mail tasks
*
@@ -597,228 +672,272 @@ function mailHandler(string $post_type, /*php8 array|null|string */$dataReceived
}
/**
- * Handler for all key related tasks
+ * Handler for all key-related tasks.
*
- * @param string $post_type
- * @param array|null|string $dataReceived
- * @param array $SETTINGS
+ * @param string $post_type Type of action to handle.
+ * @param array|null|string $dataReceived Data received from the request.
+ * @param array $SETTINGS Global settings.
* @return string
*/
-function keyHandler(string $post_type, /*php8 array|null|string */$dataReceived, array $SETTINGS): string
+function keyHandler(string $post_type, $dataReceived, array $SETTINGS): string
{
+ // Load session and language
$session = SessionManager::getSession();
$lang = new Language($session->get('user-language') ?? 'english');
- // List of post types allowed to all users
- $all_users_can_access = [
- 'change_private_key_encryption_password',
- 'user_new_keys_generation',
- 'user_recovery_keys_download',
- ];
-
- // Default values
- $filtered_user_id = $session->get('user-id');
+ // Check that $dataReceived is an array (not a string or null)
+ if (!is_array($dataReceived) || is_null($dataReceived)) {
+ return prepareExchangedData(['error' => true, 'message' => $lang->get('error_data_not_consistent')], 'encode');
+ }
- if (isset($dataReceived['user_id'])) {
- // Get info about user to modify
- $targetUserInfos = DB::queryfirstrow(
- 'SELECT admin, gestionnaire, can_manage_all_users, isAdministratedByRole FROM ' . prefixTable('users') . '
- WHERE id = %i',
- $dataReceived['user_id']
- );
-
- if (
- // Administrator user
- (int) $session->get('user-admin') === 1
- // Manager of basic/ro users in this role
- || ((int) $session->get('user-manager') === 1
- && in_array($targetUserInfos['isAdministratedByRole'], $session->get('user-roles_array'))
- && (int) $targetUserInfos['admin'] !== 1
- && (int) $targetUserInfos['can_manage_all_users'] !== 1
- && (int) $targetUserInfos['gestionnaire'] !== 1)
- // Manager of all basic/ro users
- || ((int) $session->get('user-can_manage_all_users') === 1
- && (int) $targetUserInfos['admin'] !== 1
- && (int) $targetUserInfos['can_manage_all_users'] !== 1
- && (int) $targetUserInfos['gestionnaire'] !== 1)
- ) {
- // This user is allowed to modify other users.
- $filtered_user_id = $dataReceived['user_id'];
-
- } else if (!in_array($post_type, $all_users_can_access)) {
- // User can't manage users and requested type is administrative.
- return prepareExchangedData(
- array(
- 'error' => true,
- ),
- 'encode'
- );
- }
+ // Check user permissions
+ if (!userHasPermission($post_type, $dataReceived, $session)) {
+ return prepareExchangedData(['error' => true, 'message' => $lang->get('error_permission_denied')], 'encode');
}
- switch ($post_type) {
- /*
- * Generate a temporary encryption key for user
- */
- case 'generate_temporary_encryption_key'://action_key
- return generateOneTimeCode(
- (int) filter_var($filtered_user_id, FILTER_SANITIZE_NUMBER_INT)
- );
+ // Map post types to their corresponding handlers
+ $handlers = [
+ 'generate_temporary_encryption_key' => 'handleGenerateTemporaryKey',
+ 'user_sharekeys_reencryption_next' => 'handleSharekeysReencryption',
+ 'user_psk_reencryption' => 'handlePskReencryption',
+ 'change_private_key_encryption_password' => 'handleChangePrivateKeyPassword',
+ 'user_new_keys_generation' => 'handleNewKeysGeneration',
+ 'user_recovery_keys_download' => 'handleRecoveryKeysDownload',
+ ];
- /*
- * user_sharekeys_reencryption_next
- */
- case 'user_sharekeys_reencryption_next'://action_key
- return continueReEncryptingUserSharekeys(
- (int) filter_var($filtered_user_id, FILTER_SANITIZE_NUMBER_INT),
- (bool) filter_var($dataReceived['self_change'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- (string) filter_var($dataReceived['action'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- (int) filter_var($dataReceived['start'], FILTER_SANITIZE_NUMBER_INT),
- (int) filter_var($dataReceived['length'], FILTER_SANITIZE_NUMBER_INT),
- $SETTINGS
- );
+ // Call the appropriate handler or return an error message
+ if (isset($handlers[$post_type]) && function_exists($handlers[$post_type])) {
+ return $handlers[$post_type]($dataReceived, $session, $SETTINGS, $lang);
+ }
- /*
- * user_psk_reencryption
- */
- case 'user_psk_reencryption'://action_key
- return migrateTo3_DoUserPersonalItemsEncryption(
- (int) filter_var($filtered_user_id, FILTER_SANITIZE_NUMBER_INT),
- (int) filter_var($dataReceived['start'], FILTER_SANITIZE_NUMBER_INT),
- (int) filter_var($dataReceived['length'], FILTER_SANITIZE_NUMBER_INT),
- (int) filter_var($dataReceived['counterItemsToTreat'], FILTER_SANITIZE_NUMBER_INT),
- (string) filter_var($dataReceived['userPsk'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- $SETTINGS
- );
+ return prepareExchangedData(['error' => true, 'message' => $lang->get('error_invalid_action')], 'encode');
+}
- /*
- * User's public/private keys change
- */
- case 'change_private_key_encryption_password'://action_key
- // Users passwords are html escaped
- $newPassword = filter_var($dataReceived['new_code'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
+/**
+ * Generates a temporary key based on the provided data.
+ *
+ * @param array $dataReceived The data received for generating the key.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param object $lang The language settings.
+ * @return string The generated temporary key.
+ */
+function handleGenerateTemporaryKey($dataReceived, $session, $SETTINGS, $lang): string
+{
+ $userId = (int) filter_var($session->get('user-id'), FILTER_SANITIZE_NUMBER_INT);
+ return generateOneTimeCode($userId);
+}
- // Get current user hash
- $userHash = DB::queryFirstRow(
- "SELECT pw FROM " . prefixtable('users') . " WHERE id = %d;",
- $session->get('user-id')
- )['pw'];
+/**
+ * Handles the re-encryption of user sharekeys.
+ *
+ * @param array $dataReceived The data received for generating the key.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param object $lang The language settings.
+ * @return string The generated temporary key.
+ */
+function handleSharekeysReencryption($dataReceived, $session, $SETTINGS, $lang): string
+{
+ $validatedData = validateData($dataReceived, [
+ 'self_change' => FILTER_VALIDATE_BOOLEAN,
+ 'action' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
+ 'start' => FILTER_SANITIZE_NUMBER_INT,
+ 'length' => FILTER_SANITIZE_NUMBER_INT,
+ ]);
+
+ return continueReEncryptingUserSharekeys(
+ (int) $session->get('user-id'),
+ $validatedData['self_change'],
+ $validatedData['action'],
+ $validatedData['start'],
+ $validatedData['length'],
+ $SETTINGS
+ );
+}
- $passwordManager = new PasswordManager();
+/**
+ * Handles the re-encryption of user personal items.
+ *
+ * @param array $dataReceived The data received for generating the key.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param object $lang The language settings.
+ * @return string The generated temporary key.
+ */
+function handlePskReencryption($dataReceived, $session, $SETTINGS, $lang): string
+{
+ $validatedData = validateData($dataReceived, [
+ 'start' => FILTER_SANITIZE_NUMBER_INT,
+ 'length' => FILTER_SANITIZE_NUMBER_INT,
+ 'counterItemsToTreat' => FILTER_SANITIZE_NUMBER_INT,
+ 'userPsk' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
+ ]);
+
+ return migrateTo3_DoUserPersonalItemsEncryption(
+ (int) $session->get('user-id'),
+ $validatedData['start'],
+ $validatedData['length'],
+ $validatedData['counterItemsToTreat'],
+ $validatedData['userPsk'],
+ $SETTINGS
+ );
+}
- // Verify provided user password
- if (!$passwordManager->verifyPassword($userHash, $newPassword)) {
- return prepareExchangedData(
- array(
- 'error' => true,
- 'message' => $lang->get('error_bad_credentials'),
- ),
- 'encode'
- );
- }
+/**
+ * Handles the change of the private key encryption password.
+ *
+ * @param array $dataReceived The data received for generating the key.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param object $lang The language settings.
+ * @return string The generated temporary key.
+ */
+function handleChangePrivateKeyPassword($dataReceived, $session, $SETTINGS, $lang): string
+{
+ $newPassword = filter_var($dataReceived['new_code'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
+ $userHash = DB::queryFirstRow(
+ "SELECT pw FROM " . prefixtable('users') . " WHERE id = %d;",
+ $session->get('user-id')
+ )['pw'];
- return changePrivateKeyEncryptionPassword(
- (int) filter_var($filtered_user_id, FILTER_SANITIZE_NUMBER_INT),
- (string) $dataReceived['current_code'],
- (string) $newPassword,
- (string) filter_var($dataReceived['action_type'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- $SETTINGS
- );
+ $passwordManager = new PasswordManager();
- /*
- * Launch user keys change on his demand
- */
- case 'user_new_keys_generation'://action_key
+ if (!$passwordManager->verifyPassword($userHash, $newPassword)) {
+ return prepareExchangedData(
+ ['error' => true, 'message' => $lang->get('error_bad_credentials')],
+ 'encode'
+ );
+ }
- // Users passwords are html escaped
- $userPassword = filter_var($dataReceived['user_pwd'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
+ return changePrivateKeyEncryptionPassword(
+ (int) $session->get('user-id'),
+ (string) $dataReceived['current_code'],
+ $newPassword,
+ (string) filter_var($dataReceived['action_type'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
+ $SETTINGS
+ );
+}
- // Don't generate new user password -> verify it
- if ($dataReceived['generate_user_new_password'] !== true) {
+/**
+ * Handles the generation of new keys for a user.
+ *
+ * @param array $dataReceived The data received for generating the key.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param object $lang The language settings.
+ * @return string The generated temporary key.
+ */
+function handleNewKeysGeneration($dataReceived, $session, $SETTINGS, $lang): string
+{
+ $validatedData = validateData($dataReceived, [
+ 'user_pwd' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
+ 'generate_user_new_password' => FILTER_VALIDATE_BOOLEAN,
+ 'encryption_key' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
+ 'delete_existing_keys' => FILTER_VALIDATE_BOOLEAN,
+ 'send_email_to_user' => FILTER_VALIDATE_BOOLEAN,
+ 'encrypt_with_user_pwd' => FILTER_VALIDATE_BOOLEAN,
+ 'email_body' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
+ 'recovery_public_key' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
+ 'recovery_private_key' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
+ ]);
+
+ return handleUserKeys(
+ (int) $session->get('user-id'),
+ $validatedData['user_pwd'],
+ (int) $SETTINGS['maximum_number_of_items_to_treat'] ?? NUMBER_ITEMS_IN_BATCH,
+ $validatedData['encryption_key'],
+ $validatedData['delete_existing_keys'],
+ $validatedData['send_email_to_user'],
+ $validatedData['encrypt_with_user_pwd'],
+ $validatedData['generate_user_new_password'] ?? false,
+ $validatedData['email_body'],
+ true,
+ $validatedData['recovery_public_key'],
+ $validatedData['recovery_private_key']
+ );
+}
- // Get current user hash
- $userHash = DB::queryFirstRow(
- "SELECT pw FROM " . prefixtable('users') . " WHERE id = %d;",
- $session->get('user-id')
- )['pw'];
+/**
+ * Handles the download of recovery keys for a user.
+ *
+ * @param array $dataReceived The data received for generating the key.
+ * @param object $session The current session data.
+ * @param array $SETTINGS The application settings.
+ * @param object $lang The language settings.
+ * @return string The generated temporary key.
+ */
+function handleRecoveryKeysDownload($dataReceived, $session, $SETTINGS, $lang): string
+{
+ $userPassword = filter_var($dataReceived['password'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
+ $userHash = DB::queryFirstRow(
+ "SELECT pw FROM " . prefixtable('users') . " WHERE id = %i;",
+ $session->get('user-id')
+ )['pw'];
- $passwordManager = new PasswordManager();
+ $passwordManager = new PasswordManager();
- // Verify provided user password
- if (!$passwordManager->verifyPassword($userHash, $userPassword)) {
- return prepareExchangedData(
- array(
- 'error' => true,
- 'message' => $lang->get('error_bad_credentials'),
- ),
- 'encode'
- );
- }
- }
+ if (!$passwordManager->verifyPassword($userHash, $userPassword)) {
+ return prepareExchangedData(
+ ['error' => true, 'message' => $lang->get('error_bad_credentials')],
+ 'encode'
+ );
+ }
- return handleUserKeys(
- (int) filter_var($filtered_user_id, FILTER_SANITIZE_NUMBER_INT),
- (string) $userPassword,
- (int) isset($SETTINGS['maximum_number_of_items_to_treat']) === true ? $SETTINGS['maximum_number_of_items_to_treat'] : NUMBER_ITEMS_IN_BATCH,
- (string) filter_var($dataReceived['encryption_key'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- (bool) filter_var($dataReceived['delete_existing_keys'], FILTER_VALIDATE_BOOLEAN),
- (bool) filter_var($dataReceived['send_email_to_user'], FILTER_VALIDATE_BOOLEAN),
- (bool) filter_var($dataReceived['encrypt_with_user_pwd'], FILTER_VALIDATE_BOOLEAN),
- (bool) isset($dataReceived['generate_user_new_password']) === true ? filter_var($dataReceived['generate_user_new_password'], FILTER_VALIDATE_BOOLEAN) : false,
- (string) filter_var($dataReceived['email_body'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- (bool) filter_var($dataReceived['user_self_change'], FILTER_VALIDATE_BOOLEAN),
- (string) filter_var($dataReceived['recovery_public_key'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- (string) filter_var($dataReceived['recovery_private_key'], FILTER_SANITIZE_FULL_SPECIAL_CHARS),
- );
+ return handleUserRecoveryKeysDownload((int) $session->get('user-id'), $SETTINGS);
+}
- /*
- * Launch user recovery download
- */
- case 'user_recovery_keys_download'://action_key
- // Validate user password on local and LDAP accounts before download
- if ($session->get('user-auth_type') !== 'oauth2') {
- // Users passwords are html escaped
- $userPassword = filter_var($dataReceived['password'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
-
- // Get current user hash
- $userHash = DB::queryFirstRow(
- "SELECT pw FROM " . prefixtable('users') . " WHERE id = %i;",
- $session->get('user-id')
- )['pw'];
+/**
+ * Handles the validation of data received from the client.
+ *
+ * @param array $data The data received from the client.
+ * @param array $rules The rules to apply to the data.
+ * @return array The validated data.
+ */
+function validateData($data, array $rules): array
+{
+ $validated = [];
+ foreach ($rules as $key => $filter) {
+ $validated[$key] = filter_var($data[$key] ?? null, $filter);
+ }
+ return $validated;
+}
- $passwordManager = new PasswordManager();
+/**
+ * Checks if the user has permission to perform the given action.
+ *
+ * @param string $post_type The type of action to perform.
+ * @param array $dataReceived The data received from the client.
+ * @param object $session The current session data.
+ * @return bool True if the user has permission, false otherwise.
+ */
+function userHasPermission(string $post_type, $dataReceived, $session): bool
+{
+ $all_users_can_access = [
+ 'change_private_key_encryption_password',
+ 'user_new_keys_generation',
+ 'user_recovery_keys_download',
+ ];
- // Verify provided user password
- if (!$passwordManager->verifyPassword($userHash, $userPassword)) {
- return prepareExchangedData(
- array(
- 'error' => true,
- 'message' => $lang->get('error_bad_credentials'),
- ),
- 'encode'
- );
- }
- }
+ if (!isset($dataReceived['user_id'])) {
+ return in_array($post_type, $all_users_can_access);
+ }
- return handleUserRecoveryKeysDownload(
- (int) $filtered_user_id,
- (array) $SETTINGS,
- );
+ $targetUserInfos = DB::queryFirstRow(
+ 'SELECT admin, gestionnaire, can_manage_all_users, isAdministratedByRole FROM ' . prefixTable('users') . ' WHERE id = %i',
+ $dataReceived['user_id']
+ );
- /*
- * Default case
- */
- default :
- return prepareExchangedData(
- array(
- 'error' => true,
- ),
- 'encode'
- );
- }
+ return (int) $session->get('user-admin') === 1
+ || ((int) $session->get('user-manager') === 1
+ && in_array($targetUserInfos['isAdministratedByRole'], $session->get('user-roles_array'))
+ && (int) $targetUserInfos['admin'] !== 1
+ && (int) $targetUserInfos['can_manage_all_users'] !== 1
+ && (int) $targetUserInfos['gestionnaire'] !== 1);
}
+
/**
* Handler for all system tasks
*
@@ -1227,6 +1346,18 @@ function changePassword(
);
}
+/**
+ * Generates a QR code for the user.
+ *
+ * @param int $post_id The user's ID.
+ * @param string $post_demand_origin The origin of the request.
+ * @param int $post_send_mail Whether to send an email.
+ * @param string $post_login The user's login.
+ * @param string $post_pwd The user's password.
+ * @param string $post_token The user's token.
+ * @param array $SETTINGS The application settings.
+ * @return string The generated QR code.
+ */
function generateQRCode(
$post_id,
$post_demand_origin,
@@ -1235,196 +1366,248 @@ function generateQRCode(
$post_pwd,
$post_token,
array $SETTINGS
-): string
-{
- // Load user's language
+): string {
$session = SessionManager::getSession();
$lang = new Language($session->get('user-language') ?? 'english');
- // is this allowed by setting
- if (isKeyExistingAndEqual('ga_reset_by_user', 0, $SETTINGS) === true
- && (null === $post_demand_origin || $post_demand_origin !== 'users_management_list')
- ) {
- // User cannot ask for a new code
- return prepareExchangedData(
- array(
- 'error' => true,
- 'message' => "113 ".$lang->get('error_not_allowed_to')." - ".isKeyExistingAndEqual('ga_reset_by_user', 1, $SETTINGS),
- ),
- 'encode'
- );
+ // Validate settings and origin
+ if (!isQRCodeRequestAllowed($post_demand_origin, $SETTINGS)) {
+ return generateErrorResponse($lang->get('error_not_allowed_to'), '113');
+ }
+
+ // Retrieve user data
+ $dataUser = fetchUserData($post_id, $post_login);
+ if (!$dataUser) {
+ logFailedAuth($SETTINGS, 'user_not_exists', $post_login);
+ return generateErrorResponse($lang->get('no_user'));
+ }
+
+ // Validate password if required
+ if (!isPasswordValid($post_pwd, $dataUser['pw'], $post_demand_origin, $SETTINGS, $post_login)) {
+ return generateErrorResponse($lang->get('no_user'));
+ }
+
+ if (empty($dataUser['email'])) {
+ return generateErrorResponse($lang->get('no_email_set'));
+ }
+
+ // Check token usage
+ $tokenId = handleToken($post_token, $dataUser['id']);
+ if ($tokenId === false) {
+ return generateErrorResponse('TOKEN already used');
+ }
+
+ // Generate and update user 2FA data
+ [$gaSecretKey, $gaTemporaryCode] = updateUserGAData($dataUser['id'], $SETTINGS);
+
+ logEvents($SETTINGS, 'user_connection', 'at_2fa_google_code_send_by_email', (string)$dataUser['id'], $post_login);
+
+ // Update token status
+ updateTokenStatus($tokenId);
+
+ // Send email if required
+ if ((int) $post_send_mail === 1) {
+ return sendQRCodeEmail($gaTemporaryCode, $dataUser['email'], $lang);
}
-
- // Check if user exists
- if (isValueSetNullEmpty($post_id) === true) {
- // Get data about user
+
+ return generateSuccessResponse($dataUser['email'], $lang);
+}
+/**
+ * Validates whether the QR code request is allowed.
+ *
+ * @param string|null $post_demand_origin Origin of the request.
+ * @param array $SETTINGS Application settings.
+ * @return bool True if the request is allowed, false otherwise.
+ */
+function isQRCodeRequestAllowed(?string $post_demand_origin, array $SETTINGS): bool {
+ return !(isKeyExistingAndEqual('ga_reset_by_user', 0, $SETTINGS) &&
+ ($post_demand_origin !== 'users_management_list'));
+}
+
+/**
+ * Fetches user data based on their ID or login.
+ *
+ * @param int|string|null $post_id User ID or null if not provided.
+ * @param string|null $post_login User login (updated if ID is used).
+ * @return array|null User data as an associative array or null if not found.
+ */
+function fetchUserData($post_id, ?string &$post_login): ?array {
+ if (isValueSetNullEmpty($post_id)) {
$dataUser = DB::queryfirstrow(
- 'SELECT id, email, pw
- FROM ' . prefixTable('users') . '
- WHERE login = %s',
+ 'SELECT id, email, pw FROM ' . prefixTable('users') . ' WHERE login = %s',
$post_login
);
} else {
$dataUser = DB::queryfirstrow(
- 'SELECT id, login, email, pw
- FROM ' . prefixTable('users') . '
- WHERE id = %i',
+ 'SELECT id, login, email, pw FROM ' . prefixTable('users') . ' WHERE id = %i',
$post_id
);
$post_login = $dataUser['login'];
}
- // Get number of returned users
- $counter = DB::count();
-
- // Do treatment
- if ($counter === 0) {
- // Not a registered user !
- logEvents($SETTINGS, 'failed_auth', 'user_not_exists', '', stripslashes($post_login), stripslashes($post_login));
- return prepareExchangedData(
- array(
- 'error' => true,
- 'message' => $lang->get('no_user'),
- 'tst' => 1,
- ),
- 'encode'
- );
- }
+ return $dataUser;
+}
- $passwordManager = new PasswordManager();
- if (
- isSetArrayOfValues([$post_pwd, $dataUser['pw']]) === true
- && $passwordManager->verifyPassword($dataUser['pw'], $post_pwd) === false
- && $post_demand_origin !== 'users_management_list'
- ) {
- // checked the given password
- logEvents($SETTINGS, 'failed_auth', 'password_is_not_correct', '', stripslashes($post_login), stripslashes($post_login));
- return prepareExchangedData(
- array(
- 'error' => true,
- 'message' => $lang->get('no_user'),
- 'tst' => $post_demand_origin,
- ),
- 'encode'
- );
- }
-
- if (empty($dataUser['email']) === true) {
- return prepareExchangedData(
- array(
- 'error' => true,
- 'message' => $lang->get('no_email_set'),
- ),
- 'encode'
- );
+/**
+ * Validates the user's password.
+ *
+ * @param string|null $post_pwd Provided password.
+ * @param string $storedPwd Stored password hash.
+ * @param string|null $post_demand_origin Request origin.
+ * @param array $SETTINGS Application settings.
+ * @param string $post_login User login.
+ * @return bool True if the password is valid, false otherwise.
+ */
+function isPasswordValid(?string $post_pwd, string $storedPwd, ?string $post_demand_origin, array $SETTINGS, string $post_login): bool {
+ if (isSetArrayOfValues([$post_pwd, $storedPwd]) &&
+ !(new PasswordManager())->verifyPassword($storedPwd, /** @scrutinizer ignore-type */ $post_pwd) &&
+ $post_demand_origin !== 'users_management_list') {
+ logFailedAuth($SETTINGS, 'password_is_not_correct', $post_login);
+ return false;
}
+ return true;
+}
- // Check if token already used
+/**
+ * Handles the token validation and storage process.
+ *
+ * @param string $post_token Provided token.
+ * @param int $userId User ID.
+ *
+ * @return mixed Token ID if a new token is created, false if the token was already used.
+ */
+function handleToken(string $post_token, int $userId): mixed {
$dataToken = DB::queryfirstrow(
- 'SELECT end_timestamp, reason
- FROM ' . prefixTable('tokens') . '
- WHERE token = %s AND user_id = %i',
+ 'SELECT end_timestamp, reason FROM ' . prefixTable('tokens') . ' WHERE token = %s AND user_id = %i',
$post_token,
- $dataUser['id']
+ $userId
);
- $tokenId = '';
- if (DB::count() > 0 && is_null($dataToken['end_timestamp']) === false && $dataToken['reason'] === 'auth_qr_code') {
- // This token has already been used
- return prepareExchangedData(
- array(
- 'error' => true,
- 'message' => 'TOKEN already used',//$lang->get('no_email_set'),
- ),
- 'encode'
- );
- } elseif(DB::count() === 0) {
- // Store token for this action
- DB::insert(
- prefixTable('tokens'),
- array(
- 'user_id' => (int) $dataUser['id'],
- 'token' => $post_token,
- 'reason' => 'auth_qr_code',
- 'creation_timestamp' => time(),
- )
- );
- $tokenId = DB::insertId();
+
+ if (DB::count() > 0 && !is_null($dataToken['end_timestamp']) && $dataToken['reason'] === 'auth_qr_code') {
+ return false;
}
-
- // generate new GA user code
+
+ if (DB::count() === 0) {
+ DB::insert(prefixTable('tokens'), [
+ 'user_id' => $userId,
+ 'token' => $post_token,
+ 'reason' => 'auth_qr_code',
+ 'creation_timestamp' => time(),
+ ]);
+ return DB::insertId();
+ }
+ return null;
+}
+
+/**
+ * Generates and updates the user's Google Authenticator data.
+ *
+ * @param int $userId User ID.
+ * @param array $SETTINGS Application settings.
+ * @return array A tuple containing the secret key and temporary code.
+ */
+function updateUserGAData(int $userId, array $SETTINGS): array {
$tfa = new TwoFactorAuth($SETTINGS['ga_website_name']);
$gaSecretKey = $tfa->createSecret();
$gaTemporaryCode = GenerateCryptKey(12, false, true, true, false, true);
- DB::update(
- prefixTable('users'),
- [
- 'ga' => $gaSecretKey,
- 'ga_temporary_code' => $gaTemporaryCode,
- ],
- 'id = %i',
- $dataUser['id']
- );
+ DB::update(prefixTable('users'), [
+ 'ga' => $gaSecretKey,
+ 'ga_temporary_code' => $gaTemporaryCode,
+ ], 'id = %i', $userId);
- // Log event
- logEvents($SETTINGS, 'user_connection', 'at_2fa_google_code_send_by_email', (string) $dataUser['id'], stripslashes($post_login), stripslashes($post_login));
+ return [$gaSecretKey, $gaTemporaryCode];
+}
- // Update token status
- DB::update(
- prefixTable('tokens'),
- [
- 'end_timestamp' => time(),
- ],
- 'id = %i',
- $tokenId
+/**
+ * Updates the token status to mark it as used.
+ *
+ * @param int $tokenId Token ID.
+ * @return void
+ */
+function updateTokenStatus(int $tokenId): void {
+ DB::update(prefixTable('tokens'), [
+ 'end_timestamp' => time(),
+ ], 'id = %i', $tokenId);
+}
+
+/**
+ * Sends the QR code email with the temporary code.
+ *
+ * @param string $gaTemporaryCode Temporary Google Authenticator code.
+ * @param string $email User's email address.
+ * @param Language $lang Language object for messages.
+ * @return string JSON response indicating success.
+ */
+function sendQRCodeEmail(string $gaTemporaryCode, string $email, Language $lang): string {
+ prepareSendingEmail(
+ $lang->get('email_ga_subject'),
+ str_replace('#2FACode#', $gaTemporaryCode, $lang->get('email_ga_text')),
+ $email
);
- // send mail?
- if ((int) $post_send_mail === 1) {
- prepareSendingEmail(
- $lang->get('email_ga_subject'),
- str_replace(
- '#2FACode#',
- $gaTemporaryCode,
- $lang->get('email_ga_text')
- ),
- $dataUser['email']
- );
+ return generateSuccessResponse($email, $lang);
+}
- // send back
- return prepareExchangedData(
- array(
- 'error' => false,
- 'message' => $post_send_mail,
- 'email' => $dataUser['email'],
- 'email_result' => str_replace(
- '#email#',
- '' . obfuscateEmail($dataUser['email']) . '',
- addslashes($lang->get('admin_email_result_ok'))
- ),
- ),
- 'encode'
- );
- }
-
- // send back
- return prepareExchangedData(
- array(
- 'error' => false,
- 'message' => '',
- 'email' => $dataUser['email'],
- 'email_result' => str_replace(
- '#email#',
- '' . obfuscateEmail($dataUser['email']) . '',
- addslashes($lang->get('admin_email_result_ok'))
- ),
+/**
+ * Generates an error response in JSON format.
+ *
+ * @param string $message Error message.
+ * @param string $code Optional error code.
+ * @return string JSON response.
+ */
+function generateErrorResponse(string $message, string $code = ''): string {
+ return prepareExchangedData([
+ 'error' => true,
+ 'message' => $code . ' ' . $message,
+ ], 'encode');
+}
+
+/**
+ * Generates a success response in JSON format.
+ *
+ * @param string $email User's email address.
+ * @param Language $lang Language object for messages.
+ * @return string JSON response.
+ */
+function generateSuccessResponse(string $email, Language $lang): string {
+ return prepareExchangedData([
+ 'error' => false,
+ 'message' => '',
+ 'email' => $email,
+ 'email_result' => str_replace(
+ '#email#',
+ '' . obfuscateEmail($email) . '',
+ addslashes($lang->get('admin_email_result_ok'))
),
- 'encode'
+ ], 'encode');
+}
+
+/**
+ * Logs a failed authentication attempt for a user.
+ *
+ * @param array $SETTINGS Application settings.
+ * @param string $reason Reason for the failure.
+ * @param string|null $user_login The login of the user (if available).
+ * @return void
+ */
+function logFailedAuth(array $SETTINGS, string $reason, ?string $user_login): void {
+ logEvents(
+ $SETTINGS,
+ 'user_connection',
+ $reason,
+ 'null',
+ $user_login
);
}
-function sendEmailsNotSent(
- array $SETTINGS
-)
+
+/**
+ * Sends emails that have not been sent yet.
+ *
+ * @param array $SETTINGS The application settings.
+ * @return void
+ */
+function sendEmailsNotSent(array $SETTINGS): void
{
$emailSettings = new EmailSettings($SETTINGS);
$emailService = new EmailService();
@@ -2180,168 +2363,183 @@ function startReEncryptingUserSharekeys(
);
}
+
/**
- * Permits to encrypt user's keys
+ * Encrypts or re-encrypts user's shared keys through multiple steps.
*
- * @param integer $post_user_id
- * @param boolean $post_self_change
- * @param string $post_action
- * @param integer $post_start
- * @param integer $post_length
- * @param array $SETTINGS
- * @return string
+ * @param int $post_user_id ID of the user whose keys are being encrypted.
+ * @param bool $post_self_change Indicates if the change is triggered by the user.
+ * @param string $post_action Current step of the encryption process.
+ * @param int $post_start Start index for the current batch.
+ * @param int $post_length Number of items to process in the current batch.
+ * @param array $SETTINGS Application settings.
+ * @return string JSON-encoded response indicating the next step or an error message.
*/
function continueReEncryptingUserSharekeys(
- int $post_user_id,
- bool $post_self_change,
- string $post_action,
- int $post_start,
- int $post_length,
- array $SETTINGS
-): string
-{
- // Load user's language
+ int $post_user_id,
+ bool $post_self_change,
+ string $post_action,
+ int $post_start,
+ int $post_length,
+ array $SETTINGS
+): string {
$session = SessionManager::getSession();
$lang = new Language($session->get('user-language') ?? 'english');
-
- if (isUserIdValid($post_user_id) === true) {
- // Check if user exists
- $userInfo = DB::queryFirstRow(
- 'SELECT public_key
- FROM ' . prefixTable('users') . '
- WHERE id = %i',
- $post_user_id
- );
- if (isset($userInfo['public_key']) === true) {
- $return = [];
-
- // WHAT STEP TO PERFORM?
- if ($post_action === 'step0') {
- // CLear old sharekeys
- if ($post_self_change === false) {
- deleteUserObjetsKeys($post_user_id, $SETTINGS);
- }
+ error_log("continueReEncryptingUserSharekeys: post_user_id: $post_user_id, post_self_change: $post_self_change, post_action: $post_action, post_start: $post_start, post_length: $post_length");
- $return['post_action'] = 'step10';
- }
-
- // STEP 1 - ITEMS
- elseif ($post_action === 'step10') {
- $return = continueReEncryptingUserSharekeysStep10(
- $post_user_id,
- $post_self_change,
- $post_action,
- $post_start,
- $post_length,
- $userInfo['public_key'],
- $SETTINGS
- );
- }
+ // Validate the user ID
+ if (!isUserIdValid($post_user_id)) {
+ return prepareErrorResponse($lang->get('error_no_user'), $post_user_id);
+ }
- // STEP 2 - LOGS
- elseif ($post_action === 'step20') {
- $return = continueReEncryptingUserSharekeysStep20(
- $post_user_id,
- $post_self_change,
- $post_action,
- $post_start,
- $post_length,
- $userInfo['public_key'],
- $SETTINGS
- );
- }
+ // Retrieve user information
+ $userInfo = getUserPublicKey($post_user_id);
+ if (!$userInfo || !isset($userInfo['public_key'])) {
+ return prepareFinishedResponse($post_user_id, $post_self_change);
+ }
- // STEP 3 - FIELDS
- elseif ($post_action === 'step30') {
- $return = continueReEncryptingUserSharekeysStep30(
- $post_user_id,
- $post_self_change,
- $post_action,
- $post_start,
- $post_length,
- $userInfo['public_key'],
- $SETTINGS
- );
- }
-
- // STEP 4 - SUGGESTIONS
- elseif ($post_action === 'step40') {
- $return = continueReEncryptingUserSharekeysStep40(
- $post_user_id,
- $post_self_change,
- $post_action,
- $post_start,
- $post_length,
- $userInfo['public_key'],
- $SETTINGS
- );
- }
-
- // STEP 5 - FILES
- elseif ($post_action === 'step50') {
- $return = continueReEncryptingUserSharekeysStep50(
- $post_user_id,
- $post_self_change,
- $post_action,
- $post_start,
- $post_length,
- $userInfo['public_key'],
- $SETTINGS
- );
- }
-
- // STEP 6 - PERSONAL ITEMS
- elseif ($post_action === 'step60') {
- $return = continueReEncryptingUserSharekeysStep60(
- $post_user_id,
- $post_self_change,
- $post_action,
- $post_start,
- $post_length,
- $userInfo['public_key'],
- $SETTINGS
- );
+ // Perform the appropriate step
+ $response = handleEncryptionStep(
+ $post_user_id,
+ $post_self_change,
+ $post_action,
+ $post_start,
+ $post_length,
+ $userInfo['public_key'],
+ $SETTINGS
+ );
+
+ return prepareExchangedData($response, 'encode');
+}
+
+/**
+ * Retrieves user information from the database.
+ *
+ * @param int $userId ID of the user.
+ * @return array|null User information or null if the user does not exist.
+ */
+function getUserPublicKey(int $userId): ?array {
+ return DB::queryFirstRow(
+ 'SELECT public_key FROM ' . prefixTable('users') . ' WHERE id = %i',
+ $userId
+ );
+}
+
+/**
+ * Handles the logic for each step of the encryption process.
+ *
+ * @param int $userId ID of the user.
+ * @param bool $selfChange Indicates if the change is triggered by the user.
+ * @param string $action Current step of the encryption process.
+ * @param int $start Start index for the current batch.
+ * @param int $length Number of items to process in the current batch.
+ * @param string $publicKey User's public key.
+ * @param array $settings Application settings.
+ * @return array Response data for the current step or next step.
+ */
+function handleEncryptionStep(
+ int $userId,
+ bool $selfChange,
+ string $action,
+ int $start,
+ int $length,
+ string $publicKey,
+ array $settings
+): array {
+ $response = [];
+
+ switch ($action) {
+ case 'step0':
+ if (!$selfChange) {
+ deleteUserObjetsKeys($userId, $settings);
}
-
- // Continu with next step
- return prepareExchangedData(
- array(
- 'error' => false,
- 'message' => '',
- 'step' => isset($return['post_action']) === true ? $return['post_action'] : '',
- 'start' => isset($return['next_start']) === true ? $return['next_start'] : 0,
- 'userId' => $post_user_id,
- 'self_change' => $post_self_change,
- ),
- 'encode'
- );
- }
-
- // Nothing to do
- return prepareExchangedData(
- array(
+ $response['post_action'] = 'step10';
+ break;
+
+ case 'step10':
+ $response = continueReEncryptingUserSharekeysStep10($userId, $selfChange, $action, $start, $length, $publicKey, $settings);
+ break;
+
+ case 'step20':
+ $response = continueReEncryptingUserSharekeysStep20($userId, $selfChange, $action, $start, $length, $publicKey, $settings);
+ break;
+
+ case 'step30':
+ $response = continueReEncryptingUserSharekeysStep30($userId, $selfChange, $action, $start, $length, $publicKey, $settings);
+ break;
+
+ case 'step40':
+ $response = continueReEncryptingUserSharekeysStep40($userId, $selfChange, $action, $start, $length, $publicKey, $settings);
+ break;
+
+ case 'step50':
+ $response = continueReEncryptingUserSharekeysStep50($userId, $selfChange, $action, $start, $length, $publicKey, $settings);
+ break;
+
+ case 'step60':
+ $response = continueReEncryptingUserSharekeysStep60($userId, $selfChange, $action, $start, $length, $publicKey, $settings);
+ break;
+
+ default:
+ $response = [
'error' => false,
'message' => '',
'step' => 'finished',
'start' => 0,
- 'userId' => $post_user_id,
- 'self_change' => $post_self_change,
- ),
- 'encode'
- );
+ 'userId' => $userId,
+ 'self_change' => $selfChange,
+ ];
+ break;
}
-
- // Nothing to do
+
+ // Add common fields
+ $response['userId'] = $userId;
+ $response['self_change'] = $selfChange;
+
+ return $response;
+}
+
+/**
+ * Prepares an error response.
+ *
+ * @param string $message Error message.
+ * @param int $userId User ID causing the error.
+ * @return string JSON-encoded error response.
+ */
+function prepareErrorResponse(string $message, int $userId): string {
return prepareExchangedData(
- array(
+ [
'error' => true,
- 'message' => $lang->get('error_no_user'),
- 'extra' => $post_user_id,
- ),
+ 'message' => $message,
+ 'extra' => $userId,
+ ],
+ 'encode'
+ );
+}
+
+/**
+ * Prepares a response indicating that the process is finished.
+ *
+ * @param int $userId ID of the user.
+ * @param bool $selfChange Indicates if the change is triggered by the user.
+ * @return string JSON-encoded response for a finished process.
+ */
+function prepareFinishedResponse(int $userId, bool $selfChange): string {
+ return prepareExchangedData(
+ [
+ 'error' => false,
+ 'message' => '',
+ 'step' => 'finished',
+ 'start' => 0,
+ 'userId' => $userId,
+ 'self_change' => $selfChange,
+ ],
'encode'
);
}
+
+
function continueReEncryptingUserSharekeysStep10(
int $post_user_id,
bool $post_self_change,
diff --git a/sources/tree.php b/sources/tree.php
index 4d893a212..9910f57ae 100755
--- a/sources/tree.php
+++ b/sources/tree.php
@@ -566,18 +566,19 @@ function prepareNodeJson(
];
}
+
/**
- * Get the context of the folder
+ * Prepares the context of a folder based on user session and folder data.
*
- * @param integer $nodeId
+ * @param int $nodeId
* @param array $session_groupes_visibles
* @param array $session_read_only_folders
* @param array $session_personal_visible_groups
- * @param integer $nbItemsInFolder
- * @param integer $nbItemsInSubfolders
- * @param integer $nbSubfolders
+ * @param int $nbItemsInFolder
+ * @param int $nbItemsInSubfolders
+ * @param int $nbSubfolders
* @param array $session_list_folders_limited
- * @param integer $tree_counters
+ * @param int $tree_counters
* @param bool $session_user_read_only
* @param array $listFoldersLimitedKeys
* @param array $listRestrictedFoldersForItemsKeys
@@ -602,125 +603,175 @@ function prepareNodeData(
array $session_list_restricted_folders_for_items,
array $session_personal_folder,
NestedTree $tree
-): array
-{
+): array {
$session = SessionManager::getSession();
- // Load user's language
$lang = new Language($session->get('user-language') ?? 'english');
+
+ // Determine if the folder is personal
+ $isPersonalFolder = in_array($nodeId, $session_personal_folder) === true ? 1 : 0;
+
+ // Case 1: Node is visible in user's groups
+ if (in_array($nodeId, $session_groupes_visibles)) {
+ return handleVisibleNode(
+ $nodeId,
+ $session_read_only_folders,
+ $session_personal_visible_groups,
+ $nbItemsInFolder,
+ $nbItemsInSubfolders,
+ $nbSubfolders,
+ $tree_counters,
+ $session_user_read_only,
+ $isPersonalFolder,
+ $lang
+ );
+ }
- if (in_array($nodeId, $session_groupes_visibles) === true) {
- // special case for READ-ONLY folder
- if (in_array($nodeId, $session_read_only_folders) === true) {
- return [
- 'html' => ''.
- ($tree_counters === 1 ? '' . $nbItemsInFolder .'/'.$nbItemsInSubfolders .'/'.$nbSubfolders. '' : ''),
- 'title' => $lang->get('read_only_account'),
- 'restricted' => 1,
- 'folderClass' => 'folder_not_droppable',
- 'show_but_block' => false,
- 'hide_node' => false,
- 'is_pf' => in_array($nodeId, $session_personal_folder) === true ? 1 : 0,
- ];
-
- } elseif (
- $session_user_read_only === true
- && in_array($nodeId, $session_personal_visible_groups) === false
- ) {
- return [
- 'html' => ''.
- ($tree_counters === 1 ? '' . $nbItemsInFolder .'/'.$nbItemsInSubfolders .'/'.$nbSubfolders. '' : ''),
- 'title' => $lang->get('read_only_account'),
- 'restricted' => 0,
- 'folderClass' => 'folder',
- 'show_but_block' => false,
- 'hide_node' => false,
- 'is_pf' => in_array($nodeId, $session_personal_folder) === true ? 1 : 0,
- ];
- }
-
- return [
- 'html' => ($tree_counters === 1 ? '' . $nbItemsInFolder .'/'.$nbItemsInSubfolders .'/'.$nbSubfolders. '' : ''),
- 'title' => '',
- 'restricted' => 0,
- 'folderClass' => 'folder',
- 'show_but_block' => false,
- 'hide_node' => false,
- 'is_pf' => in_array($nodeId, $session_personal_folder) === true ? 1 : 0,
- ];
-
- } elseif (in_array($nodeId, $listFoldersLimitedKeys) === true) {
- return [
- 'html' => ($session_user_read_only === true ? '' : '') .
- ($tree_counters === 1 ? '' . count($session_list_folders_limited[$nodeId]) . '' : ''),
- 'title' => '',
- 'restricted' => 1,
- 'folderClass' => 'folder',
- 'show_but_block' => false,
- 'hide_node' => false,
- 'is_pf' => in_array($nodeId, $session_personal_folder) === true ? 1 : 0,
- ];
+ // Case 2: Node is limited in user's folders
+ if (in_array($nodeId, $listFoldersLimitedKeys)) {
+ return createNodeData(
+ $session_user_read_only ? '' : '',
+ $tree_counters === 1 ? '' . count($session_list_folders_limited[$nodeId]) . '' : '',
+ 1, // restricted
+ 'folder',
+ false,
+ false,
+ $isPersonalFolder
+ );
+ }
- } elseif (in_array($nodeId, $listRestrictedFoldersForItemsKeys) === true) {
- return [
- 'html' => $session_user_read_only === true ? '' : '' .
- '' . count($session_list_restricted_folders_for_items[$nodeId]) . '',
- 'title' => '',
- 'restricted' => 1,
- 'folderClass' => 'folder',
- 'show_but_block' => false,
- 'hide_node' => false,
- 'is_pf' => in_array($nodeId, $session_personal_folder) === true ? 1 : 0,
- ];
+ // Case 3: Node is restricted for items
+ if (in_array($nodeId, $listRestrictedFoldersForItemsKeys)) {
+ return createNodeData(
+ $session_user_read_only ? '' : '',
+ '' . count($session_list_restricted_folders_for_items[$nodeId]) . '',
+ 1, // restricted
+ 'folder',
+ false,
+ false,
+ $isPersonalFolder
+ );
+ }
- } elseif ((int) $nbSubfolders === 0
- //&& (int) $show_only_accessible_folders === 1
- ) {
- // folder should not be visible
- // only if it has no descendants
+ // Case 4: Node has no subfolders and no accessible descendants
+ if ((int)$nbSubfolders === 0) {
$nodeDirectDescendants = $tree->getDescendants($nodeId, false, false, true);
- if (
- count(
- array_diff(
- $nodeDirectDescendants,
- array_merge(
- $session_groupes_visibles,
- array_keys($session_list_restricted_folders_for_items)
- )
- )
- ) !== count($nodeDirectDescendants)
- ) {
- // show it but block it
- return [
- 'html' => '',
- 'title' => '',
- 'restricted' => 1,
- 'folderClass' => 'folder_not_droppable',
- 'show_but_block' => true,
- 'hide_node' => false,
- 'is_pf' => in_array($nodeId, $session_personal_folder) === true ? 1 : 0,
- ];
+ $accessibleDescendants = array_merge(
+ $session_groupes_visibles,
+ array_keys($session_list_restricted_folders_for_items)
+ );
+ $hasAccessibleDescendants = count(array_diff($nodeDirectDescendants, $accessibleDescendants)) !== count($nodeDirectDescendants);
+
+ if ($hasAccessibleDescendants) {
+ // Show node but block it
+ return createNodeData('', '', 1, 'folder_not_droppable', true, false, $isPersonalFolder);
}
-
- // hide it
- return [
- 'html' => '',
- 'title' => '',
- 'restricted' => 1,
- 'folderClass' => 'folder_not_droppable',
- 'show_but_block' => false,
- 'hide_node' => true,
- 'is_pf' => in_array($nodeId, $session_personal_folder) === true ? 1 : 0,
- ];
+
+ // Hide node
+ return createNodeData('', '', 1, 'folder_not_droppable', false, true, $isPersonalFolder);
+ }
+
+ // Default case: Node is restricted and blocked
+ return createNodeData('', '', 1, 'folder_not_droppable', true, false, $isPersonalFolder);
+}
+
+/**
+ * Handles the logic for visible nodes.
+ *
+ * @param int $nodeId
+ * @param array $session_read_only_folders
+ * @param array $session_personal_visible_groups
+ * @param int $nbItemsInFolder
+ * @param int $nbItemsInSubfolders
+ * @param int $nbSubfolders
+ * @param int $tree_counters
+ * @param bool $session_user_read_only
+ * @param int $isPersonalFolder
+ * @param Language $lang
+ * @return array
+ */
+function handleVisibleNode(
+ int $nodeId,
+ array $session_read_only_folders,
+ array $session_personal_visible_groups,
+ int $nbItemsInFolder,
+ int $nbItemsInSubfolders,
+ int $nbSubfolders,
+ int $tree_counters,
+ bool $session_user_read_only,
+ int $isPersonalFolder,
+ Language $lang
+): array {
+ // Check if the folder is read-only
+ if (in_array($nodeId, $session_read_only_folders)) {
+ return createNodeData(
+ '',
+ $tree_counters === 1 ? '' . $nbItemsInFolder . '/' . $nbItemsInSubfolders . '/' . $nbSubfolders . '' : '',
+ 1, // restricted
+ 'folder_not_droppable',
+ false,
+ false,
+ $isPersonalFolder,
+ $lang->get('read_only_account')
+ );
+ }
+
+ // Check if user is read-only and folder is not personal
+ if ($session_user_read_only && !in_array($nodeId, $session_personal_visible_groups)) {
+ return createNodeData(
+ '',
+ $tree_counters === 1 ? '' . $nbItemsInFolder . '/' . $nbItemsInSubfolders . '/' . $nbSubfolders . '' : '',
+ 0, // not restricted
+ 'folder',
+ false,
+ false,
+ $isPersonalFolder,
+ $lang->get('read_only_account')
+ );
}
+ // Default case for visible nodes
+ return createNodeData(
+ '',
+ $tree_counters === 1 ? '' . $nbItemsInFolder . '/' . $nbItemsInSubfolders . '/' . $nbSubfolders . '' : '',
+ 0, // not restricted
+ 'folder',
+ false,
+ false,
+ $isPersonalFolder
+ );
+}
+
+/**
+ * Creates a standardized array for node data.
+ *
+ * @param string $html The HTML content for the node
+ * @param string $badgeHtml The HTML content for the badge
+ * @param int $restricted The restricted status
+ * @param string $folderClass The folder class
+ * @param bool $showButBlock The show but block status
+ * @param bool $hideNode The hide node status
+ * @param int $isPersonalFolder The personal folder status
+ * @param string $title The title
+ * @return array
+ */
+function createNodeData(
+ string $html,
+ string $badgeHtml,
+ int $restricted,
+ string $folderClass,
+ bool $showButBlock,
+ bool $hideNode,
+ int $isPersonalFolder,
+ string $title = ''
+): array {
return [
- 'html' => '',
- 'title' => '',
- 'restricted' => 1,
- 'folderClass' => 'folder_not_droppable',
- 'show_but_block' => true,
- 'hide_node' => false,
- 'is_pf' => in_array($nodeId, $session_personal_folder) === true ? 1 : 0,
+ 'html' => $html . $badgeHtml,
+ 'title' => $title,
+ 'restricted' => $restricted,
+ 'folderClass' => $folderClass,
+ 'show_but_block' => $showButBlock,
+ 'hide_node' => $hideNode,
+ 'is_pf' => $isPersonalFolder,
];
}
diff --git a/sources/upload.attachments.php b/sources/upload.attachments.php
index eca91bba5..7c1e7db3f 100755
--- a/sources/upload.attachments.php
+++ b/sources/upload.attachments.php
@@ -95,7 +95,9 @@
} elseif (null !== $request->query->get('PHPSESSID')) {
session_id(filter_var($request->query->get('PHPSESSID'), FILTER_SANITIZE_FULL_SPECIAL_CHARS));
} else {
- handleAttachmentError('No Session was found.', 100);
+ $errorResponse = handleAttachmentError('No Session was found.', 100);
+ echo $errorResponse;
+ return;
}
// Prepare POST variables
@@ -114,8 +116,9 @@
// token check
if (null === $post_user_token) {
- handleAttachmentError('No user token found.', 110);
- exit();
+ $errorResponse = handleAttachmentError('No user token found.', 110);
+ echo $errorResponse;
+ return;
} else {
// Check post_max_size
$POST_MAX_SIZE = ini_get('post_max_size');
@@ -126,15 +129,20 @@
// CHeck if the POST is too big
if (!empty($_SERVER['CONTENT_LENGTH']) && (int)$_SERVER['CONTENT_LENGTH'] > $maxSize && $maxSize > 0) {
- handleAttachmentError('POST exceeded maximum allowed size.', 111, 413);
+ $errorResponse = handleAttachmentError('POST exceeded maximum allowed size.', 111, 413);
+ echo $errorResponse;
+ return;
}
// CHeck if file size is too big
if ($post_fileSize > $maxSize && $maxSize > 0) {
- handleAttachmentError('File exceeds the maximum allowed size', 120, 413);
- die();
+ $errorResponse = handleAttachmentError('File exceeds the maximum allowed size', 120, 413);
+ echo $errorResponse;
+ return;
+ }
+ if (DEBUG === true) {
+ error_log('TEAMPASS DEBUG : POST_MAX_SIZE: ' . $POST_MAX_SIZE." - CONTENT_LENGTH: ".$_SERVER['CONTENT_LENGTH']." - UNIT: ".$unit." - MAX: ".$maxSize." - MULTIPLIER: ".$multiplier." - FILE_SIZE: ".$post_fileSize);
}
- error_log('POST_MAX_SIZE: ' . $POST_MAX_SIZE." - CONTENT_LENGTH: ".$_SERVER['CONTENT_LENGTH']." - UNIT: ".$unit." - MAX: ".$maxSize." - MULTIPLIER: ".$multiplier." - FILE_SIZE: ".$post_fileSize);
// delete expired tokens
DB::delete(prefixTable('tokens'), 'end_timestamp < %i', time());
@@ -178,8 +186,9 @@
} else {
// no more files to upload, kill session
$session->remove($post_user_token);
- handleAttachmentError('No user token found.', 110);
- die();
+ $errorResponse = handleAttachmentError('No user token found.', 110);
+ echo $errorResponse;
+ return;
}
// check if token is expired
@@ -204,8 +213,9 @@
if (time() > $data['end_timestamp']) {
// too old
$session->remove($post_user_token);
- handleAttachmentError('User token expired.', 110);
- die();
+ $errorResponse = handleAttachmentError('User token expired.', 110);
+ echo $errorResponse;
+ return;
}
}
@@ -236,27 +246,41 @@
// Validate the file size (Warning: the largest files supported by this code is 2GB)
$file_size = @filesize($_FILES['file']['tmp_name']);
if ($file_size === false || (int) $file_size > (int) $max_file_size_in_bytes) {
- handleAttachmentError('File exceeds the maximum allowed size', 120, 413);
+ $errorResponse = handleAttachmentError('File exceeds the maximum allowed size', 120, 413);
+ echo $errorResponse;
+ return;
}
if ($file_size <= 0) {
- handleAttachmentError('File size outside allowed lower bound', 112);
+ $errorResponse = handleAttachmentError('File size outside allowed lower bound', 112);
+ echo $errorResponse;
+ return;
}
// Validate the upload
if (!isset($_FILES['file'])) {
- handleAttachmentError('No upload found in $_FILES for Filedata', 121);
+ $errorResponse = handleAttachmentError('No upload found in $_FILES for Filedata', 121);
+ echo $errorResponse;
+ return;
} elseif (isset($_FILES['file']['error']) && $_FILES['file']['error'] != 0) {
- handleAttachmentError($uploadErrors[$_FILES['Filedata']['error']], 122);
+ $errorResponse = handleAttachmentError($uploadErrors[$_FILES['Filedata']['error']], 122);
+ echo $errorResponse;
+ return;
} elseif (!isset($_FILES['file']['tmp_name']) || !@is_uploaded_file($_FILES['file']['tmp_name'])) {
- handleAttachmentError('Upload failed is_uploaded_file test.', 123);
+ $errorResponse = handleAttachmentError('Upload failed is_uploaded_file test.', 123);
+ echo $errorResponse;
+ return;
} elseif (!isset($_FILES['file']['name'])) {
- handleAttachmentError('File has no name.', 113);
+ $errorResponse = handleAttachmentError('File has no name.', 113);
+ echo $errorResponse;
+ return;
}
// Validate file name (for our purposes we'll just remove invalid characters)
$file_name = preg_replace('[^A-Za-z0-9]', '', strtolower(basename($_FILES['file']['name'])));
if (strlen($file_name) == 0 || strlen($file_name) > $MAX_FILENAME_LENGTH) {
- handleAttachmentError('Invalid file name: ' . $file_name . '.', 114);
+ $errorResponse = handleAttachmentError('Invalid file name: ' . $file_name . '.', 114);
+ echo $errorResponse;
+ return;
}
// Validate file extension
@@ -271,7 +295,9 @@
)
) === false
) {
- handleAttachmentError('Invalid file extension.', 115, 415);
+ $errorResponse = handleAttachmentError('Invalid file extension.', 115, 415);
+ echo $errorResponse;
+ return;
}
// 5 minutes execution time
@@ -494,7 +520,7 @@ function handleAttachmentError($message, $code, $http_code = 400)
http_response_code($http_code);
// json error message
- echo json_encode([
+ return json_encode([
'jsonrpc' => '2.0',
'error' => [
'code' => $code,
@@ -502,7 +528,4 @@ function handleAttachmentError($message, $code, $http_code = 400)
],
'id' => 'id'
]);
-
- // Force exit to avoid bypass filters.
- exit;
}
diff --git a/vendor/bin/carbon b/vendor/bin/carbon
index d6da140be..86fbfdfd8 100755
--- a/vendor/bin/carbon
+++ b/vendor/bin/carbon
@@ -108,10 +108,12 @@ if (PHP_VERSION_ID < 80000) {
}
}
- if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
- include("phpvfscomposer://" . __DIR__ . '/..'.'/nesbot/carbon/bin/carbon');
- exit(0);
+ if (
+ (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
+ || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
+ ) {
+ return include("phpvfscomposer://" . __DIR__ . '/..'.'/nesbot/carbon/bin/carbon');
}
}
-include __DIR__ . '/..'.'/nesbot/carbon/bin/carbon';
+return include __DIR__ . '/..'.'/nesbot/carbon/bin/carbon';
diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php
index 51e734a77..07b32ed6e 100644
--- a/vendor/composer/InstalledVersions.php
+++ b/vendor/composer/InstalledVersions.php
@@ -322,6 +322,7 @@ private static function getInstalled()
}
$installed = array();
+ $copiedLocalDir = false;
if (self::$canGetVendors) {
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
@@ -330,9 +331,11 @@ private static function getInstalled()
} elseif (is_file($vendorDir.'/composer/installed.php')) {
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */
$required = require $vendorDir.'/composer/installed.php';
- $installed[] = self::$installedByVendor[$vendorDir] = $required;
- if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
- self::$installed = $installed[count($installed) - 1];
+ self::$installedByVendor[$vendorDir] = $required;
+ $installed[] = $required;
+ if (strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
+ self::$installed = $required;
+ $copiedLocalDir = true;
}
}
}
@@ -350,7 +353,7 @@ private static function getInstalled()
}
}
- if (self::$installed !== array()) {
+ if (self::$installed !== array() && !$copiedLocalDir) {
$installed[] = self::$installed;
}
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index ade7c8251..31bbe83eb 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -1343,6 +1343,7 @@
'League\\OAuth2\\Client\\Token\\AccessToken' => $vendorDir . '/league/oauth2-client/src/Token/AccessToken.php',
'League\\OAuth2\\Client\\Token\\AccessTokenInterface' => $vendorDir . '/league/oauth2-client/src/Token/AccessTokenInterface.php',
'League\\OAuth2\\Client\\Token\\ResourceOwnerAccessTokenInterface' => $vendorDir . '/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php',
+ 'League\\OAuth2\\Client\\Token\\SettableRefreshTokenInterface' => $vendorDir . '/league/oauth2-client/src/Token/SettableRefreshTokenInterface.php',
'League\\OAuth2\\Client\\Tool\\ArrayAccessorTrait' => $vendorDir . '/league/oauth2-client/src/Tool/ArrayAccessorTrait.php',
'League\\OAuth2\\Client\\Tool\\BearerAuthorizationTrait' => $vendorDir . '/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php',
'League\\OAuth2\\Client\\Tool\\GuardedPropertyTrait' => $vendorDir . '/league/oauth2-client/src/Tool/GuardedPropertyTrait.php',
@@ -1602,6 +1603,13 @@
'Symfony\\Component\\Cache\\Traits\\RedisTrait' => $vendorDir . '/symfony/cache/Traits/RedisTrait.php',
'Symfony\\Component\\Cache\\Traits\\RelayProxy' => $vendorDir . '/symfony/cache/Traits/RelayProxy.php',
'Symfony\\Component\\Cache\\Traits\\RelayProxyTrait' => $vendorDir . '/symfony/cache/Traits/RelayProxyTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\CopyTrait' => $vendorDir . '/symfony/cache/Traits/Relay/CopyTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\GeosearchTrait' => $vendorDir . '/symfony/cache/Traits/Relay/GeosearchTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\GetrangeTrait' => $vendorDir . '/symfony/cache/Traits/Relay/GetrangeTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\HsetTrait' => $vendorDir . '/symfony/cache/Traits/Relay/HsetTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\MoveTrait' => $vendorDir . '/symfony/cache/Traits/Relay/MoveTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\NullableReturnTrait' => $vendorDir . '/symfony/cache/Traits/Relay/NullableReturnTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\PfcountTrait' => $vendorDir . '/symfony/cache/Traits/Relay/PfcountTrait.php',
'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php',
'Symfony\\Component\\Console\\Attribute\\AsCommand' => $vendorDir . '/symfony/console/Attribute/AsCommand.php',
'Symfony\\Component\\Console\\CI\\GithubActionReporter' => $vendorDir . '/symfony/console/CI/GithubActionReporter.php',
@@ -2196,6 +2204,10 @@
'Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/contracts/Service/ServiceSubscriberTrait.php',
'Symfony\\Contracts\\Service\\Test\\ServiceLocatorTest' => $vendorDir . '/symfony/contracts/Service/Test/ServiceLocatorTest.php',
'Symfony\\Contracts\\Service\\Test\\ServiceLocatorTestCase' => $vendorDir . '/symfony/contracts/Service/Test/ServiceLocatorTestCase.php',
+ 'Symfony\\Contracts\\Tests\\Cache\\CacheTraitTest' => $vendorDir . '/symfony/contracts/Tests/Cache/CacheTraitTest.php',
+ 'Symfony\\Contracts\\Tests\\Service\\LegacyTestService' => $vendorDir . '/symfony/contracts/Tests/Service/LegacyTestService.php',
+ 'Symfony\\Contracts\\Tests\\Service\\ServiceMethodsSubscriberTraitTest' => $vendorDir . '/symfony/contracts/Tests/Service/ServiceMethodsSubscriberTraitTest.php',
+ 'Symfony\\Contracts\\Tests\\Service\\ServiceSubscriberTraitTest' => $vendorDir . '/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php',
'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => $vendorDir . '/symfony/contracts/Translation/LocaleAwareInterface.php',
'Symfony\\Contracts\\Translation\\Test\\TranslatorTest' => $vendorDir . '/symfony/contracts/Translation/Test/TranslatorTest.php',
'Symfony\\Contracts\\Translation\\TranslatableInterface' => $vendorDir . '/symfony/contracts/Translation/TranslatableInterface.php',
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 36e1733b8..025704cab 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -7,7 +7,7 @@
return array(
'voku\\helper\\' => array($vendorDir . '/voku/anti-xss/src/voku/helper'),
- 'voku\\' => array($vendorDir . '/voku/portable-utf8/src/voku', $vendorDir . '/voku/portable-ascii/src/voku'),
+ 'voku\\' => array($vendorDir . '/voku/portable-ascii/src/voku', $vendorDir . '/voku/portable-utf8/src/voku'),
'ZxcvbnPhp\\' => array($vendorDir . '/bjeavons/zxcvbn-php/src'),
'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
'TiBeN\\' => array($vendorDir . '/tiben/crontab-manager/src'),
@@ -70,7 +70,7 @@
'JsonSchema\\' => array($vendorDir . '/justinrainbow/json-schema/src/JsonSchema'),
'Illuminate\\Validation\\' => array($vendorDir . '/illuminate/validation'),
'Illuminate\\Translation\\' => array($vendorDir . '/illuminate/translation'),
- 'Illuminate\\Support\\' => array($vendorDir . '/illuminate/macroable', $vendorDir . '/illuminate/conditionable', $vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/support'),
+ 'Illuminate\\Support\\' => array($vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/conditionable', $vendorDir . '/illuminate/macroable', $vendorDir . '/illuminate/support'),
'Illuminate\\Filesystem\\' => array($vendorDir . '/illuminate/filesystem'),
'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'),
'Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'),
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
index 4ceffb704..66e327cbb 100644
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -35,7 +35,7 @@ public static function getLoader()
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInite3f3ee27f81ca21f7bd7499d7b935c11::getInitializer($loader));
- $loader->setApcuPrefix('320c3616d334d4073af5');
+ $loader->setApcuPrefix('df3457bef81cf05714b9');
$loader->register(true);
$filesToLoad = \Composer\Autoload\ComposerStaticInite3f3ee27f81ca21f7bd7499d7b935c11::$files;
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 86a2c0b5c..d25e5dd5e 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -193,8 +193,8 @@ class ComposerStaticInite3f3ee27f81ca21f7bd7499d7b935c11
),
'voku\\' =>
array (
- 0 => __DIR__ . '/..' . '/voku/portable-utf8/src/voku',
- 1 => __DIR__ . '/..' . '/voku/portable-ascii/src/voku',
+ 0 => __DIR__ . '/..' . '/voku/portable-ascii/src/voku',
+ 1 => __DIR__ . '/..' . '/voku/portable-utf8/src/voku',
),
'ZxcvbnPhp\\' =>
array (
@@ -447,9 +447,9 @@ class ComposerStaticInite3f3ee27f81ca21f7bd7499d7b935c11
),
'Illuminate\\Support\\' =>
array (
- 0 => __DIR__ . '/..' . '/illuminate/macroable',
+ 0 => __DIR__ . '/..' . '/illuminate/collections',
1 => __DIR__ . '/..' . '/illuminate/conditionable',
- 2 => __DIR__ . '/..' . '/illuminate/collections',
+ 2 => __DIR__ . '/..' . '/illuminate/macroable',
3 => __DIR__ . '/..' . '/illuminate/support',
),
'Illuminate\\Filesystem\\' =>
@@ -1968,6 +1968,7 @@ class ComposerStaticInite3f3ee27f81ca21f7bd7499d7b935c11
'League\\OAuth2\\Client\\Token\\AccessToken' => __DIR__ . '/..' . '/league/oauth2-client/src/Token/AccessToken.php',
'League\\OAuth2\\Client\\Token\\AccessTokenInterface' => __DIR__ . '/..' . '/league/oauth2-client/src/Token/AccessTokenInterface.php',
'League\\OAuth2\\Client\\Token\\ResourceOwnerAccessTokenInterface' => __DIR__ . '/..' . '/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php',
+ 'League\\OAuth2\\Client\\Token\\SettableRefreshTokenInterface' => __DIR__ . '/..' . '/league/oauth2-client/src/Token/SettableRefreshTokenInterface.php',
'League\\OAuth2\\Client\\Tool\\ArrayAccessorTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/ArrayAccessorTrait.php',
'League\\OAuth2\\Client\\Tool\\BearerAuthorizationTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php',
'League\\OAuth2\\Client\\Tool\\GuardedPropertyTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/GuardedPropertyTrait.php',
@@ -2227,6 +2228,13 @@ class ComposerStaticInite3f3ee27f81ca21f7bd7499d7b935c11
'Symfony\\Component\\Cache\\Traits\\RedisTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisTrait.php',
'Symfony\\Component\\Cache\\Traits\\RelayProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RelayProxy.php',
'Symfony\\Component\\Cache\\Traits\\RelayProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/RelayProxyTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\CopyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/CopyTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\GeosearchTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/GeosearchTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\GetrangeTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/GetrangeTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\HsetTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/HsetTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\MoveTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/MoveTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\NullableReturnTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/NullableReturnTrait.php',
+ 'Symfony\\Component\\Cache\\Traits\\Relay\\PfcountTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/PfcountTrait.php',
'Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php',
'Symfony\\Component\\Console\\Attribute\\AsCommand' => __DIR__ . '/..' . '/symfony/console/Attribute/AsCommand.php',
'Symfony\\Component\\Console\\CI\\GithubActionReporter' => __DIR__ . '/..' . '/symfony/console/CI/GithubActionReporter.php',
@@ -2821,6 +2829,10 @@ class ComposerStaticInite3f3ee27f81ca21f7bd7499d7b935c11
'Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/contracts/Service/ServiceSubscriberTrait.php',
'Symfony\\Contracts\\Service\\Test\\ServiceLocatorTest' => __DIR__ . '/..' . '/symfony/contracts/Service/Test/ServiceLocatorTest.php',
'Symfony\\Contracts\\Service\\Test\\ServiceLocatorTestCase' => __DIR__ . '/..' . '/symfony/contracts/Service/Test/ServiceLocatorTestCase.php',
+ 'Symfony\\Contracts\\Tests\\Cache\\CacheTraitTest' => __DIR__ . '/..' . '/symfony/contracts/Tests/Cache/CacheTraitTest.php',
+ 'Symfony\\Contracts\\Tests\\Service\\LegacyTestService' => __DIR__ . '/..' . '/symfony/contracts/Tests/Service/LegacyTestService.php',
+ 'Symfony\\Contracts\\Tests\\Service\\ServiceMethodsSubscriberTraitTest' => __DIR__ . '/..' . '/symfony/contracts/Tests/Service/ServiceMethodsSubscriberTraitTest.php',
+ 'Symfony\\Contracts\\Tests\\Service\\ServiceSubscriberTraitTest' => __DIR__ . '/..' . '/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php',
'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => __DIR__ . '/..' . '/symfony/contracts/Translation/LocaleAwareInterface.php',
'Symfony\\Contracts\\Translation\\Test\\TranslatorTest' => __DIR__ . '/..' . '/symfony/contracts/Translation/Test/TranslatorTest.php',
'Symfony\\Contracts\\Translation\\TranslatableInterface' => __DIR__ . '/..' . '/symfony/contracts/Translation/TranslatableInterface.php',
diff --git a/vendor/composer/ca-bundle/res/cacert.pem b/vendor/composer/ca-bundle/res/cacert.pem
index f2c24a589..eb11b2fd1 100644
--- a/vendor/composer/ca-bundle/res/cacert.pem
+++ b/vendor/composer/ca-bundle/res/cacert.pem
@@ -1,7 +1,7 @@
##
## Bundle of CA Root Certificates
##
-## Certificate data from Mozilla as of: Tue Sep 24 03:12:04 2024 GMT
+## Certificate data from Mozilla as of: Tue Nov 26 13:58:25 2024 GMT
##
## Find updated versions here: https://curl.se/docs/caextract.html
##
@@ -2602,6 +2602,36 @@ vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+
CAezNIm8BZ/3Hobui3A=
-----END CERTIFICATE-----
+GLOBALTRUST 2020
+================
+-----BEGIN CERTIFICATE-----
+MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx
+IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT
+VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh
+BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy
+MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi
+D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO
+VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM
+CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm
+fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA
+A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR
+JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG
+DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU
+clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ
+mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud
+IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
+VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw
+4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9
+iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS
+8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2
+HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS
+vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918
+oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF
+YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl
+gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
+-----END CERTIFICATE-----
+
ANF Secure Server Root CA
=========================
-----BEGIN CERTIFICATE-----
diff --git a/vendor/composer/class-map-generator/README.md b/vendor/composer/class-map-generator/README.md
index 4b5d6a26d..ff27e2ea3 100644
--- a/vendor/composer/class-map-generator/README.md
+++ b/vendor/composer/class-map-generator/README.md
@@ -12,7 +12,7 @@ Installation
Install the latest version with:
```bash
-$ composer require composer/class-map-generator
+composer require composer/class-map-generator
```
diff --git a/vendor/composer/class-map-generator/composer.json b/vendor/composer/class-map-generator/composer.json
index 8d22b72fd..496912c26 100644
--- a/vendor/composer/class-map-generator/composer.json
+++ b/vendor/composer/class-map-generator/composer.json
@@ -20,10 +20,10 @@
},
"require-dev": {
"phpunit/phpunit": "^8",
- "phpstan/phpstan": "^1.6",
- "phpstan/phpstan-deprecation-rules": "^1",
- "phpstan/phpstan-strict-rules": "^1.1",
- "phpstan/phpstan-phpunit": "^1",
+ "phpstan/phpstan": "^1.12 || ^2",
+ "phpstan/phpstan-deprecation-rules": "^1 || ^2",
+ "phpstan/phpstan-strict-rules": "^1.1 || ^2",
+ "phpstan/phpstan-phpunit": "^1 || ^2",
"symfony/filesystem": "^5.4 || ^6"
},
"autoload": {
diff --git a/vendor/composer/class-map-generator/src/ClassMap.php b/vendor/composer/class-map-generator/src/ClassMap.php
index 0d06366a0..797efc688 100644
--- a/vendor/composer/class-map-generator/src/ClassMap.php
+++ b/vendor/composer/class-map-generator/src/ClassMap.php
@@ -176,4 +176,16 @@ public function count(): int
{
return \count($this->map);
}
+
+ /**
+ * Get the raw psr violations
+ *
+ * This is a map of filepath to an associative array of the warning string
+ * and the offending class name.
+ * @return array>
+ */
+ public function getRawPsrViolations(): array
+ {
+ return $this->psrViolations;
+ }
}
diff --git a/vendor/composer/class-map-generator/src/ClassMapGenerator.php b/vendor/composer/class-map-generator/src/ClassMapGenerator.php
index 8f040e022..ee1308a3a 100644
--- a/vendor/composer/class-map-generator/src/ClassMapGenerator.php
+++ b/vendor/composer/class-map-generator/src/ClassMapGenerator.php
@@ -207,6 +207,8 @@ public function scanPaths($path, ?string $excluded = null, string $autoloadType
* @param 'psr-0'|'psr-4' $namespaceType
* @param string $basePath root directory of given autoload mapping
* @return array valid classes
+ *
+ * @throws \InvalidArgumentException When namespaceType is neither psr-0 nor psr-4
*/
private function filterByNamespace(array $classes, string $filePath, string $baseNamespace, string $namespaceType, string $basePath): array
{
diff --git a/vendor/composer/class-map-generator/src/PhpFileParser.php b/vendor/composer/class-map-generator/src/PhpFileParser.php
index 78622de37..b687bce92 100644
--- a/vendor/composer/class-map-generator/src/PhpFileParser.php
+++ b/vendor/composer/class-map-generator/src/PhpFileParser.php
@@ -24,7 +24,7 @@ class PhpFileParser
*
* @param string $path The file to check
* @throws \RuntimeException
- * @return array The found classes
+ * @return list The found classes
*/
public static function findClasses(string $path): array
{
@@ -98,7 +98,9 @@ public static function findClasses(string $path): array
$name = substr($name, 0, $colonPos);
}
}
- $classes[] = ltrim($namespace . $name, '\\');
+ /** @var class-string */
+ $className = ltrim($namespace . $name, '\\');
+ $classes[] = $className;
}
}
diff --git a/vendor/composer/composer/bin/composer b/vendor/composer/composer/bin/composer
index 8bc77e660..4f6d08f72 100755
--- a/vendor/composer/composer/bin/composer
+++ b/vendor/composer/composer/bin/composer
@@ -42,7 +42,12 @@ if (!extension_loaded('iconv') && !extension_loaded('mbstring')) {
}
if (function_exists('ini_set')) {
- @ini_set('display_errors', '1');
+ // check if error logging is on, but to an empty destination - for the CLI SAPI, that means stderr
+ $logsToSapiDefault = ('' === ini_get('error_log') && (bool) ini_get('log_errors'));
+ // on the CLI SAPI, ensure errors are displayed on stderr, either via display_errors or via error_log
+ if (PHP_SAPI === 'cli') {
+ @ini_set('display_errors', $logsToSapiDefault ? '0' : 'stderr');
+ }
// Set user defined memory limit
if ($memoryLimit = getenv('COMPOSER_MEMORY_LIMIT')) {
diff --git a/vendor/composer/composer/composer.lock b/vendor/composer/composer/composer.lock
index b49b1e1c2..5bd48bd81 100644
--- a/vendor/composer/composer/composer.lock
+++ b/vendor/composer/composer/composer.lock
@@ -8,16 +8,16 @@
"packages": [
{
"name": "composer/ca-bundle",
- "version": "1.5.3",
+ "version": "1.5.4",
"source": {
"type": "git",
"url": "https://github.com/composer/ca-bundle.git",
- "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2"
+ "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3b1fc3f0be055baa7c6258b1467849c3e8204eb2",
- "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/bc0593537a463e55cadf45fd938d23b75095b7e1",
+ "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1",
"shasum": ""
},
"require": {
@@ -64,7 +64,7 @@
"support": {
"irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/ca-bundle/issues",
- "source": "https://github.com/composer/ca-bundle/tree/1.5.3"
+ "source": "https://github.com/composer/ca-bundle/tree/1.5.4"
},
"funding": [
{
@@ -80,20 +80,20 @@
"type": "tidelift"
}
],
- "time": "2024-11-04T10:15:26+00:00"
+ "time": "2024-11-27T15:35:25+00:00"
},
{
"name": "composer/class-map-generator",
- "version": "1.4.0",
+ "version": "1.5.0",
"source": {
"type": "git",
"url": "https://github.com/composer/class-map-generator.git",
- "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783"
+ "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/class-map-generator/zipball/98bbf6780e56e0fd2404fe4b82eb665a0f93b783",
- "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783",
+ "url": "https://api.github.com/repos/composer/class-map-generator/zipball/4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915",
+ "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915",
"shasum": ""
},
"require": {
@@ -102,10 +102,10 @@
"symfony/finder": "^4.4 || ^5.3 || ^6 || ^7"
},
"require-dev": {
- "phpstan/phpstan": "^1.6",
- "phpstan/phpstan-deprecation-rules": "^1",
- "phpstan/phpstan-phpunit": "^1",
- "phpstan/phpstan-strict-rules": "^1.1",
+ "phpstan/phpstan": "^1.12 || ^2",
+ "phpstan/phpstan-deprecation-rules": "^1 || ^2",
+ "phpstan/phpstan-phpunit": "^1 || ^2",
+ "phpstan/phpstan-strict-rules": "^1.1 || ^2",
"phpunit/phpunit": "^8",
"symfony/filesystem": "^5.4 || ^6"
},
@@ -137,7 +137,7 @@
],
"support": {
"issues": "https://github.com/composer/class-map-generator/issues",
- "source": "https://github.com/composer/class-map-generator/tree/1.4.0"
+ "source": "https://github.com/composer/class-map-generator/tree/1.5.0"
},
"funding": [
{
@@ -153,7 +153,7 @@
"type": "tidelift"
}
],
- "time": "2024-10-03T18:14:00+00:00"
+ "time": "2024-11-25T16:11:06+00:00"
},
{
"name": "composer/metadata-minifier",
@@ -1040,16 +1040,16 @@
},
{
"name": "symfony/deprecation-contracts",
- "version": "v2.5.3",
+ "version": "v2.5.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "80d075412b557d41002320b96a096ca65aa2c98d"
+ "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d",
- "reference": "80d075412b557d41002320b96a096ca65aa2c98d",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918",
+ "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918",
"shasum": ""
},
"require": {
@@ -1087,7 +1087,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.3"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4"
},
"funding": [
{
@@ -1103,7 +1103,7 @@
"type": "tidelift"
}
],
- "time": "2023-01-24T14:02:46+00:00"
+ "time": "2024-09-25T14:11:13+00:00"
},
{
"name": "symfony/filesystem",
@@ -1261,8 +1261,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -1337,8 +1337,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -1415,8 +1415,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -1499,8 +1499,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -1573,8 +1573,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -1649,8 +1649,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -1729,8 +1729,8 @@
"type": "library",
"extra": {
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -1849,16 +1849,16 @@
},
{
"name": "symfony/service-contracts",
- "version": "v2.5.3",
+ "version": "v2.5.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3"
+ "reference": "f37b419f7aea2e9abf10abd261832cace12e3300"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3",
- "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300",
+ "reference": "f37b419f7aea2e9abf10abd261832cace12e3300",
"shasum": ""
},
"require": {
@@ -1912,7 +1912,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v2.5.3"
+ "source": "https://github.com/symfony/service-contracts/tree/v2.5.4"
},
"funding": [
{
@@ -1928,7 +1928,7 @@
"type": "tidelift"
}
],
- "time": "2023-04-21T15:04:16+00:00"
+ "time": "2024-09-25T14:11:13+00:00"
},
{
"name": "symfony/string",
@@ -2020,16 +2020,16 @@
"packages-dev": [
{
"name": "phpstan/phpstan",
- "version": "1.12.10",
+ "version": "1.12.12",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "fc463b5d0fe906dcf19689be692c65c50406a071"
+ "reference": "b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/fc463b5d0fe906dcf19689be692c65c50406a071",
- "reference": "fc463b5d0fe906dcf19689be692c65c50406a071",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0",
+ "reference": "b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0",
"shasum": ""
},
"require": {
@@ -2074,7 +2074,7 @@
"type": "github"
}
],
- "time": "2024-11-11T15:37:09+00:00"
+ "time": "2024-11-28T22:13:23+00:00"
},
{
"name": "phpstan/phpstan-deprecation-rules",
@@ -2298,16 +2298,16 @@
},
{
"name": "symfony/phpunit-bridge",
- "version": "v7.1.6",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/phpunit-bridge.git",
- "reference": "c6b9d8f52d3e276bedb49612aa4a2a046171287f"
+ "reference": "2bbde92ab25a0e2c88160857af7be9db5da0d145"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/c6b9d8f52d3e276bedb49612aa4a2a046171287f",
- "reference": "c6b9d8f52d3e276bedb49612aa4a2a046171287f",
+ "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/2bbde92ab25a0e2c88160857af7be9db5da0d145",
+ "reference": "2bbde92ab25a0e2c88160857af7be9db5da0d145",
"shasum": ""
},
"require": {
@@ -2327,8 +2327,8 @@
"type": "symfony-bridge",
"extra": {
"thanks": {
- "name": "phpunit/phpunit",
- "url": "https://github.com/sebastianbergmann/phpunit"
+ "url": "https://github.com/sebastianbergmann/phpunit",
+ "name": "phpunit/phpunit"
}
},
"autoload": {
@@ -2360,7 +2360,7 @@
"description": "Provides utilities for PHPUnit, especially user deprecation notices management",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.6"
+ "source": "https://github.com/symfony/phpunit-bridge/tree/v7.2.0"
},
"funding": [
{
@@ -2376,7 +2376,7 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:20:29+00:00"
+ "time": "2024-11-13T16:15:23+00:00"
}
],
"aliases": [],
diff --git a/vendor/composer/composer/res/composer-schema.json b/vendor/composer/composer/res/composer-schema.json
index 9f76bc4b7..efe7a5e59 100644
--- a/vendor/composer/composer/res/composer-schema.json
+++ b/vendor/composer/composer/res/composer-schema.json
@@ -317,6 +317,32 @@
"example": false,
"default": true
},
+ "build-path": {
+ "type": ["string", "null"],
+ "description": "If specified, this is the subdirectory that will be used to build the extension instead of the root of the project.",
+ "example": "my-extension-source",
+ "default": null
+ },
+ "os-families": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An array of OS families to mark as compatible with the extension. Specifying this property will mean this package is not installable with PIE on any OS family not listed here. Must not be specified alongside os-families-exclude.",
+ "items": {
+ "type": "string",
+ "enum": ["windows", "bsd", "darwin", "solaris", "linux", "unknown"],
+ "description": "The name of the OS family to mark as compatible."
+ }
+ },
+ "os-families-exclude": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An array of OS families to mark as incompatible with the extension. Specifying this property will mean this package is installable on any OS family except those listed here. Must not be specified alongside os-families.",
+ "items": {
+ "type": "string",
+ "enum": ["windows", "bsd", "darwin", "solaris", "linux", "unknown"],
+ "description": "The name of the OS family to exclude."
+ }
+ },
"configure-options": {
"type": "array",
"description": "These configure options make up the flags that can be passed to ./configure when installing the extension.",
@@ -344,7 +370,14 @@
}
}
}
- }
+ },
+ "allOf": [
+ {
+ "not": {
+ "required": ["os-families", "os-families-exclude"]
+ }
+ }
+ ]
},
"config": {
"type": "object",
diff --git a/vendor/composer/composer/src/Composer/Advisory/Auditor.php b/vendor/composer/composer/src/Composer/Advisory/Auditor.php
index de8034bad..485b33267 100644
--- a/vendor/composer/composer/src/Composer/Advisory/Auditor.php
+++ b/vendor/composer/composer/src/Composer/Advisory/Auditor.php
@@ -53,6 +53,11 @@ class Auditor
self::ABANDONED_FAIL,
];
+ /** Values to determine the audit result. */
+ public const STATUS_OK = 0;
+ public const STATUS_VULNERABLE = 1;
+ public const STATUS_ABANDONED = 2;
+
/**
* @param PackageInterface[] $packages
* @param self::FORMAT_* $format The format that will be used to output audit results.
@@ -61,7 +66,7 @@ class Auditor
* @param self::ABANDONED_* $abandoned
* @param array $ignoredSeverities List of ignored severity levels
*
- * @return int Amount of packages with vulnerabilities found
+ * @return int-mask A bitmask of STATUS_* constants or 0 on success
* @throws InvalidArgumentException If no packages are passed in
*/
public function audit(IOInterface $io, RepositorySet $repoSet, array $packages, string $format, bool $warningOnly = true, array $ignoreList = [], string $abandoned = self::ABANDONED_FAIL, array $ignoredSeverities = []): int
@@ -75,7 +80,7 @@ public function audit(IOInterface $io, RepositorySet $repoSet, array $packages,
['advisories' => $advisories, 'ignoredAdvisories' => $ignoredAdvisories] = $this->processAdvisories($allAdvisories, $ignoreList, $ignoredSeverities);
$abandonedCount = 0;
- $affectedPackagesCount = 0;
+ $affectedPackagesCount = count($advisories);
if ($abandoned === self::ABANDONED_IGNORE) {
$abandonedPackages = [];
} else {
@@ -85,6 +90,8 @@ public function audit(IOInterface $io, RepositorySet $repoSet, array $packages,
}
}
+ $auditBitmask = $this->calculateBitmask(0 < $affectedPackagesCount, 0 < $abandonedCount);
+
if (self::FORMAT_JSON === $format) {
$json = ['advisories' => $advisories];
if ($ignoredAdvisories !== []) {
@@ -98,23 +105,22 @@ public function audit(IOInterface $io, RepositorySet $repoSet, array $packages,
$io->write(JsonFile::encode($json));
- return count($advisories) + $abandonedCount;
+ return $auditBitmask;
}
$errorOrWarn = $warningOnly ? 'warning' : 'error';
- if (count($advisories) > 0 || count($ignoredAdvisories) > 0) {
+ if ($affectedPackagesCount > 0 || count($ignoredAdvisories) > 0) {
$passes = [
[$ignoredAdvisories, "Found %d ignored security vulnerability advisor%s affecting %d package%s%s"],
- // this has to run last to allow $affectedPackagesCount in the return statement to be correct
[$advisories, "<$errorOrWarn>Found %d security vulnerability advisor%s affecting %d package%s%s$errorOrWarn>"],
];
foreach ($passes as [$advisoriesToOutput, $message]) {
- [$affectedPackagesCount, $totalAdvisoryCount] = $this->countAdvisories($advisoriesToOutput);
- if ($affectedPackagesCount > 0) {
+ [$pkgCount, $totalAdvisoryCount] = $this->countAdvisories($advisoriesToOutput);
+ if ($pkgCount > 0) {
$plurality = $totalAdvisoryCount === 1 ? 'y' : 'ies';
- $pkgPlurality = $affectedPackagesCount === 1 ? '' : 's';
+ $pkgPlurality = $pkgCount === 1 ? '' : 's';
$punctuation = $format === 'summary' ? '.' : ':';
- $io->writeError(sprintf($message, $totalAdvisoryCount, $plurality, $affectedPackagesCount, $pkgPlurality, $punctuation));
+ $io->writeError(sprintf($message, $totalAdvisoryCount, $plurality, $pkgCount, $pkgPlurality, $punctuation));
$this->outputAdvisories($io, $advisoriesToOutput, $format);
}
}
@@ -130,7 +136,7 @@ public function audit(IOInterface $io, RepositorySet $repoSet, array $packages,
$this->outputAbandonedPackages($io, $abandonedPackages, $format);
}
- return $affectedPackagesCount + $abandonedCount;
+ return $auditBitmask;
}
/**
@@ -139,7 +145,7 @@ public function audit(IOInterface $io, RepositorySet $repoSet, array $packages,
*/
private function filterAbandonedPackages(array $packages): array
{
- return array_filter($packages, static function (PackageInterface $pkg) {
+ return array_filter($packages, static function (PackageInterface $pkg): bool {
return $pkg instanceof CompletePackageInterface && $pkg->isAbandoned();
});
}
@@ -401,4 +407,22 @@ private function getURL(SecurityAdvisory $advisory): string
return 'link).'>'.OutputFormatter::escape($advisory->link).'>';
}
+
+ /**
+ * @return int-mask
+ */
+ private function calculateBitmask(bool $hasVulnerablePackages, bool $hasAbandonedPackages): int
+ {
+ $bitmask = self::STATUS_OK;
+
+ if ($hasVulnerablePackages) {
+ $bitmask |= self::STATUS_VULNERABLE;
+ }
+
+ if ($hasAbandonedPackages) {
+ $bitmask |= self::STATUS_ABANDONED;
+ }
+
+ return $bitmask;
+ }
}
diff --git a/vendor/composer/composer/src/Composer/Command/BumpCommand.php b/vendor/composer/composer/src/Composer/Command/BumpCommand.php
index a87a65e1c..4570ce2a3 100644
--- a/vendor/composer/composer/src/Composer/Command/BumpCommand.php
+++ b/vendor/composer/composer/src/Composer/Command/BumpCommand.php
@@ -153,6 +153,10 @@ public function doBump(
}
if (count($packagesFilter) > 0) {
+ // support proxied args from the update command that contain constraints together with the package names
+ $packagesFilter = array_map(function ($constraint) {
+ return Preg::replace('{[:= ].+}', '', $constraint);
+ }, $packagesFilter);
$pattern = BasePackage::packageNamesToRegexp(array_unique(array_map('strtolower', $packagesFilter)));
foreach ($tasks as $key => $reqs) {
foreach ($reqs as $pkgName => $link) {
diff --git a/vendor/composer/composer/src/Composer/Command/CreateProjectCommand.php b/vendor/composer/composer/src/Composer/Command/CreateProjectCommand.php
index d14e2f123..368516fdb 100644
--- a/vendor/composer/composer/src/Composer/Command/CreateProjectCommand.php
+++ b/vendor/composer/composer/src/Composer/Command/CreateProjectCommand.php
@@ -404,6 +404,12 @@ protected function installRootPackage(InputInterface $input, IOInterface $io, Co
) {
continue;
}
+
+ // disable symlinking for the root package by default as that most likely makes no sense
+ if (($repoConfig['type'] ?? null) === 'path' && !isset($repoConfig['options']['symlink'])) {
+ $repoConfig['options']['symlink'] = false;
+ }
+
$repositorySet->addRepository(RepositoryFactory::createRepo($io, $config, $repoConfig, $rm));
}
}
diff --git a/vendor/composer/composer/src/Composer/Command/DiagnoseCommand.php b/vendor/composer/composer/src/Composer/Command/DiagnoseCommand.php
index 7dade55ef..b209679f5 100644
--- a/vendor/composer/composer/src/Composer/Command/DiagnoseCommand.php
+++ b/vendor/composer/composer/src/Composer/Command/DiagnoseCommand.php
@@ -595,11 +595,11 @@ private function checkComposerAudit(Config $config)
$io = new BufferIO();
$result = $auditor->audit($io, $repoSet, $packages, Auditor::FORMAT_TABLE, true, [], Auditor::ABANDONED_IGNORE);
} catch (\Throwable $e) {
- return 'Failed performing audit: '.$e->getMessage().'>';
+ return 'Failed performing audit: '.$e->getMessage().'>';
}
if ($result > 0) {
- return 'Audit found some issues:>' . PHP_EOL . $io->getOutput();
+ return 'Audit found some issues:>' . PHP_EOL . $io->getOutput();
}
return true;
diff --git a/vendor/composer/composer/src/Composer/Command/ValidateCommand.php b/vendor/composer/composer/src/Composer/Command/ValidateCommand.php
index d9d8c7510..fb71081d4 100644
--- a/vendor/composer/composer/src/Composer/Command/ValidateCommand.php
+++ b/vendor/composer/composer/src/Composer/Command/ValidateCommand.php
@@ -68,7 +68,7 @@ protected function configure(): void
protected function execute(InputInterface $input, OutputInterface $output): int
{
- $file = $input->getArgument('file') ?: Factory::getComposerFile();
+ $file = $input->getArgument('file') ?? Factory::getComposerFile();
$io = $this->getIO();
if (!file_exists($file)) {
@@ -144,16 +144,16 @@ private function outputResult(IOInterface $io, string $name, array &$errors, arr
{
$doPrintSchemaUrl = false;
- if ($errors) {
+ if (\count($errors) > 0) {
$io->writeError('' . $name . ' is invalid, the following errors/warnings were found:');
- } elseif ($publishErrors) {
+ } elseif (\count($publishErrors) > 0 && $checkPublish) {
$io->writeError('' . $name . ' is valid for simple usage with Composer but has');
$io->writeError('strict errors that make it unable to be published as a package');
$doPrintSchemaUrl = $printSchemaUrl;
- } elseif ($warnings) {
+ } elseif (\count($warnings) > 0) {
$io->writeError('' . $name . ' is valid, but with a few warnings');
$doPrintSchemaUrl = $printSchemaUrl;
- } elseif ($lockErrors) {
+ } elseif (\count($lockErrors) > 0) {
$io->write('' . $name . ' is valid but your composer.lock has some '.($checkLock ? 'errors' : 'warnings').'');
} else {
$io->write('' . $name . ' is valid');
@@ -163,13 +163,13 @@ private function outputResult(IOInterface $io, string $name, array &$errors, arr
$io->writeError('See https://getcomposer.org/doc/04-schema.md for details on the schema');
}
- if ($errors) {
+ if (\count($errors) > 0) {
$errors = array_map(static function ($err): string {
return '- ' . $err;
}, $errors);
array_unshift($errors, '# General errors');
}
- if ($warnings) {
+ if (\count($warnings) > 0) {
$warnings = array_map(static function ($err): string {
return '- ' . $err;
}, $warnings);
@@ -180,22 +180,17 @@ private function outputResult(IOInterface $io, string $name, array &$errors, arr
$extraWarnings = [];
// If checking publish errors, display them as errors, otherwise just show them as warnings
- if ($publishErrors) {
+ if (\count($publishErrors) > 0 && $checkPublish) {
$publishErrors = array_map(static function ($err): string {
return '- ' . $err;
}, $publishErrors);
- if ($checkPublish) {
- array_unshift($publishErrors, '# Publish errors');
- $errors = array_merge($errors, $publishErrors);
- } else {
- array_unshift($publishErrors, '# Publish warnings');
- $extraWarnings = array_merge($extraWarnings, $publishErrors);
- }
+ array_unshift($publishErrors, '# Publish errors');
+ $errors = array_merge($errors, $publishErrors);
}
// If checking lock errors, display them as errors, otherwise just show them as warnings
- if ($lockErrors) {
+ if (\count($lockErrors) > 0) {
if ($checkLock) {
array_unshift($lockErrors, '# Lock file errors');
$errors = array_merge($errors, $lockErrors);
diff --git a/vendor/composer/composer/src/Composer/Composer.php b/vendor/composer/composer/src/Composer/Composer.php
index 234174462..e721ea2d2 100644
--- a/vendor/composer/composer/src/Composer/Composer.php
+++ b/vendor/composer/composer/src/Composer/Composer.php
@@ -51,9 +51,9 @@ class Composer extends PartialComposer
*
* @see getVersion()
*/
- public const VERSION = '2.8.3';
+ public const VERSION = '2.8.4';
public const BRANCH_ALIAS_VERSION = '';
- public const RELEASE_DATE = '2024-11-17 13:13:04';
+ public const RELEASE_DATE = '2024-12-11 11:57:47';
public const SOURCE_VERSION = '';
/**
diff --git a/vendor/composer/composer/src/Composer/InstalledVersions.php b/vendor/composer/composer/src/Composer/InstalledVersions.php
index 51e734a77..07b32ed6e 100644
--- a/vendor/composer/composer/src/Composer/InstalledVersions.php
+++ b/vendor/composer/composer/src/Composer/InstalledVersions.php
@@ -322,6 +322,7 @@ private static function getInstalled()
}
$installed = array();
+ $copiedLocalDir = false;
if (self::$canGetVendors) {
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
@@ -330,9 +331,11 @@ private static function getInstalled()
} elseif (is_file($vendorDir.'/composer/installed.php')) {
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */
$required = require $vendorDir.'/composer/installed.php';
- $installed[] = self::$installedByVendor[$vendorDir] = $required;
- if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
- self::$installed = $installed[count($installed) - 1];
+ self::$installedByVendor[$vendorDir] = $required;
+ $installed[] = $required;
+ if (strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
+ self::$installed = $required;
+ $copiedLocalDir = true;
}
}
}
@@ -350,7 +353,7 @@ private static function getInstalled()
}
}
- if (self::$installed !== array()) {
+ if (self::$installed !== array() && !$copiedLocalDir) {
$installed[] = self::$installed;
}
diff --git a/vendor/composer/composer/src/Composer/Package/Loader/ValidatingArrayLoader.php b/vendor/composer/composer/src/Composer/Package/Loader/ValidatingArrayLoader.php
index a6431d2df..e3600d6e1 100644
--- a/vendor/composer/composer/src/Composer/Package/Loader/ValidatingArrayLoader.php
+++ b/vendor/composer/composer/src/Composer/Package/Loader/ValidatingArrayLoader.php
@@ -132,33 +132,54 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa
}
}
- // check for license validity on newly updated branches
- if (isset($this->config['license']) && (null === $releaseDate || $releaseDate->getTimestamp() >= strtotime('-8days'))) {
+ if (isset($this->config['license'])) {
+ // validate main data types
if (is_array($this->config['license']) || is_string($this->config['license'])) {
$licenses = (array) $this->config['license'];
- $licenseValidator = new SpdxLicenses();
- foreach ($licenses as $license) {
- // replace proprietary by MIT for validation purposes since it's not a valid SPDX identifier, but is accepted by composer
- if ('proprietary' === $license) {
- continue;
+ foreach ($licenses as $index => $license) {
+ if (!is_string($license)) {
+ $this->warnings[] = sprintf(
+ 'License %s should be a string.',
+ json_encode($license)
+ );
+ unset($licenses[$index]);
}
- $licenseToValidate = str_replace('proprietary', 'MIT', $license);
- if (!$licenseValidator->validate($licenseToValidate)) {
- if ($licenseValidator->validate(trim($licenseToValidate))) {
- $this->warnings[] = sprintf(
- 'License %s must not contain extra spaces, make sure to trim it.',
- json_encode($license)
- );
- } else {
- $this->warnings[] = sprintf(
- 'License %s is not a valid SPDX license identifier, see https://spdx.org/licenses/ if you use an open license.' . PHP_EOL .
- 'If the software is closed-source, you may use "proprietary" as license.',
- json_encode($license)
- );
+ }
+
+ // check for license validity on newly updated branches/tags
+ if (null === $releaseDate || $releaseDate->getTimestamp() >= strtotime('-8days')) {
+ $licenseValidator = new SpdxLicenses();
+ foreach ($licenses as $license) {
+ // replace proprietary by MIT for validation purposes since it's not a valid SPDX identifier, but is accepted by composer
+ if ('proprietary' === $license) {
+ continue;
+ }
+ $licenseToValidate = str_replace('proprietary', 'MIT', $license);
+ if (!$licenseValidator->validate($licenseToValidate)) {
+ if ($licenseValidator->validate(trim($licenseToValidate))) {
+ $this->warnings[] = sprintf(
+ 'License %s must not contain extra spaces, make sure to trim it.',
+ json_encode($license)
+ );
+ } else {
+ $this->warnings[] = sprintf(
+ 'License %s is not a valid SPDX license identifier, see https://spdx.org/licenses/ if you use an open license.' . PHP_EOL .
+ 'If the software is closed-source, you may use "proprietary" as license.',
+ json_encode($license)
+ );
+ }
}
}
}
+
+ $this->config['license'] = array_values($licenses);
+ } else {
+ $this->warnings[] = sprintf(
+ 'License must be a string or array of strings, got %s.',
+ json_encode($this->config['license'])
+ );
+ unset($this->config['license']);
}
}
diff --git a/vendor/composer/composer/src/Composer/Package/Package.php b/vendor/composer/composer/src/Composer/Package/Package.php
index ad17538d6..faa2a07a0 100644
--- a/vendor/composer/composer/src/Composer/Package/Package.php
+++ b/vendor/composer/composer/src/Composer/Package/Package.php
@@ -23,6 +23,7 @@
*
* @phpstan-import-type AutoloadRules from PackageInterface
* @phpstan-import-type DevAutoloadRules from PackageInterface
+ * @phpstan-import-type PhpExtConfig from PackageInterface
*/
class Package extends BasePackage
{
@@ -98,7 +99,10 @@ class Package extends BasePackage
protected $isDefaultBranch = false;
/** @var mixed[] */
protected $transportOptions = [];
- /** @var array{priority?: int, configure-options?: list}|null */
+ /**
+ * @var array|null
+ * @phpstan-var PhpExtConfig|null
+ */
protected $phpExt = null;
/**
@@ -593,9 +597,11 @@ public function getIncludePaths(): array
}
/**
- * Sets the list of paths added to PHP's include path.
+ * Sets the settings for php extension packages
+ *
+ * @param array|null $phpExt
*
- * @param array{extension-name?: string, priority?: int, support-zts?: bool, support-nts?: bool, configure-options?: list}|null $phpExt List of directories.
+ * @phpstan-param PhpExtConfig|null $phpExt
*/
public function setPhpExt(?array $phpExt): void
{
diff --git a/vendor/composer/composer/src/Composer/Package/PackageInterface.php b/vendor/composer/composer/src/Composer/Package/PackageInterface.php
index 6e723d5bb..d3849781a 100644
--- a/vendor/composer/composer/src/Composer/Package/PackageInterface.php
+++ b/vendor/composer/composer/src/Composer/Package/PackageInterface.php
@@ -23,6 +23,7 @@
*
* @phpstan-type AutoloadRules array{psr-0?: array, psr-4?: array, classmap?: list, files?: list, exclude-from-classmap?: list}
* @phpstan-type DevAutoloadRules array{psr-0?: array, psr-4?: array, classmap?: list, files?: list}
+ * @phpstan-type PhpExtConfig array{extension-name?: string, priority?: int, support-zts?: bool, support-nts?: bool, build-path?: string|null, os-families?: non-empty-list, os-families-exclude?: non-empty-list, configure-options?: list}
*/
interface PackageInterface
{
@@ -326,7 +327,9 @@ public function getIncludePaths(): array;
/**
* Returns the settings for php extension packages
*
- * @return array{extension-name?: string, priority?: int, support-zts?: bool, support-nts?: bool, configure-options?: list}|null
+ * @return array|null
+ *
+ * @phpstan-return PhpExtConfig|null
*/
public function getPhpExt(): ?array;
diff --git a/vendor/composer/composer/src/Composer/Plugin/PluginManager.php b/vendor/composer/composer/src/Composer/Plugin/PluginManager.php
index 7cd08060e..5873f85d7 100644
--- a/vendor/composer/composer/src/Composer/Plugin/PluginManager.php
+++ b/vendor/composer/composer/src/Composer/Plugin/PluginManager.php
@@ -55,7 +55,7 @@ class PluginManager
/** @var array */
protected $plugins = [];
- /** @var array */
+ /** @var array> */
protected $registeredPlugins = [];
/**
@@ -201,6 +201,7 @@ public function registerPackage(PackageInterface $package, bool $failOnMissingCl
if (isset($this->registeredPlugins[$package->getName()])) {
return;
}
+ $this->registeredPlugins[$package->getName()] = [];
$extra = $package->getExtra();
if (empty($extra['class'])) {
@@ -289,14 +290,14 @@ public function registerPackage(PackageInterface $package, bool $failOnMissingCl
$this->io->writeError('Loading "'.$package->getName() . '" '.($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '').'which is a legacy composer-installer built for Composer 1.x, it is likely to cause issues as you are running Composer 2.x.');
$installer = new $class($this->io, $this->composer);
$this->composer->getInstallationManager()->addInstaller($installer);
- $this->registeredPlugins[$package->getName()] = $installer;
+ $this->registeredPlugins[$package->getName()][] = $installer;
} elseif (class_exists($class)) {
if (!is_a($class, 'Composer\Plugin\PluginInterface', true)) {
throw new \RuntimeException('Could not activate plugin "'.$package->getName().'" as "'.$class.'" does not implement Composer\Plugin\PluginInterface');
}
$plugin = new $class();
$this->addPlugin($plugin, $isGlobalPlugin, $package);
- $this->registeredPlugins[$package->getName()] = $plugin;
+ $this->registeredPlugins[$package->getName()][] = $plugin;
} elseif ($failOnMissingClasses) {
throw new \UnexpectedValueException('Plugin '.$package->getName().' could not be initialized, class not found: '.$class);
}
@@ -317,13 +318,15 @@ public function deactivatePackage(PackageInterface $package): void
return;
}
- $plugin = $this->registeredPlugins[$package->getName()];
- unset($this->registeredPlugins[$package->getName()]);
- if ($plugin instanceof InstallerInterface) {
- $this->composer->getInstallationManager()->removeInstaller($plugin);
- } else {
- $this->removePlugin($plugin);
+ $plugins = $this->registeredPlugins[$package->getName()];
+ foreach ($plugins as $plugin) {
+ if ($plugin instanceof InstallerInterface) {
+ $this->composer->getInstallationManager()->removeInstaller($plugin);
+ } else {
+ $this->removePlugin($plugin);
+ }
}
+ unset($this->registeredPlugins[$package->getName()]);
}
/**
@@ -340,14 +343,16 @@ public function uninstallPackage(PackageInterface $package): void
return;
}
- $plugin = $this->registeredPlugins[$package->getName()];
- if ($plugin instanceof InstallerInterface) {
- $this->deactivatePackage($package);
- } else {
- unset($this->registeredPlugins[$package->getName()]);
- $this->removePlugin($plugin);
- $this->uninstallPlugin($plugin);
+ $plugins = $this->registeredPlugins[$package->getName()];
+ foreach ($plugins as $plugin) {
+ if ($plugin instanceof InstallerInterface) {
+ $this->composer->getInstallationManager()->removeInstaller($plugin);
+ } else {
+ $this->removePlugin($plugin);
+ $this->uninstallPlugin($plugin);
+ }
}
+ unset($this->registeredPlugins[$package->getName()]);
}
/**
diff --git a/vendor/composer/composer/src/Composer/Repository/FilesystemRepository.php b/vendor/composer/composer/src/Composer/Repository/FilesystemRepository.php
index ec37573f2..abb9f125e 100644
--- a/vendor/composer/composer/src/Composer/Repository/FilesystemRepository.php
+++ b/vendor/composer/composer/src/Composer/Repository/FilesystemRepository.php
@@ -329,6 +329,14 @@ private function generateInstalledVersions(InstallationManager $installationMana
ksort($versions['versions']);
ksort($versions);
+ foreach ($versions['versions'] as $name => $version) {
+ foreach (['aliases', 'replaced', 'provided'] as $key) {
+ if (isset($versions['versions'][$name][$key])) {
+ sort($versions['versions'][$name][$key], SORT_NATURAL);
+ }
+ }
+ }
+
return $versions;
}
diff --git a/vendor/composer/composer/src/Composer/Repository/VcsRepository.php b/vendor/composer/composer/src/Composer/Repository/VcsRepository.php
index a5b17b517..6ca321e58 100644
--- a/vendor/composer/composer/src/Composer/Repository/VcsRepository.php
+++ b/vendor/composer/composer/src/Composer/Repository/VcsRepository.php
@@ -66,7 +66,7 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
private $driver;
/** @var ?VersionCacheInterface */
private $versionCache;
- /** @var string[] */
+ /** @var list */
private $emptyReferences = [];
/** @var array<'tags'|'branches', array> */
private $versionTransportExceptions = [];
@@ -165,7 +165,7 @@ public function hadInvalidBranches(): bool
}
/**
- * @return string[]
+ * @return list
*/
public function getEmptyReferences(): array
{
diff --git a/vendor/composer/composer/src/Composer/Util/GitLab.php b/vendor/composer/composer/src/Composer/Util/GitLab.php
index 35d8e0ded..2f108bc5a 100644
--- a/vendor/composer/composer/src/Composer/Util/GitLab.php
+++ b/vendor/composer/composer/src/Composer/Util/GitLab.php
@@ -126,8 +126,8 @@ public function authorizeOAuthInteractively(string $scheme, string $originUrl, ?
}
$localAuthConfig = $this->config->getLocalAuthConfigSource();
- $personalAccessTokenLink = $scheme.'://'.$originUrl.'/-/profile/personal_access_tokens';
- $revokeLink = $scheme.'://'.$originUrl.'/-/profile/applications';
+ $personalAccessTokenLink = $scheme.'://'.$originUrl.'/-/user_settings/personal_access_tokens';
+ $revokeLink = $scheme.'://'.$originUrl.'/-/user_settings/applications';
$this->io->writeError(sprintf('A token will be created and stored in "%s", your password will never be stored', ($localAuthConfig !== null ? $localAuthConfig->getName() . ' OR ' : '') . $this->config->getAuthConfigSource()->getName()));
$this->io->writeError('To revoke access to this token you can visit:');
$this->io->writeError($revokeLink);
@@ -312,7 +312,7 @@ private function refreshToken(string $scheme, string $originUrl): array
$token = $this->httpDownloader->get($scheme.'://'.$originUrl.'/oauth/token', $options)->decodeJson();
$this->io->writeError('GitLab token successfully refreshed', true, IOInterface::VERY_VERBOSE);
- $this->io->writeError('To revoke access to this token you can visit '.$scheme.'://'.$originUrl.'/-/profile/applications', true, IOInterface::VERY_VERBOSE);
+ $this->io->writeError('To revoke access to this token you can visit '.$scheme.'://'.$originUrl.'/-/user_settings/applications', true, IOInterface::VERY_VERBOSE);
return $token;
}
diff --git a/vendor/composer/composer/src/Composer/Util/Http/CurlDownloader.php b/vendor/composer/composer/src/Composer/Util/Http/CurlDownloader.php
index 577c81b47..1cdae6df9 100644
--- a/vendor/composer/composer/src/Composer/Util/Http/CurlDownloader.php
+++ b/vendor/composer/composer/src/Composer/Util/Http/CurlDownloader.php
@@ -34,6 +34,14 @@
*/
class CurlDownloader
{
+ /**
+ * Known libcurl's broken versions when proxy is in use with HTTP/2
+ * multiplexing.
+ *
+ * @var list
+ */
+ private const BAD_MULTIPLEXING_CURL_VERSIONS = ['7.87.0', '7.88.0', '7.88.1'];
+
/** @var \CurlMultiHandle */
private $multiHandle;
/** @var \CurlShareHandle */
@@ -99,7 +107,18 @@ public function __construct(IOInterface $io, Config $config, array $options = []
$this->multiHandle = $mh = curl_multi_init();
if (function_exists('curl_multi_setopt')) {
- curl_multi_setopt($mh, CURLMOPT_PIPELINING, \PHP_VERSION_ID >= 70400 ? /* CURLPIPE_MULTIPLEX */ 2 : /*CURLPIPE_HTTP1 | CURLPIPE_MULTIPLEX*/ 3);
+ if (ProxyManager::getInstance()->hasProxy() && ($version = curl_version()) !== false && in_array($version['version'], self::BAD_MULTIPLEXING_CURL_VERSIONS, true)) {
+ /**
+ * Disable HTTP/2 multiplexing for some broken versions of libcurl.
+ *
+ * In certain versions of libcurl when proxy is in use with HTTP/2
+ * multiplexing, connections will continue stacking up. This was
+ * fixed in libcurl 8.0.0 in curl/curl@821f6e2a89de8aec1c7da3c0f381b92b2b801efc
+ */
+ curl_multi_setopt($mh, CURLMOPT_PIPELINING, /* CURLPIPE_NOTHING */ 0);
+ } else {
+ curl_multi_setopt($mh, CURLMOPT_PIPELINING, \PHP_VERSION_ID >= 70400 ? /* CURLPIPE_MULTIPLEX */ 2 : /*CURLPIPE_HTTP1 | CURLPIPE_MULTIPLEX*/ 3);
+ }
if (defined('CURLMOPT_MAX_HOST_CONNECTIONS') && !defined('HHVM_VERSION')) {
curl_multi_setopt($mh, CURLMOPT_MAX_HOST_CONNECTIONS, 8);
}
diff --git a/vendor/composer/composer/src/Composer/Util/Http/ProxyManager.php b/vendor/composer/composer/src/Composer/Util/Http/ProxyManager.php
index 247105fa5..3747cedaa 100644
--- a/vendor/composer/composer/src/Composer/Util/Http/ProxyManager.php
+++ b/vendor/composer/composer/src/Composer/Util/Http/ProxyManager.php
@@ -59,6 +59,11 @@ public static function reset(): void
self::$instance = null;
}
+ public function hasProxy(): bool
+ {
+ return $this->httpProxy !== null || $this->httpsProxy !== null;
+ }
+
/**
* Returns a RequestProxy instance for the request url
*
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index ca7e0920c..eb4fb752a 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -196,17 +196,17 @@
},
{
"name": "composer/ca-bundle",
- "version": "1.5.3",
- "version_normalized": "1.5.3.0",
+ "version": "1.5.4",
+ "version_normalized": "1.5.4.0",
"source": {
"type": "git",
"url": "https://github.com/composer/ca-bundle.git",
- "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2"
+ "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3b1fc3f0be055baa7c6258b1467849c3e8204eb2",
- "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/bc0593537a463e55cadf45fd938d23b75095b7e1",
+ "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1",
"shasum": ""
},
"require": {
@@ -220,7 +220,7 @@
"psr/log": "^1.0 || ^2.0 || ^3.0",
"symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
},
- "time": "2024-11-04T10:15:26+00:00",
+ "time": "2024-11-27T15:35:25+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -255,7 +255,7 @@
"support": {
"irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/ca-bundle/issues",
- "source": "https://github.com/composer/ca-bundle/tree/1.5.3"
+ "source": "https://github.com/composer/ca-bundle/tree/1.5.4"
},
"funding": [
{
@@ -275,17 +275,17 @@
},
{
"name": "composer/class-map-generator",
- "version": "1.4.0",
- "version_normalized": "1.4.0.0",
+ "version": "1.5.0",
+ "version_normalized": "1.5.0.0",
"source": {
"type": "git",
"url": "https://github.com/composer/class-map-generator.git",
- "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783"
+ "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/class-map-generator/zipball/98bbf6780e56e0fd2404fe4b82eb665a0f93b783",
- "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783",
+ "url": "https://api.github.com/repos/composer/class-map-generator/zipball/4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915",
+ "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915",
"shasum": ""
},
"require": {
@@ -294,14 +294,14 @@
"symfony/finder": "^4.4 || ^5.3 || ^6 || ^7"
},
"require-dev": {
- "phpstan/phpstan": "^1.6",
- "phpstan/phpstan-deprecation-rules": "^1",
- "phpstan/phpstan-phpunit": "^1",
- "phpstan/phpstan-strict-rules": "^1.1",
+ "phpstan/phpstan": "^1.12 || ^2",
+ "phpstan/phpstan-deprecation-rules": "^1 || ^2",
+ "phpstan/phpstan-phpunit": "^1 || ^2",
+ "phpstan/phpstan-strict-rules": "^1.1 || ^2",
"phpunit/phpunit": "^8",
"symfony/filesystem": "^5.4 || ^6"
},
- "time": "2024-10-03T18:14:00+00:00",
+ "time": "2024-11-25T16:11:06+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -331,7 +331,7 @@
],
"support": {
"issues": "https://github.com/composer/class-map-generator/issues",
- "source": "https://github.com/composer/class-map-generator/tree/1.4.0"
+ "source": "https://github.com/composer/class-map-generator/tree/1.5.0"
},
"funding": [
{
@@ -351,17 +351,17 @@
},
{
"name": "composer/composer",
- "version": "2.8.3",
- "version_normalized": "2.8.3.0",
+ "version": "2.8.4",
+ "version_normalized": "2.8.4.0",
"source": {
"type": "git",
"url": "https://github.com/composer/composer.git",
- "reference": "2a7c71266b2545a3bed9f4860734081963f6e688"
+ "reference": "112e37d1dca22b3fdb81cf3524ab4994f47fdb8c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/composer/zipball/2a7c71266b2545a3bed9f4860734081963f6e688",
- "reference": "2a7c71266b2545a3bed9f4860734081963f6e688",
+ "url": "https://api.github.com/repos/composer/composer/zipball/112e37d1dca22b3fdb81cf3524ab4994f47fdb8c",
+ "reference": "112e37d1dca22b3fdb81cf3524ab4994f47fdb8c",
"shasum": ""
},
"require": {
@@ -400,19 +400,19 @@
"ext-zip": "Enabling the zip extension allows you to unzip archives",
"ext-zlib": "Allow gzip compression of HTTP requests"
},
- "time": "2024-11-17T12:13:04+00:00",
+ "time": "2024-12-11T10:57:47+00:00",
"bin": [
"bin/composer"
],
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "2.8-dev"
- },
"phpstan": {
"includes": [
"phpstan/rules.neon"
]
+ },
+ "branch-alias": {
+ "dev-main": "2.8-dev"
}
},
"installation-source": "dist",
@@ -448,7 +448,7 @@
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/composer/issues",
"security": "https://github.com/composer/composer/security/policy",
- "source": "https://github.com/composer/composer/tree/2.8.3"
+ "source": "https://github.com/composer/composer/tree/2.8.4"
},
"funding": [
{
@@ -928,17 +928,17 @@
},
{
"name": "directorytree/ldaprecord",
- "version": "v3.7.5",
- "version_normalized": "3.7.5.0",
+ "version": "v3.7.6",
+ "version_normalized": "3.7.6.0",
"source": {
"type": "git",
"url": "https://github.com/DirectoryTree/LdapRecord.git",
- "reference": "d66344ab2db16049d1611ebd66916c7a314753fc"
+ "reference": "9df53be0893d361f2a383d41f715268a8a7f596c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/DirectoryTree/LdapRecord/zipball/d66344ab2db16049d1611ebd66916c7a314753fc",
- "reference": "d66344ab2db16049d1611ebd66916c7a314753fc",
+ "url": "https://api.github.com/repos/DirectoryTree/LdapRecord/zipball/9df53be0893d361f2a383d41f715268a8a7f596c",
+ "reference": "9df53be0893d361f2a383d41f715268a8a7f596c",
"shasum": ""
},
"require": {
@@ -959,7 +959,7 @@
"phpunit/phpunit": "^9.0",
"spatie/ray": "^1.24"
},
- "time": "2024-11-13T22:43:56+00:00",
+ "time": "2024-12-07T01:11:37+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -1414,17 +1414,17 @@
},
{
"name": "egulias/email-validator",
- "version": "4.0.2",
- "version_normalized": "4.0.2.0",
+ "version": "4.0.3",
+ "version_normalized": "4.0.3.0",
"source": {
"type": "git",
"url": "https://github.com/egulias/EmailValidator.git",
- "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e"
+ "reference": "b115554301161fa21467629f1e1391c1936de517"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e",
- "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517",
+ "reference": "b115554301161fa21467629f1e1391c1936de517",
"shasum": ""
},
"require": {
@@ -1439,7 +1439,7 @@
"suggest": {
"ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
},
- "time": "2023-10-06T06:47:41+00:00",
+ "time": "2024-12-27T00:36:43+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -1472,7 +1472,7 @@
],
"support": {
"issues": "https://github.com/egulias/EmailValidator/issues",
- "source": "https://github.com/egulias/EmailValidator/tree/4.0.2"
+ "source": "https://github.com/egulias/EmailValidator/tree/4.0.3"
},
"funding": [
{
@@ -1556,8 +1556,8 @@
},
{
"name": "ezimuel/php-secure-session",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/ezimuel/phpsecuresession",
@@ -1593,17 +1593,17 @@
},
{
"name": "firebase/php-jwt",
- "version": "v6.10.1",
- "version_normalized": "6.10.1.0",
+ "version": "v6.10.2",
+ "version_normalized": "6.10.2.0",
"source": {
"type": "git",
"url": "https://github.com/firebase/php-jwt.git",
- "reference": "500501c2ce893c824c801da135d02661199f60c5"
+ "reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5",
- "reference": "500501c2ce893c824c801da135d02661199f60c5",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/30c19ed0f3264cb660ea496895cfb6ef7ee3653b",
+ "reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b",
"shasum": ""
},
"require": {
@@ -1621,7 +1621,7 @@
"ext-sodium": "Support EdDSA (Ed25519) signatures",
"paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
},
- "time": "2024-05-18T18:05:11+00:00",
+ "time": "2024-11-24T11:22:49+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -1653,7 +1653,7 @@
],
"support": {
"issues": "https://github.com/firebase/php-jwt/issues",
- "source": "https://github.com/firebase/php-jwt/tree/v6.10.1"
+ "source": "https://github.com/firebase/php-jwt/tree/v6.10.2"
},
"install-path": "../firebase/php-jwt"
},
@@ -2105,17 +2105,17 @@
},
{
"name": "illuminate/collections",
- "version": "v10.48.24",
- "version_normalized": "10.48.24.0",
+ "version": "v10.48.25",
+ "version_normalized": "10.48.25.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/collections.git",
- "reference": "37c863cffb345869dd134eff8e646bc82a19cc96"
+ "reference": "48de3d6bc6aa779112ddcb608a3a96fc975d89d8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/collections/zipball/37c863cffb345869dd134eff8e646bc82a19cc96",
- "reference": "37c863cffb345869dd134eff8e646bc82a19cc96",
+ "url": "https://api.github.com/repos/illuminate/collections/zipball/48de3d6bc6aa779112ddcb608a3a96fc975d89d8",
+ "reference": "48de3d6bc6aa779112ddcb608a3a96fc975d89d8",
"shasum": ""
},
"require": {
@@ -2127,7 +2127,7 @@
"suggest": {
"symfony/var-dumper": "Required to use the dump method (^6.2)."
},
- "time": "2024-06-19T14:25:05+00:00",
+ "time": "2024-11-21T14:02:44+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -2163,23 +2163,23 @@
},
{
"name": "illuminate/conditionable",
- "version": "v10.48.24",
- "version_normalized": "10.48.24.0",
+ "version": "v10.48.25",
+ "version_normalized": "10.48.25.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/conditionable.git",
- "reference": "d0958e4741fc9d6f516a552060fd1b829a85e009"
+ "reference": "3ee34ac306fafc2a6f19cd7cd68c9af389e432a5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/conditionable/zipball/d0958e4741fc9d6f516a552060fd1b829a85e009",
- "reference": "d0958e4741fc9d6f516a552060fd1b829a85e009",
+ "url": "https://api.github.com/repos/illuminate/conditionable/zipball/3ee34ac306fafc2a6f19cd7cd68c9af389e432a5",
+ "reference": "3ee34ac306fafc2a6f19cd7cd68c9af389e432a5",
"shasum": ""
},
"require": {
"php": "^8.0.2"
},
- "time": "2023-02-03T08:06:17+00:00",
+ "time": "2024-11-21T14:02:44+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -2212,17 +2212,17 @@
},
{
"name": "illuminate/container",
- "version": "v10.48.24",
- "version_normalized": "10.48.24.0",
+ "version": "v10.48.25",
+ "version_normalized": "10.48.25.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/container.git",
- "reference": "ddc26273085fad3c471b2602ad820e0097ff7939"
+ "reference": "ed6253f7dd3a67d468b2cc7a69a657e1f14c7ba3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/container/zipball/ddc26273085fad3c471b2602ad820e0097ff7939",
- "reference": "ddc26273085fad3c471b2602ad820e0097ff7939",
+ "url": "https://api.github.com/repos/illuminate/container/zipball/ed6253f7dd3a67d468b2cc7a69a657e1f14c7ba3",
+ "reference": "ed6253f7dd3a67d468b2cc7a69a657e1f14c7ba3",
"shasum": ""
},
"require": {
@@ -2233,7 +2233,7 @@
"provide": {
"psr/container-implementation": "1.1|2.0"
},
- "time": "2023-06-18T09:12:03+00:00",
+ "time": "2024-11-21T14:02:44+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -2266,17 +2266,17 @@
},
{
"name": "illuminate/contracts",
- "version": "v10.48.24",
- "version_normalized": "10.48.24.0",
+ "version": "v10.48.25",
+ "version_normalized": "10.48.25.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/contracts.git",
- "reference": "8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac"
+ "reference": "f90663a69f926105a70b78060a31f3c64e2d1c74"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/contracts/zipball/8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac",
- "reference": "8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac",
+ "url": "https://api.github.com/repos/illuminate/contracts/zipball/f90663a69f926105a70b78060a31f3c64e2d1c74",
+ "reference": "f90663a69f926105a70b78060a31f3c64e2d1c74",
"shasum": ""
},
"require": {
@@ -2284,7 +2284,7 @@
"psr/container": "^1.1.1|^2.0.1",
"psr/simple-cache": "^1.0|^2.0|^3.0"
},
- "time": "2024-01-15T18:52:32+00:00",
+ "time": "2024-11-21T14:02:44+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -2317,8 +2317,8 @@
},
{
"name": "illuminate/filesystem",
- "version": "v10.48.24",
- "version_normalized": "10.48.24.0",
+ "version": "v10.48.25",
+ "version_normalized": "10.48.25.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/filesystem.git",
@@ -2387,8 +2387,8 @@
},
{
"name": "illuminate/macroable",
- "version": "v10.48.24",
- "version_normalized": "10.48.24.0",
+ "version": "v10.48.25",
+ "version_normalized": "10.48.25.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/macroable.git",
@@ -2436,17 +2436,17 @@
},
{
"name": "illuminate/support",
- "version": "v10.48.24",
- "version_normalized": "10.48.24.0",
+ "version": "v10.48.25",
+ "version_normalized": "10.48.25.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/support.git",
- "reference": "56c6d9895605b019e3debb9440454596ef99312a"
+ "reference": "64b258f80175c658aef9e22dd3f2ba18c99b243c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/support/zipball/56c6d9895605b019e3debb9440454596ef99312a",
- "reference": "56c6d9895605b019e3debb9440454596ef99312a",
+ "url": "https://api.github.com/repos/illuminate/support/zipball/64b258f80175c658aef9e22dd3f2ba18c99b243c",
+ "reference": "64b258f80175c658aef9e22dd3f2ba18c99b243c",
"shasum": ""
},
"require": {
@@ -2474,7 +2474,7 @@
"symfony/var-dumper": "Required to use the dd function (^6.2).",
"vlucas/phpdotenv": "Required to use the Env class and env helper (^5.4.1)."
},
- "time": "2024-05-20T13:31:33+00:00",
+ "time": "2024-11-21T14:02:44+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -2510,8 +2510,8 @@
},
{
"name": "illuminate/translation",
- "version": "v10.48.24",
- "version_normalized": "10.48.24.0",
+ "version": "v10.48.25",
+ "version_normalized": "10.48.25.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/translation.git",
@@ -2564,17 +2564,17 @@
},
{
"name": "illuminate/validation",
- "version": "v10.48.24",
- "version_normalized": "10.48.24.0",
+ "version": "v10.48.25",
+ "version_normalized": "10.48.25.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/validation.git",
- "reference": "c9be8b183279f0175233e0758285a297431045ac"
+ "reference": "1daeb12f3608a0c5dfd80c4978ceb34e690f2f3c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/validation/zipball/c9be8b183279f0175233e0758285a297431045ac",
- "reference": "c9be8b183279f0175233e0758285a297431045ac",
+ "url": "https://api.github.com/repos/illuminate/validation/zipball/1daeb12f3608a0c5dfd80c4978ceb34e690f2f3c",
+ "reference": "1daeb12f3608a0c5dfd80c4978ceb34e690f2f3c",
"shasum": ""
},
"require": {
@@ -2595,7 +2595,7 @@
"suggest": {
"illuminate/database": "Required to use the database presence verifier (^10.0)."
},
- "time": "2024-03-08T02:31:57+00:00",
+ "time": "2024-11-21T14:02:44+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -2696,37 +2696,32 @@
},
{
"name": "league/oauth2-client",
- "version": "2.7.0",
- "version_normalized": "2.7.0.0",
+ "version": "2.8.0",
+ "version_normalized": "2.8.0.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/oauth2-client.git",
- "reference": "160d6274b03562ebeb55ed18399281d8118b76c8"
+ "reference": "3d5cf8d0543731dfb725ab30e4d7289891991e13"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/160d6274b03562ebeb55ed18399281d8118b76c8",
- "reference": "160d6274b03562ebeb55ed18399281d8118b76c8",
+ "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/3d5cf8d0543731dfb725ab30e4d7289891991e13",
+ "reference": "3d5cf8d0543731dfb725ab30e4d7289891991e13",
"shasum": ""
},
"require": {
- "guzzlehttp/guzzle": "^6.0 || ^7.0",
- "paragonie/random_compat": "^1 || ^2 || ^9.99",
- "php": "^5.6 || ^7.0 || ^8.0"
+ "ext-json": "*",
+ "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5",
+ "php": "^7.1 || >=8.0.0 <8.5.0"
},
"require-dev": {
"mockery/mockery": "^1.3.5",
- "php-parallel-lint/php-parallel-lint": "^1.3.1",
- "phpunit/phpunit": "^5.7 || ^6.0 || ^9.5",
- "squizlabs/php_codesniffer": "^2.3 || ^3.0"
+ "php-parallel-lint/php-parallel-lint": "^1.4",
+ "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11",
+ "squizlabs/php_codesniffer": "^3.11"
},
- "time": "2023-04-16T18:19:15+00:00",
+ "time": "2024-12-11T05:05:52+00:00",
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-2.x": "2.0.x-dev"
- }
- },
"installation-source": "dist",
"autoload": {
"psr-4": {
@@ -2763,7 +2758,7 @@
],
"support": {
"issues": "https://github.com/thephpleague/oauth2-client/issues",
- "source": "https://github.com/thephpleague/oauth2-client/tree/2.7.0"
+ "source": "https://github.com/thephpleague/oauth2-client/tree/2.8.0"
},
"install-path": "../league/oauth2-client"
},
@@ -2926,17 +2921,17 @@
},
{
"name": "nesbot/carbon",
- "version": "2.72.5",
- "version_normalized": "2.72.5.0",
+ "version": "2.72.6",
+ "version_normalized": "2.72.6.0",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
- "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed"
+ "reference": "1e9d50601e7035a4c61441a208cb5bed73e108c5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/afd46589c216118ecd48ff2b95d77596af1e57ed",
- "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/1e9d50601e7035a4c61441a208cb5bed73e108c5",
+ "reference": "1e9d50601e7035a4c61441a208cb5bed73e108c5",
"shasum": ""
},
"require": {
@@ -2956,7 +2951,7 @@
"doctrine/orm": "^2.7 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.0",
"kylekatarnls/multi-tester": "^2.0",
- "ondrejmirtes/better-reflection": "*",
+ "ondrejmirtes/better-reflection": "<6",
"phpmd/phpmd": "^2.9",
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^0.12.99 || ^1.7.14",
@@ -2964,16 +2959,12 @@
"phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20",
"squizlabs/php_codesniffer": "^3.4"
},
- "time": "2024-06-03T19:18:41+00:00",
+ "time": "2024-12-27T09:28:11+00:00",
"bin": [
"bin/carbon"
],
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "3.x-dev",
- "dev-2.x": "2.x-dev"
- },
"laravel": {
"providers": [
"Carbon\\Laravel\\ServiceProvider"
@@ -2983,6 +2974,10 @@
"includes": [
"extension.neon"
]
+ },
+ "branch-alias": {
+ "dev-2.x": "2.x-dev",
+ "dev-master": "3.x-dev"
}
},
"installation-source": "dist",
@@ -3317,17 +3312,17 @@
},
{
"name": "phpmailer/phpmailer",
- "version": "v6.9.2",
- "version_normalized": "6.9.2.0",
+ "version": "v6.9.3",
+ "version_normalized": "6.9.3.0",
"source": {
"type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git",
- "reference": "a7b17b42fa4887c92146243f3d2f4ccb962af17c"
+ "reference": "2f5c94fe7493efc213f643c23b1b1c249d40f47e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a7b17b42fa4887c92146243f3d2f4ccb962af17c",
- "reference": "a7b17b42fa4887c92146243f3d2f4ccb962af17c",
+ "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/2f5c94fe7493efc213f643c23b1b1c249d40f47e",
+ "reference": "2f5c94fe7493efc213f643c23b1b1c249d40f47e",
"shasum": ""
},
"require": {
@@ -3357,7 +3352,7 @@
"symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)",
"thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication"
},
- "time": "2024-10-09T10:07:50+00:00",
+ "time": "2024-11-24T18:04:13+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -3389,7 +3384,7 @@
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues",
- "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.2"
+ "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.3"
},
"funding": [
{
@@ -4535,17 +4530,17 @@
},
{
"name": "symfony/cache",
- "version": "v6.4.14",
- "version_normalized": "6.4.14.0",
+ "version": "v6.4.16",
+ "version_normalized": "6.4.16.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
- "reference": "36fb8aa88833708e9f29014b6f15fac051a8b613"
+ "reference": "70d60e9a3603108563010f8592dff15a6f15dfae"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/cache/zipball/36fb8aa88833708e9f29014b6f15fac051a8b613",
- "reference": "36fb8aa88833708e9f29014b6f15fac051a8b613",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/70d60e9a3603108563010f8592dff15a6f15dfae",
+ "reference": "70d60e9a3603108563010f8592dff15a6f15dfae",
"shasum": ""
},
"require": {
@@ -4579,7 +4574,7 @@
"symfony/messenger": "^5.4|^6.0|^7.0",
"symfony/var-dumper": "^5.4|^6.0|^7.0"
},
- "time": "2024-11-05T15:34:40+00:00",
+ "time": "2024-11-20T10:10:54+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -4614,7 +4609,7 @@
"psr6"
],
"support": {
- "source": "https://github.com/symfony/cache/tree/v6.4.14"
+ "source": "https://github.com/symfony/cache/tree/v6.4.16"
},
"funding": [
{
@@ -4731,17 +4726,17 @@
},
{
"name": "symfony/contracts",
- "version": "v3.5.0",
- "version_normalized": "3.5.0.0",
+ "version": "v3.5.2",
+ "version_normalized": "3.5.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/contracts.git",
- "reference": "f8cd5313753cfac8329ebc4033e2013b874208e1"
+ "reference": "a1a717e017c8c30e5c339807ca47d7da1a19489f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/contracts/zipball/f8cd5313753cfac8329ebc4033e2013b874208e1",
- "reference": "f8cd5313753cfac8329ebc4033e2013b874208e1",
+ "url": "https://api.github.com/repos/symfony/contracts/zipball/a1a717e017c8c30e5c339807ca47d7da1a19489f",
+ "reference": "a1a717e017c8c30e5c339807ca47d7da1a19489f",
"shasum": ""
},
"require": {
@@ -4764,7 +4759,7 @@
"require-dev": {
"symfony/polyfill-intl-idn": "^1.10"
},
- "time": "2024-04-18T09:32:20+00:00",
+ "time": "2024-12-07T08:49:48+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -4809,7 +4804,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/contracts/tree/v3.5.0"
+ "source": "https://github.com/symfony/contracts/tree/v3.5.2"
},
"funding": [
{
@@ -4897,17 +4892,17 @@
},
{
"name": "symfony/dom-crawler",
- "version": "v6.4.13",
- "version_normalized": "6.4.13.0",
+ "version": "v6.4.16",
+ "version_normalized": "6.4.16.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/dom-crawler.git",
- "reference": "ae074dffb018c37a57071990d16e6152728dd972"
+ "reference": "4304e6ad5c894a9c72831ad459f627bfd35d766d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/ae074dffb018c37a57071990d16e6152728dd972",
- "reference": "ae074dffb018c37a57071990d16e6152728dd972",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4304e6ad5c894a9c72831ad459f627bfd35d766d",
+ "reference": "4304e6ad5c894a9c72831ad459f627bfd35d766d",
"shasum": ""
},
"require": {
@@ -4919,7 +4914,7 @@
"require-dev": {
"symfony/css-selector": "^5.4|^6.0|^7.0"
},
- "time": "2024-10-25T15:07:50+00:00",
+ "time": "2024-11-13T15:06:22+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -4947,7 +4942,7 @@
"description": "Eases DOM navigation for HTML and XML documents",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/dom-crawler/tree/v6.4.13"
+ "source": "https://github.com/symfony/dom-crawler/tree/v6.4.16"
},
"funding": [
{
@@ -5103,17 +5098,17 @@
},
{
"name": "symfony/http-foundation",
- "version": "v6.4.15",
- "version_normalized": "6.4.15.0",
+ "version": "v6.4.16",
+ "version_normalized": "6.4.16.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6"
+ "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6",
- "reference": "9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/431771b7a6f662f1575b3cfc8fd7617aa9864d57",
+ "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57",
"shasum": ""
},
"require": {
@@ -5135,7 +5130,7 @@
"symfony/mime": "^5.4|^6.0|^7.0",
"symfony/rate-limiter": "^5.4|^6.0|^7.0"
},
- "time": "2024-11-08T16:09:24+00:00",
+ "time": "2024-11-13T18:58:10+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -5163,7 +5158,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v6.4.15"
+ "source": "https://github.com/symfony/http-foundation/tree/v6.4.16"
},
"funding": [
{
@@ -6563,8 +6558,8 @@
},
{
"name": "teampassclasses/configmanager",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/configmanager",
@@ -6597,8 +6592,8 @@
},
{
"name": "teampassclasses/emailservice",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/emailservice",
@@ -6634,8 +6629,8 @@
},
{
"name": "teampassclasses/encryption",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/encryption",
@@ -6672,8 +6667,8 @@
},
{
"name": "teampassclasses/folderservices",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/folderservices",
@@ -6709,8 +6704,8 @@
},
{
"name": "teampassclasses/language",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/language",
@@ -6743,8 +6738,8 @@
},
{
"name": "teampassclasses/ldapextra",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/ldapextra",
@@ -6781,8 +6776,8 @@
},
{
"name": "teampassclasses/nestedtree",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/nestedtree",
@@ -6819,8 +6814,8 @@
},
{
"name": "teampassclasses/oauth2controller",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/oauth2controller",
@@ -6858,8 +6853,8 @@
},
{
"name": "teampassclasses/passwordmanager",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/passwordmanager",
@@ -6896,8 +6891,8 @@
},
{
"name": "teampassclasses/performchecks",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/performchecks",
@@ -6934,8 +6929,8 @@
},
{
"name": "teampassclasses/sessionmanager",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/sessionmanager",
@@ -6972,8 +6967,8 @@
},
{
"name": "teampassclasses/superglobal",
- "version": "dev-master",
- "version_normalized": "dev-master",
+ "version": "dev-hotfix/code_clean",
+ "version_normalized": "dev-hotfix/code_clean",
"dist": {
"type": "path",
"url": "includes/libraries/teampassclasses/superglobal",
@@ -7010,23 +7005,24 @@
},
{
"name": "tecnickcom/tcpdf",
- "version": "6.7.7",
- "version_normalized": "6.7.7.0",
+ "version": "6.8.0",
+ "version_normalized": "6.8.0.0",
"source": {
"type": "git",
"url": "https://github.com/tecnickcom/TCPDF.git",
- "reference": "cfbc0028cc23f057f2baf9e73bdc238153c22086"
+ "reference": "14ffa0e308f5634aa2489568b4b90b24073b6731"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/cfbc0028cc23f057f2baf9e73bdc238153c22086",
- "reference": "cfbc0028cc23f057f2baf9e73bdc238153c22086",
+ "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/14ffa0e308f5634aa2489568b4b90b24073b6731",
+ "reference": "14ffa0e308f5634aa2489568b4b90b24073b6731",
"shasum": ""
},
"require": {
- "php": ">=5.5.0"
+ "ext-curl": "*",
+ "php": ">=7.1.0"
},
- "time": "2024-10-26T12:15:02+00:00",
+ "time": "2024-12-23T13:34:57+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -7073,7 +7069,7 @@
],
"support": {
"issues": "https://github.com/tecnickcom/TCPDF/issues",
- "source": "https://github.com/tecnickcom/TCPDF/tree/6.7.7"
+ "source": "https://github.com/tecnickcom/TCPDF/tree/6.8.0"
},
"funding": [
{
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index 036588ced..00c5cb612 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -1,8 +1,8 @@
array(
'name' => 'nilsteampassnet/teampass',
- 'pretty_version' => '3.1.1',
- 'version' => '3.1.1.0',
+ 'pretty_version' => '3.1.3',
+ 'version' => '3.1.3.0',
'reference' => null,
'type' => 'library',
'install_path' => __DIR__ . '/../../',
@@ -38,27 +38,27 @@
'dev_requirement' => false,
),
'composer/ca-bundle' => array(
- 'pretty_version' => '1.5.3',
- 'version' => '1.5.3.0',
- 'reference' => '3b1fc3f0be055baa7c6258b1467849c3e8204eb2',
+ 'pretty_version' => '1.5.4',
+ 'version' => '1.5.4.0',
+ 'reference' => 'bc0593537a463e55cadf45fd938d23b75095b7e1',
'type' => 'library',
'install_path' => __DIR__ . '/./ca-bundle',
'aliases' => array(),
'dev_requirement' => false,
),
'composer/class-map-generator' => array(
- 'pretty_version' => '1.4.0',
- 'version' => '1.4.0.0',
- 'reference' => '98bbf6780e56e0fd2404fe4b82eb665a0f93b783',
+ 'pretty_version' => '1.5.0',
+ 'version' => '1.5.0.0',
+ 'reference' => '4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915',
'type' => 'library',
'install_path' => __DIR__ . '/./class-map-generator',
'aliases' => array(),
'dev_requirement' => false,
),
'composer/composer' => array(
- 'pretty_version' => '2.8.3',
- 'version' => '2.8.3.0',
- 'reference' => '2a7c71266b2545a3bed9f4860734081963f6e688',
+ 'pretty_version' => '2.8.4',
+ 'version' => '2.8.4.0',
+ 'reference' => '112e37d1dca22b3fdb81cf3524ab4994f47fdb8c',
'type' => 'library',
'install_path' => __DIR__ . '/./composer',
'aliases' => array(),
@@ -119,9 +119,9 @@
'dev_requirement' => false,
),
'directorytree/ldaprecord' => array(
- 'pretty_version' => 'v3.7.5',
- 'version' => '3.7.5.0',
- 'reference' => 'd66344ab2db16049d1611ebd66916c7a314753fc',
+ 'pretty_version' => 'v3.7.6',
+ 'version' => '3.7.6.0',
+ 'reference' => '9df53be0893d361f2a383d41f715268a8a7f596c',
'type' => 'library',
'install_path' => __DIR__ . '/../directorytree/ldaprecord',
'aliases' => array(),
@@ -182,9 +182,9 @@
'dev_requirement' => false,
),
'egulias/email-validator' => array(
- 'pretty_version' => '4.0.2',
- 'version' => '4.0.2.0',
- 'reference' => 'ebaaf5be6c0286928352e054f2d5125608e5405e',
+ 'pretty_version' => '4.0.3',
+ 'version' => '4.0.3.0',
+ 'reference' => 'b115554301161fa21467629f1e1391c1936de517',
'type' => 'library',
'install_path' => __DIR__ . '/../egulias/email-validator',
'aliases' => array(),
@@ -200,8 +200,8 @@
'dev_requirement' => false,
),
'ezimuel/php-secure-session' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => '8e7723ce12bbb9fc06e62448b9c4b96f846131ad',
'type' => 'library',
'install_path' => __DIR__ . '/../ezimuel/php-secure-session',
@@ -209,9 +209,9 @@
'dev_requirement' => false,
),
'firebase/php-jwt' => array(
- 'pretty_version' => 'v6.10.1',
- 'version' => '6.10.1.0',
- 'reference' => '500501c2ce893c824c801da135d02661199f60c5',
+ 'pretty_version' => 'v6.10.2',
+ 'version' => '6.10.2.0',
+ 'reference' => '30c19ed0f3264cb660ea496895cfb6ef7ee3653b',
'type' => 'library',
'install_path' => __DIR__ . '/../firebase/php-jwt',
'aliases' => array(),
@@ -263,44 +263,44 @@
'dev_requirement' => false,
),
'illuminate/collections' => array(
- 'pretty_version' => 'v10.48.24',
- 'version' => '10.48.24.0',
- 'reference' => '37c863cffb345869dd134eff8e646bc82a19cc96',
+ 'pretty_version' => 'v10.48.25',
+ 'version' => '10.48.25.0',
+ 'reference' => '48de3d6bc6aa779112ddcb608a3a96fc975d89d8',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/collections',
'aliases' => array(),
'dev_requirement' => false,
),
'illuminate/conditionable' => array(
- 'pretty_version' => 'v10.48.24',
- 'version' => '10.48.24.0',
- 'reference' => 'd0958e4741fc9d6f516a552060fd1b829a85e009',
+ 'pretty_version' => 'v10.48.25',
+ 'version' => '10.48.25.0',
+ 'reference' => '3ee34ac306fafc2a6f19cd7cd68c9af389e432a5',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/conditionable',
'aliases' => array(),
'dev_requirement' => false,
),
'illuminate/container' => array(
- 'pretty_version' => 'v10.48.24',
- 'version' => '10.48.24.0',
- 'reference' => 'ddc26273085fad3c471b2602ad820e0097ff7939',
+ 'pretty_version' => 'v10.48.25',
+ 'version' => '10.48.25.0',
+ 'reference' => 'ed6253f7dd3a67d468b2cc7a69a657e1f14c7ba3',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/container',
'aliases' => array(),
'dev_requirement' => false,
),
'illuminate/contracts' => array(
- 'pretty_version' => 'v10.48.24',
- 'version' => '10.48.24.0',
- 'reference' => '8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac',
+ 'pretty_version' => 'v10.48.25',
+ 'version' => '10.48.25.0',
+ 'reference' => 'f90663a69f926105a70b78060a31f3c64e2d1c74',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/contracts',
'aliases' => array(),
'dev_requirement' => false,
),
'illuminate/filesystem' => array(
- 'pretty_version' => 'v10.48.24',
- 'version' => '10.48.24.0',
+ 'pretty_version' => 'v10.48.25',
+ 'version' => '10.48.25.0',
'reference' => '592fb581a52fba43bf78c2e4b22db540c9f9f149',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/filesystem',
@@ -308,8 +308,8 @@
'dev_requirement' => false,
),
'illuminate/macroable' => array(
- 'pretty_version' => 'v10.48.24',
- 'version' => '10.48.24.0',
+ 'pretty_version' => 'v10.48.25',
+ 'version' => '10.48.25.0',
'reference' => 'dff667a46ac37b634dcf68909d9d41e94dc97c27',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/macroable',
@@ -317,17 +317,17 @@
'dev_requirement' => false,
),
'illuminate/support' => array(
- 'pretty_version' => 'v10.48.24',
- 'version' => '10.48.24.0',
- 'reference' => '56c6d9895605b019e3debb9440454596ef99312a',
+ 'pretty_version' => 'v10.48.25',
+ 'version' => '10.48.25.0',
+ 'reference' => '64b258f80175c658aef9e22dd3f2ba18c99b243c',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/support',
'aliases' => array(),
'dev_requirement' => false,
),
'illuminate/translation' => array(
- 'pretty_version' => 'v10.48.24',
- 'version' => '10.48.24.0',
+ 'pretty_version' => 'v10.48.25',
+ 'version' => '10.48.25.0',
'reference' => '4da8ed16d6ea6008acf43c7375a9b2073fb10e0b',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/translation',
@@ -335,9 +335,9 @@
'dev_requirement' => false,
),
'illuminate/validation' => array(
- 'pretty_version' => 'v10.48.24',
- 'version' => '10.48.24.0',
- 'reference' => 'c9be8b183279f0175233e0758285a297431045ac',
+ 'pretty_version' => 'v10.48.25',
+ 'version' => '10.48.25.0',
+ 'reference' => '1daeb12f3608a0c5dfd80c4978ceb34e690f2f3c',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/validation',
'aliases' => array(),
@@ -353,9 +353,9 @@
'dev_requirement' => false,
),
'league/oauth2-client' => array(
- 'pretty_version' => '2.7.0',
- 'version' => '2.7.0.0',
- 'reference' => '160d6274b03562ebeb55ed18399281d8118b76c8',
+ 'pretty_version' => '2.8.0',
+ 'version' => '2.8.0.0',
+ 'reference' => '3d5cf8d0543731dfb725ab30e4d7289891991e13',
'type' => 'library',
'install_path' => __DIR__ . '/../league/oauth2-client',
'aliases' => array(),
@@ -395,17 +395,17 @@
'dev_requirement' => false,
),
'nesbot/carbon' => array(
- 'pretty_version' => '2.72.5',
- 'version' => '2.72.5.0',
- 'reference' => 'afd46589c216118ecd48ff2b95d77596af1e57ed',
+ 'pretty_version' => '2.72.6',
+ 'version' => '2.72.6.0',
+ 'reference' => '1e9d50601e7035a4c61441a208cb5bed73e108c5',
'type' => 'library',
'install_path' => __DIR__ . '/../nesbot/carbon',
'aliases' => array(),
'dev_requirement' => false,
),
'nilsteampassnet/teampass' => array(
- 'pretty_version' => '3.1.1',
- 'version' => '3.1.1.0',
+ 'pretty_version' => '3.1.3',
+ 'version' => '3.1.3.0',
'reference' => null,
'type' => 'library',
'install_path' => __DIR__ . '/../../',
@@ -458,9 +458,9 @@
'dev_requirement' => false,
),
'phpmailer/phpmailer' => array(
- 'pretty_version' => 'v6.9.2',
- 'version' => '6.9.2.0',
- 'reference' => 'a7b17b42fa4887c92146243f3d2f4ccb962af17c',
+ 'pretty_version' => 'v6.9.3',
+ 'version' => '6.9.3.0',
+ 'reference' => '2f5c94fe7493efc213f643c23b1b1c249d40f47e',
'type' => 'library',
'install_path' => __DIR__ . '/../phpmailer/phpmailer',
'aliases' => array(),
@@ -677,9 +677,9 @@
'dev_requirement' => false,
),
'symfony/cache' => array(
- 'pretty_version' => 'v6.4.14',
- 'version' => '6.4.14.0',
- 'reference' => '36fb8aa88833708e9f29014b6f15fac051a8b613',
+ 'pretty_version' => 'v6.4.16',
+ 'version' => '6.4.16.0',
+ 'reference' => '70d60e9a3603108563010f8592dff15a6f15dfae',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/cache',
'aliases' => array(),
@@ -688,7 +688,7 @@
'symfony/cache-contracts' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => 'v3.5.0',
+ 0 => 'v3.5.2',
),
),
'symfony/cache-implementation' => array(
@@ -707,9 +707,9 @@
'dev_requirement' => false,
),
'symfony/contracts' => array(
- 'pretty_version' => 'v3.5.0',
- 'version' => '3.5.0.0',
- 'reference' => 'f8cd5313753cfac8329ebc4033e2013b874208e1',
+ 'pretty_version' => 'v3.5.2',
+ 'version' => '3.5.2.0',
+ 'reference' => 'a1a717e017c8c30e5c339807ca47d7da1a19489f',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/contracts',
'aliases' => array(),
@@ -727,13 +727,13 @@
'symfony/deprecation-contracts' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => 'v3.5.0',
+ 0 => 'v3.5.2',
),
),
'symfony/dom-crawler' => array(
- 'pretty_version' => 'v6.4.13',
- 'version' => '6.4.13.0',
- 'reference' => 'ae074dffb018c37a57071990d16e6152728dd972',
+ 'pretty_version' => 'v6.4.16',
+ 'version' => '6.4.16.0',
+ 'reference' => '4304e6ad5c894a9c72831ad459f627bfd35d766d',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/dom-crawler',
'aliases' => array(),
@@ -742,7 +742,7 @@
'symfony/event-dispatcher-contracts' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => 'v3.5.0',
+ 0 => 'v3.5.2',
),
),
'symfony/filesystem' => array(
@@ -766,13 +766,13 @@
'symfony/http-client-contracts' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => 'v3.5.0',
+ 0 => 'v3.5.2',
),
),
'symfony/http-foundation' => array(
- 'pretty_version' => 'v6.4.15',
- 'version' => '6.4.15.0',
- 'reference' => '9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6',
+ 'pretty_version' => 'v6.4.16',
+ 'version' => '6.4.16.0',
+ 'reference' => '431771b7a6f662f1575b3cfc8fd7617aa9864d57',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/http-foundation',
'aliases' => array(),
@@ -907,7 +907,7 @@
'symfony/service-contracts' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => 'v3.5.0',
+ 0 => 'v3.5.2',
),
),
'symfony/string' => array(
@@ -931,7 +931,7 @@
'symfony/translation-contracts' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => 'v3.5.0',
+ 0 => 'v3.5.2',
),
),
'symfony/translation-implementation' => array(
@@ -950,8 +950,8 @@
'dev_requirement' => true,
),
'teampassclasses/configmanager' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => 'dd074efd73e7f2fc7d5eae88ea3fdcebc42a6d17',
'type' => 'library',
'install_path' => __DIR__ . '/../teampassclasses/configmanager',
@@ -959,8 +959,8 @@
'dev_requirement' => false,
),
'teampassclasses/emailservice' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => 'e2e6c70f33d0f3fb15c015b38c75aa8deef71d10',
'type' => 'library',
'install_path' => __DIR__ . '/../teampassclasses/emailservice',
@@ -968,8 +968,8 @@
'dev_requirement' => false,
),
'teampassclasses/encryption' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => 'f2ec8b0bceb22bd02f77a3f79159d6d1a385d1dd',
'type' => 'library',
'install_path' => __DIR__ . '/../teampassclasses/encryption',
@@ -977,8 +977,8 @@
'dev_requirement' => false,
),
'teampassclasses/folderservices' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => '737c43b0e11b6d6f15ae63fda23d87548cc87fc9',
'type' => 'library',
'install_path' => __DIR__ . '/../teampassclasses/folderservices',
@@ -986,8 +986,8 @@
'dev_requirement' => false,
),
'teampassclasses/language' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => '3465b1fba617063ba799e692cde82058116371d1',
'type' => 'library',
'install_path' => __DIR__ . '/../teampassclasses/language',
@@ -995,8 +995,8 @@
'dev_requirement' => false,
),
'teampassclasses/ldapextra' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => '81f049be19cfd37f81cc45b50d0d70ce611f67ee',
'type' => 'library',
'install_path' => __DIR__ . '/../teampassclasses/ldapextra',
@@ -1004,8 +1004,8 @@
'dev_requirement' => false,
),
'teampassclasses/nestedtree' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => 'df438ae79e64ad8e6a1d67717bbd14fe63466a63',
'type' => 'library',
'install_path' => __DIR__ . '/../teampassclasses/nestedtree',
@@ -1013,8 +1013,8 @@
'dev_requirement' => false,
),
'teampassclasses/oauth2controller' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => 'f643964d23a95b8e480f484e5809c3688611eb20',
'type' => 'library',
'install_path' => __DIR__ . '/../teampassclasses/oauth2controller',
@@ -1022,8 +1022,8 @@
'dev_requirement' => false,
),
'teampassclasses/passwordmanager' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => 'ab1f30f97ba362f4f3b393937ceb29fec5f1303b',
'type' => 'library',
'install_path' => __DIR__ . '/../teampassclasses/passwordmanager',
@@ -1031,8 +1031,8 @@
'dev_requirement' => false,
),
'teampassclasses/performchecks' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => '4d3e41441faf525b3e624312cf04aa02c766af0e',
'type' => 'library',
'install_path' => __DIR__ . '/../teampassclasses/performchecks',
@@ -1040,8 +1040,8 @@
'dev_requirement' => false,
),
'teampassclasses/sessionmanager' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => '3d59d6c5d4e65b0276ef0806491c32c7b6b20788',
'type' => 'library',
'install_path' => __DIR__ . '/../teampassclasses/sessionmanager',
@@ -1049,8 +1049,8 @@
'dev_requirement' => false,
),
'teampassclasses/superglobal' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
+ 'pretty_version' => 'dev-hotfix/code_clean',
+ 'version' => 'dev-hotfix/code_clean',
'reference' => 'f1a3be3120cba06901a5412c17f75d36bf315e25',
'type' => 'library',
'install_path' => __DIR__ . '/../teampassclasses/superglobal',
@@ -1058,9 +1058,9 @@
'dev_requirement' => false,
),
'tecnickcom/tcpdf' => array(
- 'pretty_version' => '6.7.7',
- 'version' => '6.7.7.0',
- 'reference' => 'cfbc0028cc23f057f2baf9e73bdc238153c22086',
+ 'pretty_version' => '6.8.0',
+ 'version' => '6.8.0.0',
+ 'reference' => '14ffa0e308f5634aa2489568b4b90b24073b6731',
'type' => 'library',
'install_path' => __DIR__ . '/../tecnickcom/tcpdf',
'aliases' => array(),
diff --git a/vendor/directorytree/ldaprecord/src/Models/Attributes/Timestamp.php b/vendor/directorytree/ldaprecord/src/Models/Attributes/Timestamp.php
index 4d35c7e43..60eaa1395 100644
--- a/vendor/directorytree/ldaprecord/src/Models/Attributes/Timestamp.php
+++ b/vendor/directorytree/ldaprecord/src/Models/Attributes/Timestamp.php
@@ -127,10 +127,12 @@ public function toDateTime(mixed $value): Carbon|int|false
*/
protected function convertLdapTimeToDateTime(string $value): DateTime|false
{
- return DateTime::createFromFormat(
- str_contains($value, 'Z') ? 'YmdHis\Z' : 'YmdHisT',
- $value
- );
+ return DateTime::createFromFormat(match (true) {
+ str_ends_with($value, '.000Z') => 'YmdHis.000\Z',
+ str_ends_with($value, '.0Z') => 'YmdHis.0\Z',
+ str_ends_with($value, 'Z') => 'YmdHis\Z',
+ default => 'YmdHisT',
+ }, $value);
}
/**
@@ -139,7 +141,9 @@ protected function convertLdapTimeToDateTime(string $value): DateTime|false
protected function convertDateTimeToLdapTime(DateTime $date): string
{
return $date->format(
- $date->getOffset() == 0 ? 'YmdHis\Z' : 'YmdHisO'
+ $date->getOffset() == 0
+ ? 'YmdHis\Z'
+ : 'YmdHisO'
);
}
@@ -148,11 +152,10 @@ protected function convertDateTimeToLdapTime(DateTime $date): string
*/
protected function convertWindowsTimeToDateTime(string $value): DateTime|false
{
- return DateTime::createFromFormat(
- str_contains($value, '0Z') ? 'YmdHis.0\Z' : 'YmdHis.0T',
- $value,
- new DateTimeZone('UTC')
- );
+ return DateTime::createFromFormat(match (true) {
+ str_ends_with($value, '.0Z') => 'YmdHis.0\Z',
+ default => 'YmdHis.0T'
+ }, $value, new DateTimeZone('UTC'));
}
/**
@@ -161,7 +164,9 @@ protected function convertWindowsTimeToDateTime(string $value): DateTime|false
protected function convertDateTimeToWindows(DateTime $date): string
{
return $date->format(
- $date->getOffset() == 0 ? 'YmdHis.0\Z' : 'YmdHis.0O'
+ $date->getOffset() == 0
+ ? 'YmdHis.0\Z'
+ : 'YmdHis.0O'
);
}
diff --git a/vendor/egulias/email-validator/CHANGELOG.md b/vendor/egulias/email-validator/CHANGELOG.md
deleted file mode 100644
index 39f5a8a05..000000000
--- a/vendor/egulias/email-validator/CHANGELOG.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# EmailValidator Changelog
-
-## New Features
-
-* Access to local part and domain part from EmailParser
-* Validations outside of the scope of the RFC will be considered "extra" validations, thus opening the door for adding new; will live in their own folder "extra" (as requested in #248, #195, #183).
-
-## Breaking changes
-
-* PHP version upgraded to match Symfony's (as of 12/2020).
-* DNSCheckValidation now fails for missing MX records. While the RFC argues that the existence of only A records to be valid, starting in v3 they will be considered invalid.
-* Emails domain part are now intenteded to be RFC 1035 compliant, rendering previous valid emails (e.g example@examp&) invalid.
-
-## PHP versions upgrade policy
-PHP version upgrade requirement will happen via MINOR (3.x) version upgrades of the library, following the adoption level by major frameworks.
-
-## Changes
-* #235
-* #215
-* #130
-* #258
-* #188
-* #181
-* #217
-* #214
-* #249
-* #236
-* #257
-* #210
-
-## Thanks
-To contributors, be it with PRs, reporting issues or supporting otherwise.
diff --git a/vendor/egulias/email-validator/src/EmailLexer.php b/vendor/egulias/email-validator/src/EmailLexer.php
index 969c049f8..a7fdc2d2c 100644
--- a/vendor/egulias/email-validator/src/EmailLexer.php
+++ b/vendor/egulias/email-validator/src/EmailLexer.php
@@ -61,7 +61,7 @@ class EmailLexer extends AbstractLexer
/**
* US-ASCII visible characters not valid for atext (@link http://tools.ietf.org/html/rfc5322#section-3.2.3)
*
- * @var array
+ * @var array
*/
protected $charValue = [
'{' => self::S_OPENCURLYBRACES,
@@ -177,7 +177,6 @@ public function reset(): void
* @throws \UnexpectedValueException
* @return boolean
*
- * @psalm-suppress InvalidScalarArgument
*/
public function find($type): bool
{
diff --git a/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php b/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php
index 5c18b440b..5f30a90b8 100644
--- a/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php
+++ b/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php
@@ -8,11 +8,12 @@
use Egulias\EmailValidator\Warning\CFWSNearAt;
use Egulias\EmailValidator\Result\InvalidEmail;
use Egulias\EmailValidator\Result\Reason\ExpectingATEXT;
+use Egulias\EmailValidator\Warning\Warning;
class LocalComment implements CommentStrategy
{
/**
- * @var array
+ * @var array
*/
private $warnings = [];
diff --git a/vendor/egulias/email-validator/src/Parser/DomainPart.php b/vendor/egulias/email-validator/src/Parser/DomainPart.php
index a1a56cf3d..3b6284b75 100644
--- a/vendor/egulias/email-validator/src/Parser/DomainPart.php
+++ b/vendor/egulias/email-validator/src/Parser/DomainPart.php
@@ -307,6 +307,7 @@ private function isLabelTooLong(string $label): bool
{
if (preg_match('/[^\x00-\x7F]/', $label)) {
idn_to_ascii($label, IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46, $idnaInfo);
+ /** @psalm-var array{errors: int, ...} $idnaInfo */
return (bool) ($idnaInfo['errors'] & IDNA_ERROR_LABEL_TOO_LONG);
}
return strlen($label) > self::LABEL_MAX_LENGTH;
diff --git a/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php b/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php
index 25e2fa06c..5d04c010c 100644
--- a/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php
+++ b/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php
@@ -7,13 +7,12 @@ class DNSGetRecordWrapper
/**
* @param string $host
* @param int $type
- *
+ *
* @return DNSRecords
*/
public function getRecords(string $host, int $type): DNSRecords
{
// A workaround to fix https://bugs.php.net/bug.php?id=73149
- /** @psalm-suppress InvalidArgument */
set_error_handler(
static function (int $errorLevel, string $errorMessage): never {
throw new \RuntimeException("Unable to get DNS record for the host: $errorMessage");
diff --git a/vendor/egulias/email-validator/src/Validation/DNSRecords.php b/vendor/egulias/email-validator/src/Validation/DNSRecords.php
index 3f775f068..ba4e8b552 100644
--- a/vendor/egulias/email-validator/src/Validation/DNSRecords.php
+++ b/vendor/egulias/email-validator/src/Validation/DNSRecords.php
@@ -5,7 +5,7 @@
class DNSRecords
{
/**
- * @param array $records
+ * @param list> $records
* @param bool $error
*/
public function __construct(private readonly array $records, private readonly bool $error = false)
@@ -13,7 +13,7 @@ public function __construct(private readonly array $records, private readonly bo
}
/**
- * @return array
+ * @return list>
*/
public function getRecords(): array
{
diff --git a/vendor/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php b/vendor/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php
index 463cafd49..faeefb698 100644
--- a/vendor/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php
+++ b/vendor/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php
@@ -22,9 +22,6 @@ public function __construct()
}
}
- /**
- * @psalm-suppress InvalidArgument
- */
public function isValid(string $email, EmailLexer $emailLexer) : bool
{
$checker = new Spoofchecker();
diff --git a/vendor/egulias/email-validator/src/Warning/QuotedPart.php b/vendor/egulias/email-validator/src/Warning/QuotedPart.php
index c3e017d94..db0850c9a 100644
--- a/vendor/egulias/email-validator/src/Warning/QuotedPart.php
+++ b/vendor/egulias/email-validator/src/Warning/QuotedPart.php
@@ -2,16 +2,26 @@
namespace Egulias\EmailValidator\Warning;
+use UnitEnum;
+
class QuotedPart extends Warning
{
public const CODE = 36;
/**
- * @param scalar|null $prevToken
- * @param scalar|null $postToken
+ * @param UnitEnum|string|int|null $prevToken
+ * @param UnitEnum|string|int|null $postToken
*/
public function __construct($prevToken, $postToken)
{
+ if ($prevToken instanceof UnitEnum) {
+ $prevToken = $prevToken->name;
+ }
+
+ if ($postToken instanceof UnitEnum) {
+ $postToken = $postToken->name;
+ }
+
$this->message = "Deprecated Quoted String found between $prevToken and $postToken";
}
}
diff --git a/vendor/egulias/email-validator/src/Warning/QuotedString.php b/vendor/egulias/email-validator/src/Warning/QuotedString.php
index c152ec2e2..388da0bce 100644
--- a/vendor/egulias/email-validator/src/Warning/QuotedString.php
+++ b/vendor/egulias/email-validator/src/Warning/QuotedString.php
@@ -7,8 +7,8 @@ class QuotedString extends Warning
public const CODE = 11;
/**
- * @param scalar $prevToken
- * @param scalar $postToken
+ * @param string|int $prevToken
+ * @param string|int $postToken
*/
public function __construct($prevToken, $postToken)
{
diff --git a/vendor/firebase/php-jwt/CHANGELOG.md b/vendor/firebase/php-jwt/CHANGELOG.md
index 2662b0502..5feeb5a67 100644
--- a/vendor/firebase/php-jwt/CHANGELOG.md
+++ b/vendor/firebase/php-jwt/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## [6.10.2](https://github.com/firebase/php-jwt/compare/v6.10.1...v6.10.2) (2024-11-24)
+
+
+### Bug Fixes
+
+* Mitigate PHP8.4 deprecation warnings ([#570](https://github.com/firebase/php-jwt/issues/570)) ([76808fa](https://github.com/firebase/php-jwt/commit/76808fa227f3811aa5cdb3bf81233714b799a5b5))
+* support php 8.4 ([#583](https://github.com/firebase/php-jwt/issues/583)) ([e3d68b0](https://github.com/firebase/php-jwt/commit/e3d68b044421339443c74199edd020e03fb1887e))
+
## [6.10.1](https://github.com/firebase/php-jwt/compare/v6.10.0...v6.10.1) (2024-05-18)
diff --git a/vendor/firebase/php-jwt/src/CachedKeySet.php b/vendor/firebase/php-jwt/src/CachedKeySet.php
index 65bab74f2..8e8e8d68c 100644
--- a/vendor/firebase/php-jwt/src/CachedKeySet.php
+++ b/vendor/firebase/php-jwt/src/CachedKeySet.php
@@ -80,9 +80,9 @@ public function __construct(
ClientInterface $httpClient,
RequestFactoryInterface $httpFactory,
CacheItemPoolInterface $cache,
- int $expiresAfter = null,
+ ?int $expiresAfter = null,
bool $rateLimit = false,
- string $defaultAlg = null
+ ?string $defaultAlg = null
) {
$this->jwksUri = $jwksUri;
$this->httpClient = $httpClient;
@@ -180,7 +180,7 @@ private function keyIdExists(string $keyId): bool
$jwksResponse = $this->httpClient->sendRequest($request);
if ($jwksResponse->getStatusCode() !== 200) {
throw new UnexpectedValueException(
- sprintf('HTTP Error: %d %s for URI "%s"',
+ \sprintf('HTTP Error: %d %s for URI "%s"',
$jwksResponse->getStatusCode(),
$jwksResponse->getReasonPhrase(),
$this->jwksUri,
diff --git a/vendor/firebase/php-jwt/src/JWK.php b/vendor/firebase/php-jwt/src/JWK.php
index 63fb2484b..6efc2fe38 100644
--- a/vendor/firebase/php-jwt/src/JWK.php
+++ b/vendor/firebase/php-jwt/src/JWK.php
@@ -52,7 +52,7 @@ class JWK
*
* @uses parseKey
*/
- public static function parseKeySet(array $jwks, string $defaultAlg = null): array
+ public static function parseKeySet(array $jwks, ?string $defaultAlg = null): array
{
$keys = [];
@@ -93,7 +93,7 @@ public static function parseKeySet(array $jwks, string $defaultAlg = null): arra
*
* @uses createPemFromModulusAndExponent
*/
- public static function parseKey(array $jwk, string $defaultAlg = null): ?Key
+ public static function parseKey(array $jwk, ?string $defaultAlg = null): ?Key
{
if (empty($jwk)) {
throw new InvalidArgumentException('JWK must not be empty');
@@ -212,7 +212,7 @@ private static function createPemFromCrvAndXYCoordinates(string $crv, string $x,
)
);
- return sprintf(
+ return \sprintf(
"-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----\n",
wordwrap(base64_encode($pem), 64, "\n", true)
);
diff --git a/vendor/firebase/php-jwt/src/JWT.php b/vendor/firebase/php-jwt/src/JWT.php
index e9d756398..dd9292a43 100644
--- a/vendor/firebase/php-jwt/src/JWT.php
+++ b/vendor/firebase/php-jwt/src/JWT.php
@@ -96,7 +96,7 @@ class JWT
public static function decode(
string $jwt,
$keyOrKeyArray,
- stdClass &$headers = null
+ ?stdClass &$headers = null
): stdClass {
// Validate JWT
$timestamp = \is_null(static::$timestamp) ? \time() : static::$timestamp;
@@ -200,11 +200,11 @@ public static function encode(
array $payload,
$key,
string $alg,
- string $keyId = null,
- array $head = null
+ ?string $keyId = null,
+ ?array $head = null
): string {
$header = ['typ' => 'JWT'];
- if (isset($head) && \is_array($head)) {
+ if (isset($head)) {
$header = \array_merge($header, $head);
}
$header['alg'] = $alg;
@@ -387,12 +387,7 @@ public static function jsonDecode(string $input)
*/
public static function jsonEncode(array $input): string
{
- if (PHP_VERSION_ID >= 50400) {
- $json = \json_encode($input, \JSON_UNESCAPED_SLASHES);
- } else {
- // PHP 5.3 only
- $json = \json_encode($input);
- }
+ $json = \json_encode($input, \JSON_UNESCAPED_SLASHES);
if ($errno = \json_last_error()) {
self::handleJsonError($errno);
} elseif ($json === 'null') {
diff --git a/vendor/illuminate/collections/Arr.php b/vendor/illuminate/collections/Arr.php
index 361808418..d83cf5f73 100644
--- a/vendor/illuminate/collections/Arr.php
+++ b/vendor/illuminate/collections/Arr.php
@@ -185,7 +185,7 @@ public static function exists($array, $key)
* @param mixed $default
* @return mixed
*/
- public static function first($array, callable $callback = null, $default = null)
+ public static function first($array, ?callable $callback = null, $default = null)
{
if (is_null($callback)) {
if (empty($array)) {
@@ -216,7 +216,7 @@ public static function first($array, callable $callback = null, $default = null)
* @param mixed $default
* @return mixed
*/
- public static function last($array, callable $callback = null, $default = null)
+ public static function last($array, ?callable $callback = null, $default = null)
{
if (is_null($callback)) {
return empty($array) ? value($default) : end($array);
diff --git a/vendor/illuminate/collections/Collection.php b/vendor/illuminate/collections/Collection.php
index d7369d686..2f0c768f1 100644
--- a/vendor/illuminate/collections/Collection.php
+++ b/vendor/illuminate/collections/Collection.php
@@ -382,7 +382,7 @@ public function except($keys)
* @param (callable(TValue, TKey): bool)|null $callback
* @return static
*/
- public function filter(callable $callback = null)
+ public function filter(?callable $callback = null)
{
if ($callback) {
return new static(Arr::where($this->items, $callback));
@@ -400,7 +400,7 @@ public function filter(callable $callback = null)
* @param TFirstDefault|(\Closure(): TFirstDefault) $default
* @return TValue|TFirstDefault
*/
- public function first(callable $callback = null, $default = null)
+ public function first(?callable $callback = null, $default = null)
{
return Arr::first($this->items, $callback, $default);
}
@@ -748,7 +748,7 @@ public function keys()
* @param TLastDefault|(\Closure(): TLastDefault) $default
* @return TValue|TLastDefault
*/
- public function last(callable $callback = null, $default = null)
+ public function last(?callable $callback = null, $default = null)
{
return Arr::last($this->items, $callback, $default);
}
diff --git a/vendor/illuminate/collections/Enumerable.php b/vendor/illuminate/collections/Enumerable.php
index 918f64758..806a6923f 100644
--- a/vendor/illuminate/collections/Enumerable.php
+++ b/vendor/illuminate/collections/Enumerable.php
@@ -38,7 +38,7 @@ public static function make($items = []);
* @param callable|null $callback
* @return static
*/
- public static function times($number, callable $callback = null);
+ public static function times($number, ?callable $callback = null);
/**
* Create a collection with the given range.
@@ -296,7 +296,7 @@ public function except($keys);
* @param (callable(TValue): bool)|null $callback
* @return static
*/
- public function filter(callable $callback = null);
+ public function filter(?callable $callback = null);
/**
* Apply the callback if the given "value" is (or resolves to) truthy.
@@ -308,7 +308,7 @@ public function filter(callable $callback = null);
* @param (callable($this): TWhenReturnType)|null $default
* @return $this|TWhenReturnType
*/
- public function when($value, callable $callback = null, callable $default = null);
+ public function when($value, ?callable $callback = null, ?callable $default = null);
/**
* Apply the callback if the collection is empty.
@@ -319,7 +319,7 @@ public function when($value, callable $callback = null, callable $default = null
* @param (callable($this): TWhenEmptyReturnType)|null $default
* @return $this|TWhenEmptyReturnType
*/
- public function whenEmpty(callable $callback, callable $default = null);
+ public function whenEmpty(callable $callback, ?callable $default = null);
/**
* Apply the callback if the collection is not empty.
@@ -330,7 +330,7 @@ public function whenEmpty(callable $callback, callable $default = null);
* @param (callable($this): TWhenNotEmptyReturnType)|null $default
* @return $this|TWhenNotEmptyReturnType
*/
- public function whenNotEmpty(callable $callback, callable $default = null);
+ public function whenNotEmpty(callable $callback, ?callable $default = null);
/**
* Apply the callback if the given "value" is (or resolves to) truthy.
@@ -342,7 +342,7 @@ public function whenNotEmpty(callable $callback, callable $default = null);
* @param (callable($this): TUnlessReturnType)|null $default
* @return $this|TUnlessReturnType
*/
- public function unless($value, callable $callback, callable $default = null);
+ public function unless($value, callable $callback, ?callable $default = null);
/**
* Apply the callback unless the collection is empty.
@@ -353,7 +353,7 @@ public function unless($value, callable $callback, callable $default = null);
* @param (callable($this): TUnlessEmptyReturnType)|null $default
* @return $this|TUnlessEmptyReturnType
*/
- public function unlessEmpty(callable $callback, callable $default = null);
+ public function unlessEmpty(callable $callback, ?callable $default = null);
/**
* Apply the callback unless the collection is not empty.
@@ -364,7 +364,7 @@ public function unlessEmpty(callable $callback, callable $default = null);
* @param (callable($this): TUnlessNotEmptyReturnType)|null $default
* @return $this|TUnlessNotEmptyReturnType
*/
- public function unlessNotEmpty(callable $callback, callable $default = null);
+ public function unlessNotEmpty(callable $callback, ?callable $default = null);
/**
* Filter items by the given key value pair.
@@ -476,7 +476,7 @@ public function whereInstanceOf($type);
* @param TFirstDefault|(\Closure(): TFirstDefault) $default
* @return TValue|TFirstDefault
*/
- public function first(callable $callback = null, $default = null);
+ public function first(?callable $callback = null, $default = null);
/**
* Get the first item by the given key value pair.
@@ -618,7 +618,7 @@ public function keys();
* @param TLastDefault|(\Closure(): TLastDefault) $default
* @return TValue|TLastDefault
*/
- public function last(callable $callback = null, $default = null);
+ public function last(?callable $callback = null, $default = null);
/**
* Run a map over each of the items.
diff --git a/vendor/illuminate/collections/LazyCollection.php b/vendor/illuminate/collections/LazyCollection.php
index 84b22ebf9..cd268b73d 100644
--- a/vendor/illuminate/collections/LazyCollection.php
+++ b/vendor/illuminate/collections/LazyCollection.php
@@ -428,7 +428,7 @@ public function except($keys)
* @param (callable(TValue, TKey): bool)|null $callback
* @return static
*/
- public function filter(callable $callback = null)
+ public function filter(?callable $callback = null)
{
if (is_null($callback)) {
$callback = fn ($value) => (bool) $value;
@@ -452,7 +452,7 @@ public function filter(callable $callback = null)
* @param TFirstDefault|(\Closure(): TFirstDefault) $default
* @return TValue|TFirstDefault
*/
- public function first(callable $callback = null, $default = null)
+ public function first(?callable $callback = null, $default = null)
{
$iterator = $this->getIterator();
@@ -732,7 +732,7 @@ public function keys()
* @param TLastDefault|(\Closure(): TLastDefault) $default
* @return TValue|TLastDefault
*/
- public function last(callable $callback = null, $default = null)
+ public function last(?callable $callback = null, $default = null)
{
$needle = $placeholder = new stdClass;
diff --git a/vendor/illuminate/collections/Traits/EnumeratesValues.php b/vendor/illuminate/collections/Traits/EnumeratesValues.php
index dd4d5ab29..9718f5bc5 100644
--- a/vendor/illuminate/collections/Traits/EnumeratesValues.php
+++ b/vendor/illuminate/collections/Traits/EnumeratesValues.php
@@ -164,7 +164,7 @@ public static function empty()
* @param (callable(int): TTimesValue)|null $callback
* @return static
*/
- public static function times($number, callable $callback = null)
+ public static function times($number, ?callable $callback = null)
{
if ($number < 1) {
return new static;
@@ -534,7 +534,7 @@ public function sum($callback = null)
* @param (callable($this): TWhenEmptyReturnType)|null $default
* @return $this|TWhenEmptyReturnType
*/
- public function whenEmpty(callable $callback, callable $default = null)
+ public function whenEmpty(callable $callback, ?callable $default = null)
{
return $this->when($this->isEmpty(), $callback, $default);
}
@@ -548,7 +548,7 @@ public function whenEmpty(callable $callback, callable $default = null)
* @param (callable($this): TWhenNotEmptyReturnType)|null $default
* @return $this|TWhenNotEmptyReturnType
*/
- public function whenNotEmpty(callable $callback, callable $default = null)
+ public function whenNotEmpty(callable $callback, ?callable $default = null)
{
return $this->when($this->isNotEmpty(), $callback, $default);
}
@@ -562,7 +562,7 @@ public function whenNotEmpty(callable $callback, callable $default = null)
* @param (callable($this): TUnlessEmptyReturnType)|null $default
* @return $this|TUnlessEmptyReturnType
*/
- public function unlessEmpty(callable $callback, callable $default = null)
+ public function unlessEmpty(callable $callback, ?callable $default = null)
{
return $this->whenNotEmpty($callback, $default);
}
@@ -576,7 +576,7 @@ public function unlessEmpty(callable $callback, callable $default = null)
* @param (callable($this): TUnlessNotEmptyReturnType)|null $default
* @return $this|TUnlessNotEmptyReturnType
*/
- public function unlessNotEmpty(callable $callback, callable $default = null)
+ public function unlessNotEmpty(callable $callback, ?callable $default = null)
{
return $this->whenEmpty($callback, $default);
}
diff --git a/vendor/illuminate/conditionable/Traits/Conditionable.php b/vendor/illuminate/conditionable/Traits/Conditionable.php
index 19307437c..5e3194bbc 100644
--- a/vendor/illuminate/conditionable/Traits/Conditionable.php
+++ b/vendor/illuminate/conditionable/Traits/Conditionable.php
@@ -18,7 +18,7 @@ trait Conditionable
* @param (callable($this, TWhenParameter): TWhenReturnType)|null $default
* @return $this|TWhenReturnType
*/
- public function when($value = null, callable $callback = null, callable $default = null)
+ public function when($value = null, ?callable $callback = null, ?callable $default = null)
{
$value = $value instanceof Closure ? $value($this) : $value;
@@ -50,7 +50,7 @@ public function when($value = null, callable $callback = null, callable $default
* @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $default
* @return $this|TUnlessReturnType
*/
- public function unless($value = null, callable $callback = null, callable $default = null)
+ public function unless($value = null, ?callable $callback = null, ?callable $default = null)
{
$value = $value instanceof Closure ? $value($this) : $value;
diff --git a/vendor/illuminate/container/Container.php b/vendor/illuminate/container/Container.php
index adb73bb51..874f49f69 100755
--- a/vendor/illuminate/container/Container.php
+++ b/vendor/illuminate/container/Container.php
@@ -1148,7 +1148,7 @@ protected function unresolvablePrimitive(ReflectionParameter $parameter)
* @param \Closure|null $callback
* @return void
*/
- public function beforeResolving($abstract, Closure $callback = null)
+ public function beforeResolving($abstract, ?Closure $callback = null)
{
if (is_string($abstract)) {
$abstract = $this->getAlias($abstract);
@@ -1168,7 +1168,7 @@ public function beforeResolving($abstract, Closure $callback = null)
* @param \Closure|null $callback
* @return void
*/
- public function resolving($abstract, Closure $callback = null)
+ public function resolving($abstract, ?Closure $callback = null)
{
if (is_string($abstract)) {
$abstract = $this->getAlias($abstract);
@@ -1188,7 +1188,7 @@ public function resolving($abstract, Closure $callback = null)
* @param \Closure|null $callback
* @return void
*/
- public function afterResolving($abstract, Closure $callback = null)
+ public function afterResolving($abstract, ?Closure $callback = null)
{
if (is_string($abstract)) {
$abstract = $this->getAlias($abstract);
@@ -1427,7 +1427,7 @@ public static function getInstance()
* @param \Illuminate\Contracts\Container\Container|null $container
* @return \Illuminate\Contracts\Container\Container|static
*/
- public static function setInstance(ContainerContract $container = null)
+ public static function setInstance(?ContainerContract $container = null)
{
return static::$instance = $container;
}
diff --git a/vendor/illuminate/contracts/Auth/Access/Gate.php b/vendor/illuminate/contracts/Auth/Access/Gate.php
index eb605d827..4bafab3f4 100644
--- a/vendor/illuminate/contracts/Auth/Access/Gate.php
+++ b/vendor/illuminate/contracts/Auth/Access/Gate.php
@@ -29,7 +29,7 @@ public function define($ability, $callback);
* @param array|null $abilities
* @return $this
*/
- public function resource($name, $class, array $abilities = null);
+ public function resource($name, $class, ?array $abilities = null);
/**
* Define a policy class for a given class type.
diff --git a/vendor/illuminate/contracts/Auth/PasswordBroker.php b/vendor/illuminate/contracts/Auth/PasswordBroker.php
index bbbe9b508..c6b202329 100644
--- a/vendor/illuminate/contracts/Auth/PasswordBroker.php
+++ b/vendor/illuminate/contracts/Auth/PasswordBroker.php
@@ -48,7 +48,7 @@ interface PasswordBroker
* @param \Closure|null $callback
* @return string
*/
- public function sendResetLink(array $credentials, Closure $callback = null);
+ public function sendResetLink(array $credentials, ?Closure $callback = null);
/**
* Reset the password for the given token.
diff --git a/vendor/illuminate/contracts/Container/Container.php b/vendor/illuminate/contracts/Container/Container.php
index 1472a2e5f..47c5f8b55 100644
--- a/vendor/illuminate/contracts/Container/Container.php
+++ b/vendor/illuminate/contracts/Container/Container.php
@@ -197,7 +197,7 @@ public function resolved($abstract);
* @param \Closure|null $callback
* @return void
*/
- public function beforeResolving($abstract, Closure $callback = null);
+ public function beforeResolving($abstract, ?Closure $callback = null);
/**
* Register a new resolving callback.
@@ -206,7 +206,7 @@ public function beforeResolving($abstract, Closure $callback = null);
* @param \Closure|null $callback
* @return void
*/
- public function resolving($abstract, Closure $callback = null);
+ public function resolving($abstract, ?Closure $callback = null);
/**
* Register a new after resolving callback.
@@ -215,5 +215,5 @@ public function resolving($abstract, Closure $callback = null);
* @param \Closure|null $callback
* @return void
*/
- public function afterResolving($abstract, Closure $callback = null);
+ public function afterResolving($abstract, ?Closure $callback = null);
}
diff --git a/vendor/illuminate/contracts/Process/InvokedProcess.php b/vendor/illuminate/contracts/Process/InvokedProcess.php
index d272d3772..87a92c047 100644
--- a/vendor/illuminate/contracts/Process/InvokedProcess.php
+++ b/vendor/illuminate/contracts/Process/InvokedProcess.php
@@ -60,5 +60,5 @@ public function latestErrorOutput();
* @param callable|null $output
* @return \Illuminate\Console\Process\ProcessResult
*/
- public function wait(callable $output = null);
+ public function wait(?callable $output = null);
}
diff --git a/vendor/illuminate/contracts/Process/ProcessResult.php b/vendor/illuminate/contracts/Process/ProcessResult.php
index 702701ea1..cf9adcced 100644
--- a/vendor/illuminate/contracts/Process/ProcessResult.php
+++ b/vendor/illuminate/contracts/Process/ProcessResult.php
@@ -52,7 +52,7 @@ public function errorOutput();
* @param callable|null $callback
* @return $this
*/
- public function throw(callable $callback = null);
+ public function throw(?callable $callback = null);
/**
* Throw an exception if the process failed and the given condition is true.
@@ -61,5 +61,5 @@ public function throw(callable $callback = null);
* @param callable|null $callback
* @return $this
*/
- public function throwIf(bool $condition, callable $callback = null);
+ public function throwIf(bool $condition, ?callable $callback = null);
}
diff --git a/vendor/illuminate/support/Composer.php b/vendor/illuminate/support/Composer.php
index 93da9b5ee..ad976c0d8 100644
--- a/vendor/illuminate/support/Composer.php
+++ b/vendor/illuminate/support/Composer.php
@@ -63,7 +63,7 @@ protected function hasPackage($package)
* @param string|null $composerBinary
* @return bool
*/
- public function requirePackages(array $packages, bool $dev = false, Closure|OutputInterface $output = null, $composerBinary = null)
+ public function requirePackages(array $packages, bool $dev = false, Closure|OutputInterface|null $output = null, $composerBinary = null)
{
$command = collect([
...$this->findComposer($composerBinary),
@@ -92,7 +92,7 @@ public function requirePackages(array $packages, bool $dev = false, Closure|Outp
* @param string|null $composerBinary
* @return bool
*/
- public function removePackages(array $packages, bool $dev = false, Closure|OutputInterface $output = null, $composerBinary = null)
+ public function removePackages(array $packages, bool $dev = false, Closure|OutputInterface|null $output = null, $composerBinary = null)
{
$command = collect([
...$this->findComposer($composerBinary),
diff --git a/vendor/illuminate/support/Facades/Bus.php b/vendor/illuminate/support/Facades/Bus.php
index 13fe1c9fe..6c22e027e 100644
--- a/vendor/illuminate/support/Facades/Bus.php
+++ b/vendor/illuminate/support/Facades/Bus.php
@@ -60,7 +60,7 @@ class Bus extends Facade
* @param \Illuminate\Bus\BatchRepository|null $batchRepository
* @return \Illuminate\Support\Testing\Fakes\BusFake
*/
- public static function fake($jobsToFake = [], BatchRepository $batchRepository = null)
+ public static function fake($jobsToFake = [], ?BatchRepository $batchRepository = null)
{
$actualDispatcher = static::isFake()
? static::getFacadeRoot()->dispatcher
diff --git a/vendor/illuminate/support/Facades/Process.php b/vendor/illuminate/support/Facades/Process.php
index 43b5b93a6..4f3546d07 100644
--- a/vendor/illuminate/support/Facades/Process.php
+++ b/vendor/illuminate/support/Facades/Process.php
@@ -65,7 +65,7 @@ protected static function getFacadeAccessor()
* @param \Closure|array|null $callback
* @return \Illuminate\Process\Factory
*/
- public static function fake(Closure|array $callback = null)
+ public static function fake(Closure|array|null $callback = null)
{
return tap(static::getFacadeRoot(), function ($fake) use ($callback) {
static::swap($fake->fake($callback));
diff --git a/vendor/illuminate/support/Str.php b/vendor/illuminate/support/Str.php
index 6217bb33e..d614ac628 100644
--- a/vendor/illuminate/support/Str.php
+++ b/vendor/illuminate/support/Str.php
@@ -959,7 +959,7 @@ public static function random($length = 16)
* @param callable|null $factory
* @return void
*/
- public static function createRandomStringsUsing(callable $factory = null)
+ public static function createRandomStringsUsing(?callable $factory = null)
{
static::$randomStringFactory = $factory;
}
@@ -1665,7 +1665,7 @@ public static function orderedUuid()
* @param callable|null $factory
* @return void
*/
- public static function createUuidsUsing(callable $factory = null)
+ public static function createUuidsUsing(?callable $factory = null)
{
static::$uuidFactory = $factory;
}
@@ -1710,7 +1710,7 @@ public static function createUuidsUsingSequence(array $sequence, $whenMissing =
* @param \Closure|null $callback
* @return \Ramsey\Uuid\UuidInterface
*/
- public static function freezeUuids(Closure $callback = null)
+ public static function freezeUuids(?Closure $callback = null)
{
$uuid = Str::uuid();
@@ -1772,7 +1772,7 @@ public static function createUlidsNormally()
* @param callable|null $factory
* @return void
*/
- public static function createUlidsUsing(callable $factory = null)
+ public static function createUlidsUsing(?callable $factory = null)
{
static::$ulidFactory = $factory;
}
@@ -1817,7 +1817,7 @@ public static function createUlidsUsingSequence(array $sequence, $whenMissing =
* @param Closure|null $callback
* @return Ulid
*/
- public static function freezeUlids(Closure $callback = null)
+ public static function freezeUlids(?Closure $callback = null)
{
$ulid = Str::ulid();
diff --git a/vendor/illuminate/support/Testing/Fakes/BusFake.php b/vendor/illuminate/support/Testing/Fakes/BusFake.php
index e62fac4b0..780b2929c 100644
--- a/vendor/illuminate/support/Testing/Fakes/BusFake.php
+++ b/vendor/illuminate/support/Testing/Fakes/BusFake.php
@@ -88,7 +88,7 @@ class BusFake implements Fake, QueueingDispatcher
* @param \Illuminate\Bus\BatchRepository|null $batchRepository
* @return void
*/
- public function __construct(QueueingDispatcher $dispatcher, $jobsToFake = [], BatchRepository $batchRepository = null)
+ public function __construct(QueueingDispatcher $dispatcher, $jobsToFake = [], ?BatchRepository $batchRepository = null)
{
$this->dispatcher = $dispatcher;
$this->jobsToFake = Arr::wrap($jobsToFake);
diff --git a/vendor/illuminate/support/Testing/Fakes/NotificationFake.php b/vendor/illuminate/support/Testing/Fakes/NotificationFake.php
index ee610a401..526c111c3 100644
--- a/vendor/illuminate/support/Testing/Fakes/NotificationFake.php
+++ b/vendor/illuminate/support/Testing/Fakes/NotificationFake.php
@@ -296,7 +296,7 @@ public function send($notifiables, $notification)
* @param array|null $channels
* @return void
*/
- public function sendNow($notifiables, $notification, array $channels = null)
+ public function sendNow($notifiables, $notification, ?array $channels = null)
{
if (! $notifiables instanceof Collection && ! is_array($notifiables)) {
$notifiables = [$notifiables];
diff --git a/vendor/illuminate/support/ValidatedInput.php b/vendor/illuminate/support/ValidatedInput.php
index 70bc6c3d2..0ed273772 100644
--- a/vendor/illuminate/support/ValidatedInput.php
+++ b/vendor/illuminate/support/ValidatedInput.php
@@ -280,7 +280,7 @@ public function hasAny($keys)
* @param callable|null $default
* @return $this|mixed
*/
- public function whenHas($key, callable $callback, callable $default = null)
+ public function whenHas($key, callable $callback, ?callable $default = null)
{
if ($this->has($key)) {
return $callback(data_get($this->all(), $key)) ?: $this;
@@ -358,7 +358,7 @@ public function anyFilled($keys)
* @param callable|null $default
* @return $this|mixed
*/
- public function whenFilled($key, callable $callback, callable $default = null)
+ public function whenFilled($key, callable $callback, ?callable $default = null)
{
if ($this->filled($key)) {
return $callback(data_get($this->all(), $key)) ?: $this;
@@ -379,7 +379,7 @@ public function whenFilled($key, callable $callback, callable $default = null)
* @param callable|null $default
* @return $this|mixed
*/
- public function whenMissing($key, callable $callback, callable $default = null)
+ public function whenMissing($key, callable $callback, ?callable $default = null)
{
if ($this->missing($key)) {
return $callback(data_get($this->all(), $key)) ?: $this;
diff --git a/vendor/illuminate/support/helpers.php b/vendor/illuminate/support/helpers.php
index 991f403f3..cdcf52f15 100755
--- a/vendor/illuminate/support/helpers.php
+++ b/vendor/illuminate/support/helpers.php
@@ -187,7 +187,7 @@ function object_get($object, $key, $default = null)
* @param callable|null $callback
* @return mixed
*/
- function optional($value = null, callable $callback = null)
+ function optional($value = null, ?callable $callback = null)
{
if (is_null($callback)) {
return new Optional($value);
@@ -427,7 +427,7 @@ function windows_os()
* @param (callable(TValue): (TReturn))|null $callback
* @return ($callback is null ? TValue : TReturn)
*/
- function with($value, callable $callback = null)
+ function with($value, ?callable $callback = null)
{
return is_null($callback) ? $value : $callback($value);
}
diff --git a/vendor/illuminate/validation/Concerns/FormatsMessages.php b/vendor/illuminate/validation/Concerns/FormatsMessages.php
index 2d68828d1..39b68f9c6 100644
--- a/vendor/illuminate/validation/Concerns/FormatsMessages.php
+++ b/vendor/illuminate/validation/Concerns/FormatsMessages.php
@@ -361,7 +361,7 @@ protected function replacePositionPlaceholder($message, $attribute)
* @param \Closure|null $modifier
* @return string
*/
- protected function replaceIndexOrPositionPlaceholder($message, $attribute, $placeholder, Closure $modifier = null)
+ protected function replaceIndexOrPositionPlaceholder($message, $attribute, $placeholder, ?Closure $modifier = null)
{
$segments = explode('.', $attribute);
diff --git a/vendor/illuminate/validation/Factory.php b/vendor/illuminate/validation/Factory.php
index fcb669e17..6ebfcac50 100755
--- a/vendor/illuminate/validation/Factory.php
+++ b/vendor/illuminate/validation/Factory.php
@@ -87,7 +87,7 @@ class Factory implements FactoryContract
* @param \Illuminate\Contracts\Container\Container|null $container
* @return void
*/
- public function __construct(Translator $translator, Container $container = null)
+ public function __construct(Translator $translator, ?Container $container = null)
{
$this->container = $container;
$this->translator = $translator;
diff --git a/vendor/illuminate/validation/Validator.php b/vendor/illuminate/validation/Validator.php
index ed5028e32..91d3b6a2e 100755
--- a/vendor/illuminate/validation/Validator.php
+++ b/vendor/illuminate/validation/Validator.php
@@ -561,7 +561,7 @@ public function validateWithBag(string $errorBag)
* @param array|null $keys
* @return \Illuminate\Support\ValidatedInput|array
*/
- public function safe(array $keys = null)
+ public function safe(?array $keys = null)
{
return is_array($keys)
? (new ValidatedInput($this->validated()))->only($keys)
@@ -1428,7 +1428,7 @@ public function addCustomAttributes(array $attributes)
* @param callable|null $formatter
* @return $this
*/
- public function setImplicitAttributesFormatter(callable $formatter = null)
+ public function setImplicitAttributesFormatter(?callable $formatter = null)
{
$this->implicitAttributesFormatter = $formatter;
diff --git a/vendor/league/oauth2-client/LICENSE b/vendor/league/oauth2-client/LICENSE
index 7dfa39b7c..9c8958afc 100644
--- a/vendor/league/oauth2-client/LICENSE
+++ b/vendor/league/oauth2-client/LICENSE
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright (c) 2013-2020 Alex Bilbie
+Copyright (c) 2013-2023 Alex Bilbie
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/league/oauth2-client/README.md b/vendor/league/oauth2-client/README.md
index cbb449d48..37a127d15 100644
--- a/vendor/league/oauth2-client/README.md
+++ b/vendor/league/oauth2-client/README.md
@@ -24,14 +24,15 @@ This package is compliant with [PSR-1][], [PSR-2][], [PSR-4][], and [PSR-7][]. I
We support the following versions of PHP:
+* PHP 8.4
+* PHP 8.3
+* PHP 8.2
* PHP 8.1
* PHP 8.0
* PHP 7.4
* PHP 7.3
* PHP 7.2
* PHP 7.1
-* PHP 7.0
-* PHP 5.6
## Provider Clients
diff --git a/vendor/league/oauth2-client/composer.json b/vendor/league/oauth2-client/composer.json
index 59201f48f..905f7ce8f 100644
--- a/vendor/league/oauth2-client/composer.json
+++ b/vendor/league/oauth2-client/composer.json
@@ -6,15 +6,15 @@
"sort-packages": true
},
"require": {
- "php": "^5.6 || ^7.0 || ^8.0",
- "guzzlehttp/guzzle": "^6.0 || ^7.0",
- "paragonie/random_compat": "^1 || ^2 || ^9.99"
+ "php": "^7.1 || >=8.0.0 <8.5.0",
+ "ext-json": "*",
+ "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5"
},
"require-dev": {
"mockery/mockery": "^1.3.5",
- "php-parallel-lint/php-parallel-lint": "^1.3.1",
- "phpunit/phpunit": "^5.7 || ^6.0 || ^9.5",
- "squizlabs/php_codesniffer": "^2.3 || ^3.0"
+ "php-parallel-lint/php-parallel-lint": "^1.4",
+ "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11",
+ "squizlabs/php_codesniffer": "^3.11"
},
"keywords": [
"oauth",
@@ -49,10 +49,5 @@
"psr-4": {
"League\\OAuth2\\Client\\Test\\": "test/src/"
}
- },
- "extra": {
- "branch-alias": {
- "dev-2.x": "2.0.x-dev"
- }
}
}
diff --git a/vendor/league/oauth2-client/phpunit.xml.dist b/vendor/league/oauth2-client/phpunit.xml.dist
new file mode 100644
index 000000000..e63822b2f
--- /dev/null
+++ b/vendor/league/oauth2-client/phpunit.xml.dist
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ test
+
+
+
+
+
+
+
+
+
+ src
+
+
+
+
+
+
+
+
diff --git a/vendor/league/oauth2-client/src/Provider/AbstractProvider.php b/vendor/league/oauth2-client/src/Provider/AbstractProvider.php
index 293a54d6e..26f6d1c68 100644
--- a/vendor/league/oauth2-client/src/Provider/AbstractProvider.php
+++ b/vendor/league/oauth2-client/src/Provider/AbstractProvider.php
@@ -495,7 +495,7 @@ public function getAuthorizationUrl(array $options = [])
*/
public function authorize(
array $options = [],
- callable $redirectHandler = null
+ ?callable $redirectHandler = null
) {
$url = $this->getAuthorizationUrl($options);
if ($redirectHandler) {
@@ -620,6 +620,15 @@ public function getAccessToken($grant, array $options = [])
{
$grant = $this->verifyGrant($grant);
+ if (empty($options['scope'])) {
+ $options['scope'] = $this->getDefaultScopes();
+ }
+
+ if (is_array($options['scope'])) {
+ $separator = $this->getScopeSeparator();
+ $options['scope'] = implode($separator, $options['scope']);
+ }
+
$params = [
'client_id' => $this->clientId,
'client_secret' => $this->clientSecret,
@@ -757,7 +766,7 @@ protected function parseJson($content)
*/
protected function getContentType(ResponseInterface $response)
{
- return join(';', (array) $response->getHeader('content-type'));
+ return implode(';', $response->getHeader('content-type'));
}
/**
@@ -815,7 +824,7 @@ abstract protected function checkResponse(ResponseInterface $response, $data);
* Custom mapping of expiration, etc should be done here. Always call the
* parent method when overloading this method.
*
- * @param mixed $result
+ * @param array $result
* @return array
*/
protected function prepareAccessTokenResponse(array $result)
diff --git a/vendor/league/oauth2-client/src/Token/AccessToken.php b/vendor/league/oauth2-client/src/Token/AccessToken.php
index 81533c307..331b0ace6 100644
--- a/vendor/league/oauth2-client/src/Token/AccessToken.php
+++ b/vendor/league/oauth2-client/src/Token/AccessToken.php
@@ -22,7 +22,7 @@
*
* @link http://tools.ietf.org/html/rfc6749#section-1.4 Access Token (RFC 6749, §1.4)
*/
-class AccessToken implements AccessTokenInterface, ResourceOwnerAccessTokenInterface
+class AccessToken implements AccessTokenInterface, ResourceOwnerAccessTokenInterface, SettableRefreshTokenInterface
{
/**
* @var string
@@ -118,7 +118,7 @@ public function __construct(array $options = [])
} elseif (!empty($options['expires'])) {
// Some providers supply the seconds until expiration rather than
// the exact timestamp. Take a best guess at which we received.
- $expires = $options['expires'];
+ $expires = (int) $options['expires'];
if (!$this->isExpirationTimestamp($expires)) {
$expires += $this->getTimeNow();
@@ -169,6 +169,14 @@ public function getRefreshToken()
return $this->refreshToken;
}
+ /**
+ * @inheritdoc
+ */
+ public function setRefreshToken($refreshToken)
+ {
+ $this->refreshToken = $refreshToken;
+ }
+
/**
* @inheritdoc
*/
@@ -196,7 +204,7 @@ public function hasExpired()
throw new RuntimeException('"expires" is not set on the token');
}
- return $expires < time();
+ return $expires < $this->getTimeNow();
}
/**
diff --git a/vendor/league/oauth2-client/src/Token/SettableRefreshTokenInterface.php b/vendor/league/oauth2-client/src/Token/SettableRefreshTokenInterface.php
new file mode 100644
index 000000000..491bee991
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Token/SettableRefreshTokenInterface.php
@@ -0,0 +1,26 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Token;
+
+interface SettableRefreshTokenInterface
+{
+ /**
+ * Sets or replaces the refresh token with the provided refresh token.
+ *
+ * @param string $refreshToken
+ * @return void
+ */
+ public function setRefreshToken($refreshToken);
+}
diff --git a/vendor/nesbot/carbon/composer.json b/vendor/nesbot/carbon/composer.json
index 0014434ea..ccd2a2cc0 100644
--- a/vendor/nesbot/carbon/composer.json
+++ b/vendor/nesbot/carbon/composer.json
@@ -53,7 +53,7 @@
"doctrine/orm": "^2.7 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.0",
"kylekatarnls/multi-tester": "^2.0",
- "ondrejmirtes/better-reflection": "*",
+ "ondrejmirtes/better-reflection": "<6",
"phpmd/phpmd": "^2.9",
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^0.12.99 || ^1.7.14",
diff --git a/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php b/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php
index 8b8fe089e..ffe82e43c 100644
--- a/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php
+++ b/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php
@@ -159,6 +159,8 @@ public function resetMessages($locale = null)
return true;
}
+ $this->assertValidLocale($locale);
+
foreach ($this->getDirectories() as $directory) {
$data = @include sprintf('%s/%s.php', rtrim($directory, '\\/'), $locale);
diff --git a/vendor/phpmailer/phpmailer/README.md b/vendor/phpmailer/phpmailer/README.md
index 8c2ec4543..07fe8c8ab 100644
--- a/vendor/phpmailer/phpmailer/README.md
+++ b/vendor/phpmailer/phpmailer/README.md
@@ -162,7 +162,7 @@ To reduce PHPMailer's deployed code footprint, examples are not included if you
Complete generated API documentation is [available online](https://phpmailer.github.io/PHPMailer/).
-You can generate complete API-level documentation by running `phpdoc` in the top-level folder, and documentation will appear in the `docs` folder, though you'll need to have [PHPDocumentor](https://www.phpdoc.org) installed. You may find [the unit tests](https://github.com/PHPMailer/PHPMailer/blob/master/test/PHPMailerTest.php) a good reference for how to do various operations such as encryption.
+You can generate complete API-level documentation by running `phpdoc` in the top-level folder, and documentation will appear in the `docs` folder, though you'll need to have [PHPDocumentor](https://www.phpdoc.org) installed. You may find [the unit tests](https://github.com/PHPMailer/PHPMailer/blob/master/test/PHPMailer/PHPMailerTest.php) a good reference for how to do various operations such as encryption.
If the documentation doesn't cover what you need, search the [many questions on Stack Overflow](https://stackoverflow.com/questions/tagged/phpmailer), and before you ask a question about "SMTP Error: Could not connect to SMTP host.", [read the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting).
diff --git a/vendor/phpmailer/phpmailer/VERSION b/vendor/phpmailer/phpmailer/VERSION
index 6b9255cf0..5f54f91ea 100644
--- a/vendor/phpmailer/phpmailer/VERSION
+++ b/vendor/phpmailer/phpmailer/VERSION
@@ -1 +1 @@
-6.9.2
+6.9.3
diff --git a/vendor/phpmailer/phpmailer/src/PHPMailer.php b/vendor/phpmailer/phpmailer/src/PHPMailer.php
index 12da10354..4a6077c01 100644
--- a/vendor/phpmailer/phpmailer/src/PHPMailer.php
+++ b/vendor/phpmailer/phpmailer/src/PHPMailer.php
@@ -253,7 +253,7 @@ class PHPMailer
* You can set your own, but it must be in the format "",
* as defined in RFC5322 section 3.6.4 or it will be ignored.
*
- * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
+ * @see https://www.rfc-editor.org/rfc/rfc5322#section-3.6.4
*
* @var string
*/
@@ -387,7 +387,7 @@ class PHPMailer
* 'DELAY' will notify you if there is an unusual delay in delivery, but the actual
* delivery's outcome (success or failure) is not yet decided.
*
- * @see https://tools.ietf.org/html/rfc3461 See section 4.1 for more information about NOTIFY
+ * @see https://www.rfc-editor.org/rfc/rfc3461.html#section-4.1 for more information about NOTIFY
*/
public $dsn = '';
@@ -756,7 +756,7 @@ class PHPMailer
*
* @var string
*/
- const VERSION = '6.9.2';
+ const VERSION = '6.9.3';
/**
* Error severity: message only, continue processing.
@@ -1871,7 +1871,7 @@ protected static function isShellSafe($string)
*/
protected static function isPermittedPath($path)
{
- //Matches scheme definition from https://tools.ietf.org/html/rfc3986#section-3.1
+ //Matches scheme definition from https://www.rfc-editor.org/rfc/rfc3986#section-3.1
return !preg_match('#^[a-z][a-z\d+.-]*://#i', $path);
}
@@ -2705,7 +2705,7 @@ public function createHeader()
}
//Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
- //https://tools.ietf.org/html/rfc5322#section-3.6.4
+ //https://www.rfc-editor.org/rfc/rfc5322#section-3.6.4
if (
'' !== $this->MessageID &&
preg_match(
@@ -4910,7 +4910,7 @@ public function DKIM_Sign($signHeader)
* Uses the 'relaxed' algorithm from RFC6376 section 3.4.2.
* Canonicalized headers should *always* use CRLF, regardless of mailer setting.
*
- * @see https://tools.ietf.org/html/rfc6376#section-3.4.2
+ * @see https://www.rfc-editor.org/rfc/rfc6376#section-3.4.2
*
* @param string $signHeader Header
*
@@ -4922,7 +4922,7 @@ public function DKIM_HeaderC($signHeader)
$signHeader = static::normalizeBreaks($signHeader, self::CRLF);
//Unfold header lines
//Note PCRE \s is too broad a definition of whitespace; RFC5322 defines it as `[ \t]`
- //@see https://tools.ietf.org/html/rfc5322#section-2.2
+ //@see https://www.rfc-editor.org/rfc/rfc5322#section-2.2
//That means this may break if you do something daft like put vertical tabs in your headers.
$signHeader = preg_replace('/\r\n[ \t]+/', ' ', $signHeader);
//Break headers out into an array
@@ -4954,7 +4954,7 @@ public function DKIM_HeaderC($signHeader)
* Uses the 'simple' algorithm from RFC6376 section 3.4.3.
* Canonicalized bodies should *always* use CRLF, regardless of mailer setting.
*
- * @see https://tools.ietf.org/html/rfc6376#section-3.4.3
+ * @see https://www.rfc-editor.org/rfc/rfc6376#section-3.4.3
*
* @param string $body Message Body
*
@@ -4990,7 +4990,7 @@ public function DKIM_Add($headers_line, $subject, $body)
$DKIMquery = 'dns/txt'; //Query method
$DKIMtime = time();
//Always sign these headers without being asked
- //Recommended list from https://tools.ietf.org/html/rfc6376#section-5.4.1
+ //Recommended list from https://www.rfc-editor.org/rfc/rfc6376#section-5.4.1
$autoSignHeaders = [
'from',
'to',
@@ -5096,7 +5096,7 @@ public function DKIM_Add($headers_line, $subject, $body)
}
//The DKIM-Signature header is included in the signature *except for* the value of the `b` tag
//which is appended after calculating the signature
- //https://tools.ietf.org/html/rfc6376#section-3.5
+ //https://www.rfc-editor.org/rfc/rfc6376#section-3.5
$dkimSignatureHeader = 'DKIM-Signature: v=1;' .
' d=' . $this->DKIM_domain . ';' .
' s=' . $this->DKIM_selector . ';' . static::$LE .
diff --git a/vendor/phpmailer/phpmailer/src/POP3.php b/vendor/phpmailer/phpmailer/src/POP3.php
index 697c96126..376fae2a8 100644
--- a/vendor/phpmailer/phpmailer/src/POP3.php
+++ b/vendor/phpmailer/phpmailer/src/POP3.php
@@ -46,7 +46,7 @@ class POP3
*
* @var string
*/
- const VERSION = '6.9.2';
+ const VERSION = '6.9.3';
/**
* Default POP3 port number.
diff --git a/vendor/phpmailer/phpmailer/src/SMTP.php b/vendor/phpmailer/phpmailer/src/SMTP.php
index 5b238b527..b4eff4042 100644
--- a/vendor/phpmailer/phpmailer/src/SMTP.php
+++ b/vendor/phpmailer/phpmailer/src/SMTP.php
@@ -35,7 +35,7 @@ class SMTP
*
* @var string
*/
- const VERSION = '6.9.2';
+ const VERSION = '6.9.3';
/**
* SMTP line break constant.
@@ -62,7 +62,7 @@ class SMTP
* The maximum line length allowed by RFC 5321 section 4.5.3.1.6,
* *excluding* a trailing CRLF break.
*
- * @see https://tools.ietf.org/html/rfc5321#section-4.5.3.1.6
+ * @see https://www.rfc-editor.org/rfc/rfc5321#section-4.5.3.1.6
*
* @var int
*/
@@ -72,7 +72,7 @@ class SMTP
* The maximum line length allowed for replies in RFC 5321 section 4.5.3.1.5,
* *including* a trailing CRLF line break.
*
- * @see https://tools.ietf.org/html/rfc5321#section-4.5.3.1.5
+ * @see https://www.rfc-editor.org/rfc/rfc5321#section-4.5.3.1.5
*
* @var int
*/
@@ -373,7 +373,7 @@ public function connect($host, $port = null, $timeout = 30, $options = [])
}
//Anything other than a 220 response means something went wrong
//RFC 5321 says the server will wait for us to send a QUIT in response to a 554 error
- //https://tools.ietf.org/html/rfc5321#section-3.1
+ //https://www.rfc-editor.org/rfc/rfc5321#section-3.1
if ($responseCode === 554) {
$this->quit();
}
@@ -582,7 +582,7 @@ public function authenticate(
}
//Send encoded username and password
if (
- //Format from https://tools.ietf.org/html/rfc4616#section-2
+ //Format from https://www.rfc-editor.org/rfc/rfc4616#section-2
//We skip the first field (it's forgery), so the string starts with a null byte
!$this->sendCommand(
'User & Password',
@@ -795,7 +795,7 @@ public function data($msg_data)
//Send the lines to the server
foreach ($lines_out as $line_out) {
//Dot-stuffing as per RFC5321 section 4.5.2
- //https://tools.ietf.org/html/rfc5321#section-4.5.2
+ //https://www.rfc-editor.org/rfc/rfc5321#section-4.5.2
if (!empty($line_out) && $line_out[0] === '.') {
$line_out = '.' . $line_out;
}
diff --git a/vendor/symfony/cache/Traits/Relay/CopyTrait.php b/vendor/symfony/cache/Traits/Relay/CopyTrait.php
new file mode 100644
index 000000000..a271a9d10
--- /dev/null
+++ b/vendor/symfony/cache/Traits/Relay/CopyTrait.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits\Relay;
+
+if (version_compare(phpversion('relay'), '0.8.1', '>=')) {
+ /**
+ * @internal
+ */
+ trait CopyTrait
+ {
+ public function copy($src, $dst, $options = null): \Relay\Relay|bool
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\func_get_args());
+ }
+ }
+} else {
+ /**
+ * @internal
+ */
+ trait CopyTrait
+ {
+ public function copy($src, $dst, $options = null): \Relay\Relay|false|int
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\func_get_args());
+ }
+ }
+}
diff --git a/vendor/symfony/cache/Traits/Relay/GeosearchTrait.php b/vendor/symfony/cache/Traits/Relay/GeosearchTrait.php
new file mode 100644
index 000000000..88ed1e9d3
--- /dev/null
+++ b/vendor/symfony/cache/Traits/Relay/GeosearchTrait.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits\Relay;
+
+if (version_compare(phpversion('relay'), '0.9.0', '>=')) {
+ /**
+ * @internal
+ */
+ trait GeosearchTrait
+ {
+ public function geosearch($key, $position, $shape, $unit, $options = []): \Relay\Relay|array|false
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\func_get_args());
+ }
+ }
+} else {
+ /**
+ * @internal
+ */
+ trait GeosearchTrait
+ {
+ public function geosearch($key, $position, $shape, $unit, $options = []): \Relay\Relay|array
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\func_get_args());
+ }
+ }
+}
diff --git a/vendor/symfony/cache/Traits/Relay/GetrangeTrait.php b/vendor/symfony/cache/Traits/Relay/GetrangeTrait.php
new file mode 100644
index 000000000..4522d20b5
--- /dev/null
+++ b/vendor/symfony/cache/Traits/Relay/GetrangeTrait.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits\Relay;
+
+if (version_compare(phpversion('relay'), '0.9.0', '>=')) {
+ /**
+ * @internal
+ */
+ trait GetrangeTrait
+ {
+ public function getrange($key, $start, $end): mixed
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\func_get_args());
+ }
+ }
+} else {
+ /**
+ * @internal
+ */
+ trait GetrangeTrait
+ {
+ public function getrange($key, $start, $end): \Relay\Relay|false|string
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\func_get_args());
+ }
+ }
+}
diff --git a/vendor/symfony/cache/Traits/Relay/HsetTrait.php b/vendor/symfony/cache/Traits/Relay/HsetTrait.php
new file mode 100644
index 000000000..a7cb8fff0
--- /dev/null
+++ b/vendor/symfony/cache/Traits/Relay/HsetTrait.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits\Relay;
+
+if (version_compare(phpversion('relay'), '0.9.0', '>=')) {
+ /**
+ * @internal
+ */
+ trait HsetTrait
+ {
+ public function hset($key, ...$keys_and_vals): \Relay\Relay|false|int
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\func_get_args());
+ }
+ }
+} else {
+ /**
+ * @internal
+ */
+ trait HsetTrait
+ {
+ public function hset($key, $mem, $val, ...$kvals): \Relay\Relay|false|int
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\func_get_args());
+ }
+ }
+}
diff --git a/vendor/symfony/cache/Traits/Relay/MoveTrait.php b/vendor/symfony/cache/Traits/Relay/MoveTrait.php
new file mode 100644
index 000000000..d00735ddb
--- /dev/null
+++ b/vendor/symfony/cache/Traits/Relay/MoveTrait.php
@@ -0,0 +1,46 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits\Relay;
+
+if (version_compare(phpversion('relay'), '0.9.0', '>=')) {
+ /**
+ * @internal
+ */
+ trait MoveTrait
+ {
+ public function blmove($srckey, $dstkey, $srcpos, $dstpos, $timeout): mixed
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\func_get_args());
+ }
+
+ public function lmove($srckey, $dstkey, $srcpos, $dstpos): mixed
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmove(...\func_get_args());
+ }
+ }
+} else {
+ /**
+ * @internal
+ */
+ trait MoveTrait
+ {
+ public function blmove($srckey, $dstkey, $srcpos, $dstpos, $timeout): \Relay\Relay|false|null|string
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\func_get_args());
+ }
+
+ public function lmove($srckey, $dstkey, $srcpos, $dstpos): \Relay\Relay|false|null|string
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmove(...\func_get_args());
+ }
+ }
+}
diff --git a/vendor/symfony/cache/Traits/Relay/NullableReturnTrait.php b/vendor/symfony/cache/Traits/Relay/NullableReturnTrait.php
new file mode 100644
index 000000000..0b7409045
--- /dev/null
+++ b/vendor/symfony/cache/Traits/Relay/NullableReturnTrait.php
@@ -0,0 +1,96 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits\Relay;
+
+if (version_compare(phpversion('relay'), '0.9.0', '>=')) {
+ /**
+ * @internal
+ */
+ trait NullableReturnTrait
+ {
+ public function dump($key): \Relay\Relay|false|string|null
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args());
+ }
+
+ public function geodist($key, $src, $dst, $unit = null): \Relay\Relay|false|float|null
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args());
+ }
+
+ public function hrandfield($hash, $options = null): \Relay\Relay|array|false|string|null
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hrandfield(...\func_get_args());
+ }
+
+ public function xadd($key, $id, $values, $maxlen = 0, $approx = false, $nomkstream = false): \Relay\Relay|false|string|null
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args());
+ }
+
+ public function zrank($key, $rank, $withscore = false): \Relay\Relay|array|false|int|null
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\func_get_args());
+ }
+
+ public function zrevrank($key, $rank, $withscore = false): \Relay\Relay|array|false|int|null
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\func_get_args());
+ }
+
+ public function zscore($key, $member): \Relay\Relay|false|float|null
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\func_get_args());
+ }
+ }
+} else {
+ /**
+ * @internal
+ */
+ trait NullableReturnTrait
+ {
+ public function dump($key): \Relay\Relay|false|string
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args());
+ }
+
+ public function geodist($key, $src, $dst, $unit = null): \Relay\Relay|false|float
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args());
+ }
+
+ public function hrandfield($hash, $options = null): \Relay\Relay|array|false|string
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hrandfield(...\func_get_args());
+ }
+
+ public function xadd($key, $id, $values, $maxlen = 0, $approx = false, $nomkstream = false): \Relay\Relay|false|string
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args());
+ }
+
+ public function zrank($key, $rank, $withscore = false): \Relay\Relay|array|false|int
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\func_get_args());
+ }
+
+ public function zrevrank($key, $rank, $withscore = false): \Relay\Relay|array|false|int
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\func_get_args());
+ }
+
+ public function zscore($key, $member): \Relay\Relay|false|float
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\func_get_args());
+ }
+ }
+}
diff --git a/vendor/symfony/cache/Traits/Relay/PfcountTrait.php b/vendor/symfony/cache/Traits/Relay/PfcountTrait.php
new file mode 100644
index 000000000..340db8af7
--- /dev/null
+++ b/vendor/symfony/cache/Traits/Relay/PfcountTrait.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits\Relay;
+
+if (version_compare(phpversion('relay'), '0.9.0', '>=')) {
+ /**
+ * @internal
+ */
+ trait PfcountTrait
+ {
+ public function pfcount($key_or_keys): \Relay\Relay|false|int
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args());
+ }
+ }
+} else {
+ /**
+ * @internal
+ */
+ trait PfcountTrait
+ {
+ public function pfcount($key): \Relay\Relay|false|int
+ {
+ return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args());
+ }
+ }
+}
diff --git a/vendor/symfony/cache/Traits/RelayProxy.php b/vendor/symfony/cache/Traits/RelayProxy.php
index 96d7d19b4..e86c2102a 100644
--- a/vendor/symfony/cache/Traits/RelayProxy.php
+++ b/vendor/symfony/cache/Traits/RelayProxy.php
@@ -11,6 +11,13 @@
namespace Symfony\Component\Cache\Traits;
+use Symfony\Component\Cache\Traits\Relay\CopyTrait;
+use Symfony\Component\Cache\Traits\Relay\GeosearchTrait;
+use Symfony\Component\Cache\Traits\Relay\GetrangeTrait;
+use Symfony\Component\Cache\Traits\Relay\HsetTrait;
+use Symfony\Component\Cache\Traits\Relay\MoveTrait;
+use Symfony\Component\Cache\Traits\Relay\NullableReturnTrait;
+use Symfony\Component\Cache\Traits\Relay\PfcountTrait;
use Symfony\Component\VarExporter\LazyObjectInterface;
use Symfony\Component\VarExporter\LazyProxyTrait;
use Symfony\Contracts\Service\ResetInterface;
@@ -25,9 +32,16 @@ class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);
*/
class RelayProxy extends \Relay\Relay implements ResetInterface, LazyObjectInterface
{
+ use CopyTrait;
+ use GeosearchTrait;
+ use GetrangeTrait;
+ use HsetTrait;
use LazyProxyTrait {
resetLazyObject as reset;
}
+ use MoveTrait;
+ use NullableReturnTrait;
+ use PfcountTrait;
use RelayProxyTrait;
private const LAZY_OBJECT_PROPERTY_SCOPES = [];
@@ -267,11 +281,6 @@ public function dbsize(): \Relay\Relay|false|int
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbsize(...\func_get_args());
}
- public function dump($key): \Relay\Relay|false|string
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args());
- }
-
public function replicaof($host = null, $port = 0): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->replicaof(...\func_get_args());
@@ -392,11 +401,6 @@ public function geoadd($key, $lng, $lat, $member, ...$other_triples_and_options)
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\func_get_args());
}
- public function geodist($key, $src, $dst, $unit = null): \Relay\Relay|false|float
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args());
- }
-
public function geohash($key, $member, ...$other_members): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\func_get_args());
@@ -422,11 +426,6 @@ public function georadius_ro($key, $lng, $lat, $radius, $unit, $options = []): m
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\func_get_args());
}
- public function geosearch($key, $position, $shape, $unit, $options = []): \Relay\Relay|array
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\func_get_args());
- }
-
public function geosearchstore($dst, $src, $position, $shape, $unit, $options = []): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearchstore(...\func_get_args());
@@ -442,11 +441,6 @@ public function getset($key, $value): mixed
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\func_get_args());
}
- public function getrange($key, $start, $end): \Relay\Relay|false|string
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\func_get_args());
- }
-
public function setrange($key, $start, $value): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setrange(...\func_get_args());
@@ -527,11 +521,6 @@ public function pfadd($key, $elements): \Relay\Relay|false|int
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\func_get_args());
}
- public function pfcount($key): \Relay\Relay|false|int
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args());
- }
-
public function pfmerge($dst, $srckeys): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\func_get_args());
@@ -642,16 +631,6 @@ public function type($key): \Relay\Relay|bool|int|string
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\func_get_args());
}
- public function lmove($srckey, $dstkey, $srcpos, $dstpos): \Relay\Relay|false|null|string
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmove(...\func_get_args());
- }
-
- public function blmove($srckey, $dstkey, $srcpos, $dstpos, $timeout): \Relay\Relay|false|null|string
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\func_get_args());
- }
-
public function lrange($key, $start, $stop): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\func_get_args());
@@ -807,11 +786,6 @@ public function hmget($hash, $members): \Relay\Relay|array|false
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmget(...\func_get_args());
}
- public function hrandfield($hash, $options = null): \Relay\Relay|array|false|string
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hrandfield(...\func_get_args());
- }
-
public function hmset($hash, $members): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmset(...\func_get_args());
@@ -827,11 +801,6 @@ public function hsetnx($hash, $member, $value): \Relay\Relay|bool
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hsetnx(...\func_get_args());
}
- public function hset($key, $mem, $val, ...$kvals): \Relay\Relay|false|int
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\func_get_args());
- }
-
public function hdel($key, $mem, ...$mems): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hdel(...\func_get_args());
@@ -1097,11 +1066,6 @@ public function xack($key, $group, $ids): \Relay\Relay|false|int
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\func_get_args());
}
- public function xadd($key, $id, $values, $maxlen = 0, $approx = false, $nomkstream = false): \Relay\Relay|false|string
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args());
- }
-
public function xclaim($key, $group, $consumer, $min_idle, $ids, $options): \Relay\Relay|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\func_get_args());
@@ -1207,16 +1171,6 @@ public function zrevrangebylex($key, $max, $min, $offset = -1, $count = -1): \Re
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebylex(...\func_get_args());
}
- public function zrank($key, $rank, $withscore = false): \Relay\Relay|array|false|int
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\func_get_args());
- }
-
- public function zrevrank($key, $rank, $withscore = false): \Relay\Relay|array|false|int
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\func_get_args());
- }
-
public function zrem($key, ...$args): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrem(...\func_get_args());
@@ -1272,11 +1226,6 @@ public function zmscore($key, ...$mems): \Relay\Relay|array|false
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmscore(...\func_get_args());
}
- public function zscore($key, $member): \Relay\Relay|false|float
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\func_get_args());
- }
-
public function zinter($keys, $weights = null, $options = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinter(...\func_get_args());
diff --git a/vendor/symfony/cache/Traits/RelayProxyTrait.php b/vendor/symfony/cache/Traits/RelayProxyTrait.php
index a1d252b96..c35b5fa01 100644
--- a/vendor/symfony/cache/Traits/RelayProxyTrait.php
+++ b/vendor/symfony/cache/Traits/RelayProxyTrait.php
@@ -17,11 +17,6 @@
*/
trait RelayProxyTrait
{
- public function copy($src, $dst, $options = null): \Relay\Relay|bool
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\func_get_args());
- }
-
public function jsonArrAppend($key, $value_or_array, $path = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonArrAppend(...\func_get_args());
@@ -148,9 +143,5 @@ public function jsonType($key, $path = null): \Relay\Relay|array|false
*/
trait RelayProxyTrait
{
- public function copy($src, $dst, $options = null): \Relay\Relay|false|int
- {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\func_get_args());
- }
}
}
diff --git a/vendor/symfony/contracts/HttpClient/HttpClientInterface.php b/vendor/symfony/contracts/HttpClient/HttpClientInterface.php
index 4bb1dd376..a7c873721 100644
--- a/vendor/symfony/contracts/HttpClient/HttpClientInterface.php
+++ b/vendor/symfony/contracts/HttpClient/HttpClientInterface.php
@@ -46,9 +46,9 @@ interface HttpClientInterface
'buffer' => true, // bool|resource|\Closure - whether the content of the response should be buffered or not,
// or a stream resource where the response body should be written,
// or a closure telling if/where the response should be buffered based on its headers
- 'on_progress' => null, // callable(int $dlNow, int $dlSize, array $info) - throwing any exceptions MUST abort
- // the request; it MUST be called on DNS resolution, on arrival of headers and on
- // completion; it SHOULD be called on upload/download of data and at least 1/s
+ 'on_progress' => null, // callable(int $dlNow, int $dlSize, array $info) - throwing any exceptions MUST abort the
+ // request; it MUST be called on connection, on headers and on completion; it SHOULD be
+ // called on upload/download of data and at least 1/s
'resolve' => [], // string[] - a map of host to IP address that SHOULD replace DNS resolution
'proxy' => null, // string - by default, the proxy-related env vars handled by curl SHOULD be honored
'no_proxy' => null, // string - a comma separated list of hosts that do not require a proxy to be reached
diff --git a/vendor/symfony/contracts/HttpClient/Test/Fixtures/web/index.php b/vendor/symfony/contracts/HttpClient/Test/Fixtures/web/index.php
index 8e28bf532..59033d55a 100644
--- a/vendor/symfony/contracts/HttpClient/Test/Fixtures/web/index.php
+++ b/vendor/symfony/contracts/HttpClient/Test/Fixtures/web/index.php
@@ -12,30 +12,37 @@
$_POST['content-type'] = $_SERVER['HTTP_CONTENT_TYPE'] ?? '?';
}
+$headers = [
+ 'SERVER_PROTOCOL',
+ 'SERVER_NAME',
+ 'REQUEST_URI',
+ 'REQUEST_METHOD',
+ 'PHP_AUTH_USER',
+ 'PHP_AUTH_PW',
+ 'REMOTE_ADDR',
+ 'REMOTE_PORT',
+];
+
+foreach ($headers as $k) {
+ if (isset($_SERVER[$k])) {
+ $vars[$k] = $_SERVER[$k];
+ }
+}
+
foreach ($_SERVER as $k => $v) {
- switch ($k) {
- default:
- if (!str_starts_with($k, 'HTTP_')) {
- continue 2;
- }
- // no break
- case 'SERVER_NAME':
- case 'SERVER_PROTOCOL':
- case 'REQUEST_URI':
- case 'REQUEST_METHOD':
- case 'PHP_AUTH_USER':
- case 'PHP_AUTH_PW':
- $vars[$k] = $v;
+ if (str_starts_with($k, 'HTTP_')) {
+ $vars[$k] = $v;
}
}
$json = json_encode($vars, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE);
-switch ($vars['REQUEST_URI']) {
+switch (parse_url($vars['REQUEST_URI'], \PHP_URL_PATH)) {
default:
exit;
case '/head':
+ header('X-Request-Vars: '.json_encode($vars, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE));
header('Content-Length: '.strlen($json), true);
break;
@@ -94,7 +101,8 @@
case '/302':
if (!isset($vars['HTTP_AUTHORIZATION'])) {
- header('Location: http://localhost:8057/', true, 302);
+ $location = $_GET['location'] ?? 'http://localhost:8057/';
+ header('Location: '.$location, true, 302);
}
break;
diff --git a/vendor/symfony/contracts/HttpClient/Test/HttpClientTestCase.php b/vendor/symfony/contracts/HttpClient/Test/HttpClientTestCase.php
index ec87d06d1..b150f0ce7 100644
--- a/vendor/symfony/contracts/HttpClient/Test/HttpClientTestCase.php
+++ b/vendor/symfony/contracts/HttpClient/Test/HttpClientTestCase.php
@@ -25,6 +25,10 @@ abstract class HttpClientTestCase extends TestCase
{
public static function setUpBeforeClass(): void
{
+ if (!function_exists('ob_gzhandler')) {
+ static::markTestSkipped('The "ob_gzhandler" function is not available.');
+ }
+
TestHttpServer::start();
}
@@ -730,6 +734,18 @@ public function testIdnResolve()
$this->assertSame(200, $response->getStatusCode());
}
+ public function testIPv6Resolve()
+ {
+ TestHttpServer::start(-8087);
+
+ $client = $this->getHttpClient(__FUNCTION__);
+ $response = $client->request('GET', 'http://symfony.com:8087/', [
+ 'resolve' => ['symfony.com' => '::1'],
+ ]);
+
+ $this->assertSame(200, $response->getStatusCode());
+ }
+
public function testNotATimeout()
{
$client = $this->getHttpClient(__FUNCTION__);
@@ -1144,4 +1160,33 @@ public function testWithOptions()
$response = $client2->request('GET', '/');
$this->assertSame(200, $response->getStatusCode());
}
+
+ public function testBindToPort()
+ {
+ $client = $this->getHttpClient(__FUNCTION__);
+ $response = $client->request('GET', 'http://localhost:8057', ['bindto' => '127.0.0.1:9876']);
+ $response->getStatusCode();
+
+ $vars = $response->toArray();
+
+ self::assertSame('127.0.0.1', $vars['REMOTE_ADDR']);
+ self::assertSame('9876', $vars['REMOTE_PORT']);
+ }
+
+ public function testBindToPortV6()
+ {
+ TestHttpServer::start(-8087);
+
+ $client = $this->getHttpClient(__FUNCTION__);
+ $response = $client->request('GET', 'http://[::1]:8087', ['bindto' => '[::1]:9876']);
+ $response->getStatusCode();
+
+ $vars = $response->toArray();
+
+ self::assertSame('::1', $vars['REMOTE_ADDR']);
+
+ if ('\\' !== \DIRECTORY_SEPARATOR) {
+ self::assertSame('9876', $vars['REMOTE_PORT']);
+ }
+ }
}
diff --git a/vendor/symfony/contracts/HttpClient/Test/TestHttpServer.php b/vendor/symfony/contracts/HttpClient/Test/TestHttpServer.php
index 2a278479c..ec4705049 100644
--- a/vendor/symfony/contracts/HttpClient/Test/TestHttpServer.php
+++ b/vendor/symfony/contracts/HttpClient/Test/TestHttpServer.php
@@ -21,10 +21,17 @@ class TestHttpServer
/**
* @param string|null $workingDirectory
*/
- public static function start(int $port = 8057/* , string $workingDirectory = null */): Process
+ public static function start(int $port = 8057/* , ?string $workingDirectory = null */): Process
{
$workingDirectory = \func_get_args()[1] ?? __DIR__.'/Fixtures/web';
+ if (0 > $port) {
+ $port = -$port;
+ $ip = '[::1]';
+ } else {
+ $ip = '127.0.0.1';
+ }
+
if (isset(self::$process[$port])) {
self::$process[$port]->stop();
} else {
@@ -34,14 +41,14 @@ public static function start(int $port = 8057/* , string $workingDirectory = nul
}
$finder = new PhpExecutableFinder();
- $process = new Process(array_merge([$finder->find(false)], $finder->findArguments(), ['-dopcache.enable=0', '-dvariables_order=EGPCS', '-S', '127.0.0.1:'.$port]));
+ $process = new Process(array_merge([$finder->find(false)], $finder->findArguments(), ['-dopcache.enable=0', '-dvariables_order=EGPCS', '-S', $ip.':'.$port]));
$process->setWorkingDirectory($workingDirectory);
$process->start();
self::$process[$port] = $process;
do {
usleep(50000);
- } while (!@fopen('http://127.0.0.1:'.$port, 'r'));
+ } while (!@fopen('http://'.$ip.':'.$port, 'r'));
return $process;
}
diff --git a/vendor/symfony/contracts/Tests/Cache/CacheTraitTest.php b/vendor/symfony/contracts/Tests/Cache/CacheTraitTest.php
new file mode 100644
index 000000000..baf6ef4a4
--- /dev/null
+++ b/vendor/symfony/contracts/Tests/Cache/CacheTraitTest.php
@@ -0,0 +1,165 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Tests\Cache;
+
+use PHPUnit\Framework\TestCase;
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Contracts\Cache\CacheTrait;
+
+/**
+ * @author Tobias Nyholm
+ */
+class CacheTraitTest extends TestCase
+{
+ public function testSave()
+ {
+ $item = $this->createMock(CacheItemInterface::class);
+ $item->method('set')
+ ->willReturn($item);
+ $item->method('isHit')
+ ->willReturn(false);
+
+ $item->expects($this->once())
+ ->method('set')
+ ->with('computed data');
+
+ $cache = $this->getMockBuilder(TestPool::class)
+ ->onlyMethods(['getItem', 'save'])
+ ->getMock();
+ $cache->expects($this->once())
+ ->method('getItem')
+ ->with('key')
+ ->willReturn($item);
+ $cache->expects($this->once())
+ ->method('save');
+
+ $callback = function (CacheItemInterface $item) {
+ return 'computed data';
+ };
+
+ $cache->get('key', $callback);
+ }
+
+ public function testNoCallbackCallOnHit()
+ {
+ $item = $this->createMock(CacheItemInterface::class);
+ $item->method('isHit')
+ ->willReturn(true);
+
+ $item->expects($this->never())
+ ->method('set');
+
+ $cache = $this->getMockBuilder(TestPool::class)
+ ->onlyMethods(['getItem', 'save'])
+ ->getMock();
+
+ $cache->expects($this->once())
+ ->method('getItem')
+ ->with('key')
+ ->willReturn($item);
+ $cache->expects($this->never())
+ ->method('save');
+
+ $callback = function (CacheItemInterface $item) {
+ $this->assertTrue(false, 'This code should never be reached');
+ };
+
+ $cache->get('key', $callback);
+ }
+
+ public function testRecomputeOnBetaInf()
+ {
+ $item = $this->createMock(CacheItemInterface::class);
+ $item->method('set')
+ ->willReturn($item);
+ $item->method('isHit')
+ // We want to recompute even if it is a hit
+ ->willReturn(true);
+
+ $item->expects($this->once())
+ ->method('set')
+ ->with('computed data');
+
+ $cache = $this->getMockBuilder(TestPool::class)
+ ->onlyMethods(['getItem', 'save'])
+ ->getMock();
+
+ $cache->expects($this->once())
+ ->method('getItem')
+ ->with('key')
+ ->willReturn($item);
+ $cache->expects($this->once())
+ ->method('save');
+
+ $callback = function (CacheItemInterface $item) {
+ return 'computed data';
+ };
+
+ $cache->get('key', $callback, \INF);
+ }
+
+ public function testExceptionOnNegativeBeta()
+ {
+ $cache = $this->getMockBuilder(TestPool::class)
+ ->onlyMethods(['getItem', 'save'])
+ ->getMock();
+
+ $callback = function (CacheItemInterface $item) {
+ return 'computed data';
+ };
+
+ $this->expectException(\InvalidArgumentException::class);
+ $cache->get('key', $callback, -2);
+ }
+}
+
+class TestPool implements CacheItemPoolInterface
+{
+ use CacheTrait;
+
+ public function hasItem($key): bool
+ {
+ }
+
+ public function deleteItem($key): bool
+ {
+ }
+
+ public function deleteItems(array $keys = []): bool
+ {
+ }
+
+ public function getItem($key): CacheItemInterface
+ {
+ }
+
+ public function getItems(array $key = []): iterable
+ {
+ }
+
+ public function saveDeferred(CacheItemInterface $item): bool
+ {
+ }
+
+ public function save(CacheItemInterface $item): bool
+ {
+ }
+
+ public function commit(): bool
+ {
+ }
+
+ public function clear(): bool
+ {
+ }
+}
diff --git a/vendor/symfony/contracts/Tests/Service/LegacyTestService.php b/vendor/symfony/contracts/Tests/Service/LegacyTestService.php
new file mode 100644
index 000000000..0e781a41a
--- /dev/null
+++ b/vendor/symfony/contracts/Tests/Service/LegacyTestService.php
@@ -0,0 +1,95 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Tests\Service;
+
+use Psr\Container\ContainerInterface;
+use Symfony\Contracts\Service\Attribute\Required;
+use Symfony\Contracts\Service\Attribute\SubscribedService;
+use Symfony\Contracts\Service\ServiceSubscriberInterface;
+use Symfony\Contracts\Service\ServiceSubscriberTrait;
+
+class LegacyParentTestService
+{
+ public function aParentService(): Service1
+ {
+ }
+
+ public function setContainer(ContainerInterface $container): ?ContainerInterface
+ {
+ return $container;
+ }
+}
+
+class LegacyTestService extends LegacyParentTestService implements ServiceSubscriberInterface
+{
+ use ServiceSubscriberTrait;
+
+ protected $container;
+
+ #[SubscribedService]
+ public function aService(): Service2
+ {
+ return $this->container->get(__METHOD__);
+ }
+
+ #[SubscribedService]
+ public function nullableService(): ?Service2
+ {
+ return $this->container->get(__METHOD__);
+ }
+
+ #[SubscribedService(attributes: new Required())]
+ public function withAttribute(): ?Service2
+ {
+ return $this->container->get(__METHOD__);
+ }
+}
+
+class LegacyChildTestService extends LegacyTestService
+{
+ #[SubscribedService()]
+ public function aChildService(): LegacyService3
+ {
+ return $this->container->get(__METHOD__);
+ }
+}
+
+class LegacyParentWithMagicCall
+{
+ public function __call($method, $args)
+ {
+ throw new \BadMethodCallException('Should not be called.');
+ }
+
+ public static function __callStatic($method, $args)
+ {
+ throw new \BadMethodCallException('Should not be called.');
+ }
+}
+
+class LegacyService3
+{
+}
+
+class LegacyParentTestService2
+{
+ /** @var ContainerInterface */
+ protected $container;
+
+ public function setContainer(ContainerInterface $container)
+ {
+ $previous = $this->container ?? null;
+ $this->container = $container;
+
+ return $previous;
+ }
+}
diff --git a/vendor/symfony/contracts/Tests/Service/ServiceMethodsSubscriberTraitTest.php b/vendor/symfony/contracts/Tests/Service/ServiceMethodsSubscriberTraitTest.php
new file mode 100644
index 000000000..396ca7f5a
--- /dev/null
+++ b/vendor/symfony/contracts/Tests/Service/ServiceMethodsSubscriberTraitTest.php
@@ -0,0 +1,170 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Tests\Service;
+
+use PHPUnit\Framework\TestCase;
+use Psr\Container\ContainerInterface;
+use Symfony\Contracts\Service\Attribute\Required;
+use Symfony\Contracts\Service\Attribute\SubscribedService;
+use Symfony\Contracts\Service\ServiceLocatorTrait;
+use Symfony\Contracts\Service\ServiceMethodsSubscriberTrait;
+use Symfony\Contracts\Service\ServiceSubscriberInterface;
+
+class ServiceMethodsSubscriberTraitTest extends TestCase
+{
+ public function testMethodsOnParentsAndChildrenAreIgnoredInGetSubscribedServices()
+ {
+ $expected = [
+ TestService::class.'::aService' => Service2::class,
+ TestService::class.'::nullableService' => '?'.Service2::class,
+ new SubscribedService(TestService::class.'::withAttribute', Service2::class, true, new Required()),
+ ];
+
+ $this->assertEquals($expected, ChildTestService::getSubscribedServices());
+ }
+
+ public function testSetContainerIsCalledOnParent()
+ {
+ $container = new class([]) implements ContainerInterface {
+ use ServiceLocatorTrait;
+ };
+
+ $this->assertSame($container, (new TestService())->setContainer($container));
+ }
+
+ public function testParentNotCalledIfHasMagicCall()
+ {
+ $container = new class([]) implements ContainerInterface {
+ use ServiceLocatorTrait;
+ };
+ $service = new class() extends ParentWithMagicCall {
+ use ServiceMethodsSubscriberTrait;
+ };
+
+ $this->assertNull($service->setContainer($container));
+ $this->assertSame([], $service::getSubscribedServices());
+ }
+
+ public function testParentNotCalledIfNoParent()
+ {
+ $container = new class([]) implements ContainerInterface {
+ use ServiceLocatorTrait;
+ };
+ $service = new class() {
+ use ServiceMethodsSubscriberTrait;
+ };
+
+ $this->assertNull($service->setContainer($container));
+ $this->assertSame([], $service::getSubscribedServices());
+ }
+
+ public function testSetContainerCalledFirstOnParent()
+ {
+ $container1 = new class([]) implements ContainerInterface {
+ use ServiceLocatorTrait;
+ };
+ $container2 = clone $container1;
+
+ $testService = new TestService2();
+ $this->assertNull($testService->setContainer($container1));
+ $this->assertSame($container1, $testService->setContainer($container2));
+ }
+}
+
+class ParentTestService
+{
+ public function aParentService(): Service1
+ {
+ }
+
+ public function setContainer(ContainerInterface $container): ?ContainerInterface
+ {
+ return $container;
+ }
+}
+
+class TestService extends ParentTestService implements ServiceSubscriberInterface
+{
+ use ServiceMethodsSubscriberTrait;
+
+ protected ContainerInterface $container;
+
+ #[SubscribedService]
+ public function aService(): Service2
+ {
+ return $this->container->get(__METHOD__);
+ }
+
+ #[SubscribedService]
+ public function nullableService(): ?Service2
+ {
+ return $this->container->get(__METHOD__);
+ }
+
+ #[SubscribedService(attributes: new Required())]
+ public function withAttribute(): ?Service2
+ {
+ return $this->container->get(__METHOD__);
+ }
+}
+
+class ChildTestService extends TestService
+{
+ #[SubscribedService]
+ public function aChildService(): Service3
+ {
+ return $this->container->get(__METHOD__);
+ }
+}
+
+class ParentWithMagicCall
+{
+ public function __call($method, $args)
+ {
+ throw new \BadMethodCallException('Should not be called.');
+ }
+
+ public static function __callStatic($method, $args)
+ {
+ throw new \BadMethodCallException('Should not be called.');
+ }
+}
+
+class Service1
+{
+}
+
+class Service2
+{
+}
+
+class Service3
+{
+}
+
+class ParentTestService2
+{
+ protected ContainerInterface $container;
+
+ public function setContainer(ContainerInterface $container)
+ {
+ $previous = $this->container ?? null;
+ $this->container = $container;
+
+ return $previous;
+ }
+}
+
+class TestService2 extends ParentTestService2 implements ServiceSubscriberInterface
+{
+ use ServiceMethodsSubscriberTrait;
+}
diff --git a/vendor/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php b/vendor/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php
new file mode 100644
index 000000000..0d714a94a
--- /dev/null
+++ b/vendor/symfony/contracts/Tests/Service/ServiceSubscriberTraitTest.php
@@ -0,0 +1,95 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Contracts\Tests\Service;
+
+use PHPUnit\Framework\TestCase;
+use Psr\Container\ContainerInterface;
+use Symfony\Contracts\Service\Attribute\Required;
+use Symfony\Contracts\Service\Attribute\SubscribedService;
+use Symfony\Contracts\Service\ServiceLocatorTrait;
+use Symfony\Contracts\Service\ServiceSubscriberInterface;
+use Symfony\Contracts\Service\ServiceSubscriberTrait;
+
+/**
+ * @group legacy
+ */
+class ServiceSubscriberTraitTest extends TestCase
+{
+ public static function setUpBeforeClass(): void
+ {
+ class_exists(LegacyTestService::class);
+ }
+
+ public function testMethodsOnParentsAndChildrenAreIgnoredInGetSubscribedServices()
+ {
+ $expected = [
+ LegacyTestService::class.'::aService' => Service2::class,
+ LegacyTestService::class.'::nullableService' => '?'.Service2::class,
+ new SubscribedService(LegacyTestService::class.'::withAttribute', Service2::class, true, new Required()),
+ ];
+
+ $this->assertEquals($expected, LegacyChildTestService::getSubscribedServices());
+ }
+
+ public function testSetContainerIsCalledOnParent()
+ {
+ $container = new class([]) implements ContainerInterface {
+ use ServiceLocatorTrait;
+ };
+
+ $this->assertSame($container, (new LegacyTestService())->setContainer($container));
+ }
+
+ public function testParentNotCalledIfHasMagicCall()
+ {
+ $container = new class([]) implements ContainerInterface {
+ use ServiceLocatorTrait;
+ };
+ $service = new class() extends ParentWithMagicCall {
+ use ServiceSubscriberTrait;
+
+ private $container;
+ };
+
+ $this->assertNull($service->setContainer($container));
+ $this->assertSame([], $service::getSubscribedServices());
+ }
+
+ public function testParentNotCalledIfNoParent()
+ {
+ $container = new class([]) implements ContainerInterface {
+ use ServiceLocatorTrait;
+ };
+ $service = new class() {
+ use ServiceSubscriberTrait;
+
+ private $container;
+ };
+
+ $this->assertNull($service->setContainer($container));
+ $this->assertSame([], $service::getSubscribedServices());
+ }
+
+ public function testSetContainerCalledFirstOnParent()
+ {
+ $container1 = new class([]) implements ContainerInterface {
+ use ServiceLocatorTrait;
+ };
+ $container2 = clone $container1;
+
+ $testService = new class() extends LegacyParentTestService2 implements ServiceSubscriberInterface {
+ use ServiceSubscriberTrait;
+ };
+ $this->assertNull($testService->setContainer($container1));
+ $this->assertSame($container1, $testService->setContainer($container2));
+ }
+}
diff --git a/vendor/symfony/contracts/phpunit.xml.dist b/vendor/symfony/contracts/phpunit.xml.dist
new file mode 100644
index 000000000..947db86d2
--- /dev/null
+++ b/vendor/symfony/contracts/phpunit.xml.dist
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+ ./Tests/
+ ./Service/Test/
+ ./Translation/Test/
+
+
+
+
+
+ ./
+
+
+ ./Tests
+ ./Service/Test/
+ ./Translation/Test/
+ ./vendor
+
+
+
+
diff --git a/vendor/symfony/dom-crawler/UriResolver.php b/vendor/symfony/dom-crawler/UriResolver.php
index d42c2eb55..398cb7bc3 100644
--- a/vendor/symfony/dom-crawler/UriResolver.php
+++ b/vendor/symfony/dom-crawler/UriResolver.php
@@ -32,12 +32,8 @@ public static function resolve(string $uri, ?string $baseUri): string
{
$uri = trim($uri);
- if (false === ($scheme = parse_url($uri, \PHP_URL_SCHEME)) && '/' === ($uri[0] ?? '')) {
- $scheme = parse_url($uri.'#', \PHP_URL_SCHEME);
- }
-
// absolute URL?
- if (null !== $scheme) {
+ if (null !== parse_url(\strlen($uri) !== strcspn($uri, '?#') ? $uri : $uri.'#', \PHP_URL_SCHEME)) {
return $uri;
}
diff --git a/vendor/symfony/http-foundation/Request.php b/vendor/symfony/http-foundation/Request.php
index c45170e3f..922014133 100644
--- a/vendor/symfony/http-foundation/Request.php
+++ b/vendor/symfony/http-foundation/Request.php
@@ -351,13 +351,7 @@ public static function create(string $uri, string $method = 'GET', array $parame
$server['PATH_INFO'] = '';
$server['REQUEST_METHOD'] = strtoupper($method);
- if (false === ($components = parse_url($uri)) && '/' === ($uri[0] ?? '')) {
- trigger_deprecation('symfony/http-foundation', '6.3', 'Calling "%s()" with an invalid URI is deprecated.', __METHOD__);
- $components = parse_url($uri.'#');
- unset($components['fragment']);
- }
-
- if (false === $components) {
+ if (false === $components = parse_url(\strlen($uri) !== strcspn($uri, '?#') ? $uri : $uri.'#')) {
throw new BadRequestException('Invalid URI.');
}
diff --git a/vendor/teampassclasses/emailservice/composer.json b/vendor/teampassclasses/emailservice/composer.json
index 5ac0084c9..6f506600b 100755
--- a/vendor/teampassclasses/emailservice/composer.json
+++ b/vendor/teampassclasses/emailservice/composer.json
@@ -12,8 +12,7 @@
}
],
"require": {
- "php": "^8.1",
- "teampassclasses/emailservice": "*"
+ "php": "^8.1"
},
"autoload": {
"psr-4": {
diff --git a/vendor/teampassclasses/emailservice/src/EmailService.php b/vendor/teampassclasses/emailservice/src/EmailService.php
index 83a0fb305..7a8b6072d 100644
--- a/vendor/teampassclasses/emailservice/src/EmailService.php
+++ b/vendor/teampassclasses/emailservice/src/EmailService.php
@@ -32,6 +32,35 @@
use PHPMailer\PHPMailer\Exception;
use voku\helper\AntiXSS;
+class EmailSettings
+{
+ public $smtpServer;
+ public $smtpAuth;
+ public $authUsername;
+ public $authPassword;
+ public $port;
+ public $security;
+ public $from;
+ public $fromName;
+ public $debugLevel;
+ public $dir;
+
+ // Constructeur pour initialiser les paramètres
+ public function __construct(array $SETTINGS)
+ {
+ $this->smtpServer = $SETTINGS['email_smtp_server'];
+ $this->smtpAuth = (int) $SETTINGS['email_smtp_auth'] === 1;
+ $this->authUsername = $SETTINGS['email_auth_username'];
+ $this->authPassword = $SETTINGS['email_auth_pwd'];
+ $this->port = (int) $SETTINGS['email_port'];
+ $this->security = $SETTINGS['email_security'];
+ $this->from = $SETTINGS['email_from'];
+ $this->fromName = $SETTINGS['email_from_name'];
+ $this->debugLevel = $SETTINGS['email_debug_level'];
+ $this->dir = $SETTINGS['cpassman_dir'];
+ }
+}
+
class EmailService
{
protected $mailer;
@@ -80,15 +109,11 @@ public function addRecipients($email)
// Fonction pour nettoyer le contenu de l'email et prévenir les attaques XSS
public function sanitizeEmailBody($textMail)
{
- // Nettoyage Anti-XSS pour garantir que $textMail est sécurisé avant utilisation
$textMailClean = $this->antiXSS->xss_clean($textMail);
-
- // Si un XSS potentiel est détecté, on échappe les caractères spéciaux pour se protéger
if ($this->antiXSS->isXssFound()) {
return htmlspecialchars($textMailClean, ENT_QUOTES, 'UTF-8');
}
- // Si aucun XSS n'est trouvé, retourner le texte original
return $textMail;
}
diff --git a/vendor/teampassclasses/ldapextra/src/ActiveDirectoryExtra.php b/vendor/teampassclasses/ldapextra/src/ActiveDirectoryExtra.php
index 27a5e08a8..8107256f0 100755
--- a/vendor/teampassclasses/ldapextra/src/ActiveDirectoryExtra.php
+++ b/vendor/teampassclasses/ldapextra/src/ActiveDirectoryExtra.php
@@ -32,7 +32,7 @@
use LdapRecord\Models\ActiveDirectory\Group as BaseGroup ;
use LdapRecord\Connection;
use LdapRecord\Container;
-use LdapRecord\Models\ActiveDirectory\User;
+use LdapRecord\Models\OpenLDAP\User;
class ActiveDirectoryExtra extends BaseGroup
{
@@ -62,7 +62,7 @@ public function getADGroups(Connection $connection, array $settings): array
$groupsArr = [];
foreach($groups as $key => $group) {
- $adGroupId = md5($group[(isset($settings['ldap_guid_attibute']) === true && empty($settings['ldap_guid_attibute']) === false ? $settings['ldap_guid_attibute'] : 'gidnumber')][0]);
+ $adGroupId = (int) $group[(isset($settings['ldap_guid_attibute']) === true && empty($settings['ldap_guid_attibute']) === false ? $settings['ldap_guid_attibute'] : 'gidnumber')][0];
$groupsArr[$adGroupId] = [
'ad_group_id' => $adGroupId,
'ad_group_title' => $group['cn'][0],
@@ -107,7 +107,7 @@ function getUserADGroups(string $userDN, Connection $connection, array $SETTINGS
foreach ($groups as $group) {
array_push(
$groupsArr,
- md5($group[$idAttribute][0])
+ $group[$idAttribute][0]
);
}
} catch (\LdapRecord\Auth\BindException $e) {
@@ -140,4 +140,4 @@ function userIsEnabled(string $userDN, Connection $connection): bool
}
return $isEnabled;
}
-}
+}
\ No newline at end of file
diff --git a/vendor/teampassclasses/nestedtree/src/NestedTree.php b/vendor/teampassclasses/nestedtree/src/NestedTree.php
index de06291e1..04b8be83d 100755
--- a/vendor/teampassclasses/nestedtree/src/NestedTree.php
+++ b/vendor/teampassclasses/nestedtree/src/NestedTree.php
@@ -196,15 +196,16 @@ public function getDescendants($folder_id = 0, $includeSelf = false, $childrenOn
* Gives the same results as $this->getDescendants(10, true, false, true);
* Without any sql call (useful in loops on very big teampass instances).
*
- * @param int $treeAray $this->getDescendants() array
- * @param bool $parentId ID of the parent node.
+ * @param array $treeArray The tree array
+ * @param int $parentId ID of the parent node.
+ * @param bool $parentId ID of the parent node.
*
* @return array The children of the passed node
*/
- public function getDescendantsFromTreeArray(&$treeAray, $parentId, $firstIteration = true) {
+ public function getDescendantsFromTreeArray(array &$treeArray, int $parentId, bool $firstIteration = true) {
$descendants = $firstIteration ? [$parentId] : [];
- foreach ($treeAray as $key => $object) {
+ foreach ($treeArray as $key => $object) {
// If the object's parent_id matches parentId, it is added to the list of descendants
if ($object->parent_id == $parentId) {
// Ajouter l'id du descendant
@@ -212,7 +213,7 @@ public function getDescendantsFromTreeArray(&$treeAray, $parentId, $firstIterati
// If nb_subfolders > 0, recursive call to find the descendants of this element
if ($object->nb_subfolders > 0) {
- $descendants = array_merge($descendants, $this->getDescendantsFromTreeArray($treeAray, $object->id, false));
+ $descendants = array_merge($descendants, $this->getDescendantsFromTreeArray($treeArray, $object->id, false));
}
}
}
diff --git a/vendor/teampassclasses/passwordmanager/src/PasswordManager.php b/vendor/teampassclasses/passwordmanager/src/PasswordManager.php
index a27fde8e7..9148293a4 100644
--- a/vendor/teampassclasses/passwordmanager/src/PasswordManager.php
+++ b/vendor/teampassclasses/passwordmanager/src/PasswordManager.php
@@ -59,10 +59,10 @@ public function verifyPassword(string $hashedPassword, string $plainPassword): b
// --- Handle migration from PasswordLib to Symfony PasswordHasher
public function migratePassword(string $hashedPassword, string $plainPassword, int $userId): string
{
- // Check if the password is correct
- if ($this->verifyPassword($hashedPassword, $plainPassword) === true) {
- // Check if password has been hashed with passwordlib
- if ($this->isPasswordLibHash($hashedPassword)) {
+ // Vérifiez si le mot de passe a été haché avec passwordlib
+ if ($this->isPasswordLibHash($hashedPassword)) {
+ // Utilisez la vérification de passwordlib ici
+ if ($this->passwordLibVerify($hashedPassword, html_entity_decode($plainPassword))) {
// Password is valid, hash it with new system
$newHashedPassword = $this->hashPassword($plainPassword);
$userInfo['pw'] = $newHashedPassword;
@@ -73,10 +73,13 @@ public function migratePassword(string $hashedPassword, string $plainPassword, i
if (WIP === true) error_log("migratePassword performed for user ".$userId." | Old hash: ".$hashedPassword." | New hash: ".$newHashedPassword);
// Return new hashed password
return $newHashedPassword;
+ } else {
+ //throw new \Exception("Password is not correct");
+ return false;
}
}
- // Return hashed password
+ // Le mot de passe a déjà été haché avec le nouveau système
return $hashedPassword;
}
@@ -86,7 +89,7 @@ private function isPasswordLibHash(string $hashedPassword): bool
return strpos($hashedPassword, '$2y$10$') === 0;
}
- // Vérification du hash et mdp passwordlib
+ // Vous devrez implémenter cette fonction pour utiliser la vérification de passwordlib
private function passwordLibVerify(string $hashedPassword, string $plainPassword): bool
{
// Vérification avec passwordlib
diff --git a/vendor/teampassclasses/performchecks/src/PerformChecks.php b/vendor/teampassclasses/performchecks/src/PerformChecks.php
index 42a3b3e90..cd2393d52 100755
--- a/vendor/teampassclasses/performchecks/src/PerformChecks.php
+++ b/vendor/teampassclasses/performchecks/src/PerformChecks.php
@@ -125,7 +125,7 @@ public function initialLogin(): bool
'SELECT id FROM ' . prefixTable('users') . ' WHERE login = %s',
$this->sessionVar['login']
);
- if (DB::count() > 0 || isset($this->sessionVar['oauth2']) === true) {
+ if (DB::count() > 0 || isset($this->sessionVar['sso']) === true) {
return true;
}
}
@@ -154,7 +154,7 @@ function userAccessPage($pageVisited): bool
// Definition
$pagesRights = array(
'user' => array(
- 'home', 'items', 'search', 'kb', 'favourites', 'suggestion', 'profile', 'import', 'export', 'offline',
+ 'home', 'items', 'search', 'kb', 'favourites', 'suggestion', 'profile', 'import', 'export', 'folders', 'offline',
),
'manager' => array(
'home', 'items', 'search', 'kb', 'favourites', 'suggestion', 'folders', 'roles', 'utilities', 'users', 'profile',
diff --git a/vendor/teampassclasses/sessionmanager/src/EncryptedSessionProxy.php b/vendor/teampassclasses/sessionmanager/src/EncryptedSessionProxy.php
index e4515627e..eb21a037e 100644
--- a/vendor/teampassclasses/sessionmanager/src/EncryptedSessionProxy.php
+++ b/vendor/teampassclasses/sessionmanager/src/EncryptedSessionProxy.php
@@ -62,7 +62,7 @@ public function read($id): string
{
$data = parent::read($id);
- if ($data !== '' && preg_match('/^def/', $data)) {
+ if ($data !== '') {
return Crypto::decrypt($data, $this->key);
}
diff --git a/vendor/tecnickcom/tcpdf/CHANGELOG.TXT b/vendor/tecnickcom/tcpdf/CHANGELOG.TXT
index 8fb0afae5..a6485e3a3 100644
--- a/vendor/tecnickcom/tcpdf/CHANGELOG.TXT
+++ b/vendor/tecnickcom/tcpdf/CHANGELOG.TXT
@@ -1,3 +1,14 @@
+6.8.0 (2024-12-23)
+ - Requires PHP 7.1+ and curl extension.
+ - Escape error message.
+ - Use strict time-constant function to compare TCPDF-tag hashes.
+ - Add K_CURLOPTS config array to set custom cURL options (NOTE: some defaults have changed).
+ - Add some addTTFfont fixes from tc-lib-pdf-font.
+
+6.7.8 (2024-12-13)
+ - Improve SVG detection by checking for (mandatory) namespace.
+ - Use late state binding now that minimum PHP version is 5.5.
+
6.7.7 (2024-10-26)
- Update regular expression to avoid ReDoS (CVE-2024-22641)
- [PHP 8.4] Fix: Curl CURLOPT_BINARYTRANSFER deprecated #675
diff --git a/vendor/tecnickcom/tcpdf/VERSION b/vendor/tecnickcom/tcpdf/VERSION
index 38f118fae..e029aa99b 100644
--- a/vendor/tecnickcom/tcpdf/VERSION
+++ b/vendor/tecnickcom/tcpdf/VERSION
@@ -1 +1 @@
-6.7.7
+6.8.0
diff --git a/vendor/tecnickcom/tcpdf/composer.json b/vendor/tecnickcom/tcpdf/composer.json
index 666dac3fd..b0db28898 100644
--- a/vendor/tecnickcom/tcpdf/composer.json
+++ b/vendor/tecnickcom/tcpdf/composer.json
@@ -12,7 +12,7 @@
"barcodes"
],
"homepage": "http://www.tcpdf.org/",
- "version": "6.7.7",
+ "version": "6.8.0",
"license": "LGPL-3.0-or-later",
"authors": [
{
@@ -22,7 +22,8 @@
}
],
"require": {
- "php": ">=5.5.0"
+ "php": ">=7.1.0",
+ "ext-curl": "*"
},
"autoload": {
"classmap": [
diff --git a/vendor/tecnickcom/tcpdf/include/tcpdf_fonts.php b/vendor/tecnickcom/tcpdf/include/tcpdf_fonts.php
index a71c84b7e..4973b2855 100644
--- a/vendor/tecnickcom/tcpdf/include/tcpdf_fonts.php
+++ b/vendor/tecnickcom/tcpdf/include/tcpdf_fonts.php
@@ -1,13 +1,13 @@
0) {
+ if (preg_match_all('#dup[\s]([0-9]+)[\s]*+/([^\s]*+)[\s]put#sU', $font, $fmap, PREG_SET_ORDER) > 0) {
foreach ($fmap as $v) {
$imap[$v[2]] = $v[1];
}
@@ -229,22 +230,22 @@ public static function addTTFfont($fontfile, $fonttype='', $enc='', $flags=32, $
$eplain .= chr($chr ^ ($r >> 8));
$r = ((($chr + $r) * $c1 + $c2) % 65536);
}
- if (preg_match('#/ForceBold[\s]*([^\s]*)#', $eplain, $matches) > 0) {
+ if (preg_match('#/ForceBold[\s]*+([^\s]*+)#', $eplain, $matches) > 0) {
if ($matches[1] == 'true') {
$fmetric['Flags'] |= 0x40000;
}
}
- if (preg_match('#/StdVW[\s]*\[([^\]]*)#', $eplain, $matches) > 0) {
+ if (preg_match('#/StdVW[\s]*+\[([^\]]*+)#', $eplain, $matches) > 0) {
$fmetric['StemV'] = intval($matches[1]);
} else {
$fmetric['StemV'] = 70;
}
- if (preg_match('#/StdHW[\s]*\[([^\]]*)#', $eplain, $matches) > 0) {
+ if (preg_match('#/StdHW[\s]*+\[([^\]]*+)#', $eplain, $matches) > 0) {
$fmetric['StemH'] = intval($matches[1]);
} else {
$fmetric['StemH'] = 30;
}
- if (preg_match('#/BlueValues[\s]*\[([^\]]*)#', $eplain, $matches) > 0) {
+ if (preg_match('#/BlueValues[\s]*+\[([^\]]*+)#', $eplain, $matches) > 0) {
$bv = explode(' ', $matches[1]);
if (count($bv) >= 6) {
$v1 = intval($bv[2]);
@@ -265,7 +266,7 @@ public static function addTTFfont($fontfile, $fonttype='', $enc='', $flags=32, $
$fmetric['CapHeight'] = 700;
}
// get the number of random bytes at the beginning of charstrings
- if (preg_match('#/lenIV[\s]*([0-9]*)#', $eplain, $matches) > 0) {
+ if (preg_match('#/lenIV[\s]*+([\d]*+)#', $eplain, $matches) > 0) {
$lenIV = intval($matches[1]);
} else {
$lenIV = 4;
@@ -273,7 +274,7 @@ public static function addTTFfont($fontfile, $fonttype='', $enc='', $flags=32, $
$fmetric['Leading'] = 0;
// get charstring data
$eplain = substr($eplain, (strpos($eplain, '/CharStrings') + 1));
- preg_match_all('#/([A-Za-z0-9\.]*)[\s][0-9]+[\s]RD[\s](.*)[\s]ND#sU', $eplain, $matches, PREG_SET_ORDER);
+ preg_match_all('#/([A-Za-z0-9\.]*+)[\s][0-9]+[\s]RD[\s](.*)[\s]ND#sU', $eplain, $matches, PREG_SET_ORDER);
if (!empty($enc) AND isset(TCPDF_FONT_DATA::$encmap[$enc])) {
$enc_map = TCPDF_FONT_DATA::$encmap[$enc];
} else {
@@ -1780,9 +1781,9 @@ public static function arrUTF8ToUTF16BE($unicode, $setbom=false) {
*/
public static function UTF8ArrayToUniArray($ta, $isunicode=true) {
if ($isunicode) {
- return array_map(get_called_class().'::unichrUnicode', $ta);
+ return array_map(static::class.'::unichrUnicode', $ta);
}
- return array_map(get_called_class().'::unichrASCII', $ta);
+ return array_map(static::class.'::unichrASCII', $ta);
}
/**
@@ -2002,7 +2003,7 @@ public static function UTF8StringToArray($str, $isunicode, &$currentfont) {
if ($isunicode) {
// requires PCRE unicode support turned on
$chars = TCPDF_STATIC::pregSplit('//','u', $str, -1, PREG_SPLIT_NO_EMPTY);
- $carr = array_map(get_called_class().'::uniord', $chars);
+ $carr = array_map(static::class.'::uniord', $chars);
} else {
$chars = str_split($str);
$carr = array_map('ord', $chars);
diff --git a/vendor/tecnickcom/tcpdf/include/tcpdf_static.php b/vendor/tecnickcom/tcpdf/include/tcpdf_static.php
index ac9c3e1fd..2e18d9c7d 100644
--- a/vendor/tecnickcom/tcpdf/include/tcpdf_static.php
+++ b/vendor/tecnickcom/tcpdf/include/tcpdf_static.php
@@ -1,13 +1,13 @@
* @package com.tecnick.tcpdf
* @author Nicola Asuni
- * @version 1.1.2
+ * @version 1.1.5
*/
/**
@@ -46,7 +46,7 @@
* Static methods used by the TCPDF class.
* @package com.tecnick.tcpdf
* @brief PHP class for generating PDF documents without requiring external extensions.
- * @version 1.1.1
+ * @version 1.1.5
* @author Nicola Asuni - info@tecnick.com
*/
class TCPDF_STATIC {
@@ -55,7 +55,7 @@ class TCPDF_STATIC {
* Current TCPDF version.
* @private static
*/
- private static $tcpdf_version = '6.7.7';
+ private static $tcpdf_version = '6.8.0';
/**
* String alias for total number of pages.
@@ -106,6 +106,31 @@ class TCPDF_STATIC {
*/
public static $pageboxes = array('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox');
+ /**
+ * Array of default cURL options for curl_setopt_array.
+ *
+ * @var array cURL options.
+ */
+ protected const CURLOPT_DEFAULT = [
+ CURLOPT_CONNECTTIMEOUT => 5,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_PROTOCOLS => CURLPROTO_HTTPS | CURLPROTO_HTTP | CURLPROTO_FTP | CURLPROTO_FTPS,
+ CURLOPT_SSL_VERIFYHOST => 2,
+ CURLOPT_SSL_VERIFYPEER => true,
+ CURLOPT_TIMEOUT => 30,
+ CURLOPT_USERAGENT => 'tcpdf',
+ ];
+
+ /**
+ * Array of fixed cURL options for curl_setopt_array.
+ *
+ * @var array cURL options.
+ */
+ protected const CURLOPT_FIXED = [
+ CURLOPT_FAILONERROR => true,
+ CURLOPT_RETURNTRANSFER => true,
+ ];
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/**
@@ -1823,23 +1848,19 @@ public static function fopenLocal($filename, $mode) {
*/
public static function url_exists($url) {
$crs = curl_init();
- // encode query params in URL to get right response form the server
- $url = self::encodeUrlQuery($url);
- curl_setopt($crs, CURLOPT_URL, $url);
- curl_setopt($crs, CURLOPT_NOBODY, true);
- curl_setopt($crs, CURLOPT_FAILONERROR, true);
- if ((ini_get('open_basedir') == '') && (!ini_get('safe_mode'))) {
- curl_setopt($crs, CURLOPT_FOLLOWLOCATION, true);
- }
- curl_setopt($crs, CURLOPT_CONNECTTIMEOUT, 5);
- curl_setopt($crs, CURLOPT_TIMEOUT, 30);
- curl_setopt($crs, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($crs, CURLOPT_SSL_VERIFYHOST, false);
- curl_setopt($crs, CURLOPT_USERAGENT, 'tc-lib-file');
- curl_setopt($crs, CURLOPT_MAXREDIRS, 5);
- if (defined('CURLOPT_PROTOCOLS')) {
- curl_setopt($crs, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS | CURLPROTO_HTTP | CURLPROTO_FTP | CURLPROTO_FTPS);
- }
+ $curlopts = [];
+ if (
+ (ini_get('open_basedir') == '')
+ && (ini_get('safe_mode') === ''
+ || ini_get('safe_mode') === false)
+ ) {
+ $curlopts[CURLOPT_FOLLOWLOCATION] = true;
+ }
+ $curlopts = array_replace($curlopts, self::CURLOPT_DEFAULT);
+ $curlopts = array_replace($curlopts, K_CURLOPTS);
+ $curlopts = array_replace($curlopts, self::CURLOPT_FIXED);
+ $curlopts[CURLOPT_URL] = $url;
+ curl_setopt_array($crs, $curlopts);
curl_exec($crs);
$code = curl_getinfo($crs, CURLINFO_HTTP_CODE);
curl_close($crs);
@@ -1960,21 +1981,19 @@ public static function fileGetContents($file) {
) {
// try to get remote file data using cURL
$crs = curl_init();
- curl_setopt($crs, CURLOPT_URL, $path);
- curl_setopt($crs, CURLOPT_FAILONERROR, true);
- curl_setopt($crs, CURLOPT_RETURNTRANSFER, true);
- if ((ini_get('open_basedir') == '') && (!ini_get('safe_mode'))) {
- curl_setopt($crs, CURLOPT_FOLLOWLOCATION, true);
- }
- curl_setopt($crs, CURLOPT_CONNECTTIMEOUT, 5);
- curl_setopt($crs, CURLOPT_TIMEOUT, 30);
- curl_setopt($crs, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($crs, CURLOPT_SSL_VERIFYHOST, false);
- curl_setopt($crs, CURLOPT_USERAGENT, 'tc-lib-file');
- curl_setopt($crs, CURLOPT_MAXREDIRS, 5);
- if (defined('CURLOPT_PROTOCOLS')) {
- curl_setopt($crs, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS | CURLPROTO_HTTP | CURLPROTO_FTP | CURLPROTO_FTPS);
+ $curlopts = [];
+ if (
+ (ini_get('open_basedir') == '')
+ && (ini_get('safe_mode') === ''
+ || ini_get('safe_mode') === false)
+ ) {
+ $curlopts[CURLOPT_FOLLOWLOCATION] = true;
}
+ $curlopts = array_replace($curlopts, self::CURLOPT_DEFAULT);
+ $curlopts = array_replace($curlopts, K_CURLOPTS);
+ $curlopts = array_replace($curlopts, self::CURLOPT_FIXED);
+ $curlopts[CURLOPT_URL] = $url;
+ curl_setopt_array($crs, $curlopts);
$ret = curl_exec($crs);
curl_close($crs);
if ($ret !== false) {
diff --git a/vendor/tecnickcom/tcpdf/tcpdf.php b/vendor/tecnickcom/tcpdf/tcpdf.php
index 48ae2b908..7d967234b 100644
--- a/vendor/tecnickcom/tcpdf/tcpdf.php
+++ b/vendor/tecnickcom/tcpdf/tcpdf.php
@@ -1,9 +1,9 @@
* @package com.tecnick.tcpdf
* @author Nicola Asuni
- * @version 6.6.5
+ * @version 6.8.0
*/
// TCPDF configuration
@@ -128,7 +128,7 @@
* TCPDF project (http://www.tcpdf.org) has been originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.
* @package com.tecnick.tcpdf
* @brief PHP class for generating PDF documents without requiring external extensions.
- * @version 6.7.7
+ * @version 6.8.0
* @author Nicola Asuni - info@tecnick.com
* @IgnoreAnnotation("protected")
* @IgnoreAnnotation("public")
@@ -3007,6 +3007,7 @@ public function setAllowLocalFiles($allowLocalFiles) {
public function Error($msg) {
// unset all class variables
$this->_destroy(true);
+ $msg = htmlspecialchars($msg, ENT_QUOTES, 'UTF-8');
if (defined('K_TCPDF_THROW_EXCEPTION_ERROR') AND !K_TCPDF_THROW_EXCEPTION_ERROR) {
die('TCPDF ERROR: '.$msg);
} else {
@@ -17259,7 +17260,7 @@ protected function unserializeTCPDFtag($data) {
$hlen = intval(substr($data, 0, $hpos));
$hash = substr($data, $hpos + 1, $hlen);
$encoded = substr($data, $hpos + 2 + $hlen);
- if ($hash != $this->hashTCPDFtag($encoded)) {
+ if (!hash_equals( $this->hashTCPDFtag($encoded), $hash)) {
$this->Error('Invalid parameters');
}
return json_decode(urldecode($encoded), true);
@@ -19055,7 +19056,7 @@ protected function openHTMLTagHandler($dom, $key, $cell) {
if ($imgsrc[0] === '@') {
// data stream
$imgsrc = '@'.base64_decode(substr($imgsrc, 1));
- $type = preg_match('/