Compare commits

...

8 commits

Author SHA1 Message Date
Timothée Jaussoin
10a29b7420 Fix #135 Refactor the password algorithms code 2023-12-18 16:19:12 +00:00
Timothée Jaussoin
adbf8320e7 Fix #133 Make the MySQL connection unstrict 2023-12-14 16:02:05 +01:00
Timothée Jaussoin
07f2048c10 Release the 1.4.0 2023-12-06 13:34:51 +00:00
Timothée Jaussoin
3e23ebcc70 Merge branch 'release/1.4' 2023-11-30 17:17:11 +01:00
Timothée Jaussoin
c770798493 Fix #128 Add a DotEnv toggle to enable/disable the X-Linphone-Provisioning header 2023-11-30 16:15:44 +00:00
Timothée Jaussoin
4d9a19f8cf Fix #119 Add a X-Linphone-Provisioning required header to the provisioning... 2023-11-13 14:14:42 +00:00
Timothée Jaussoin
b70fc27fea Reorganize the statistics filters form for better readability 2023-11-13 10:33:37 +00:00
Timothée Jaussoin
1c0d069afc Branch the 1.4
Complete the CHANGELOG with new features and fixes
Update the dependencies
2023-11-09 14:55:47 +01:00
22 changed files with 252 additions and 155 deletions

View file

@ -1,5 +1,8 @@
# Flexisip Account Manager Changelog # Flexisip Account Manager Changelog
v1.5
----
v1.4 v1.4
---- ----
- Redesign and refactoring of the main UI and panel flows - Redesign and refactoring of the main UI and panel flows

View file

@ -74,7 +74,7 @@ deb-only:
fakeroot alien -g -k --scripts $(OUTPUT_DIR)/rpmbuild/tmp.rpm fakeroot alien -g -k --scripts $(OUTPUT_DIR)/rpmbuild/tmp.rpm
rm -r $(OUTPUT_DIR)/rpmbuild rm -r $(OUTPUT_DIR)/rpmbuild
rm -rf $(OUTPUT_DIR)/*.orig rm -rf $(OUTPUT_DIR)/*.orig
sed -i 's/Depends:.*/Depends: $${shlibs:Depends}, php (>= 8.0), php-xml, php-pdo, php-gd, php-redis, php-mysql, php-mbstring, php-sqlite3/g' $(OUTPUT_DIR)/bc-flexisip-account-manager*/debian/control sed -i 's/Depends:.*/Depends: $${shlibs:Depends}, php (>= 8.2), php8.2-xml, php8.2-pdo, php8.2-gd, php8.2-redis, php8.2-mysql, php8.2-mbstring, php8.2-sqlite3/g' $(OUTPUT_DIR)/bc-flexisip-account-manager*/debian/control
cd `ls -rt $(OUTPUT_DIR) | tail -1` && dpkg-buildpackage --no-sign cd `ls -rt $(OUTPUT_DIR) | tail -1` && dpkg-buildpackage --no-sign
@echo "📦✅ DEB Package Created" @echo "📦✅ DEB Package Created"

View file

@ -147,18 +147,6 @@ For the REST API, the `/api` page contains all the required documentation to aut
FlexiAPI is shipped with several console commands that you can launch using the `artisan` executable available at the root of this project. FlexiAPI is shipped with several console commands that you can launch using the `artisan` executable available at the root of this project.
### Migrate an old database
FlexiAPI needs an empty database to run its migration. The following console command allow you to import simultanously an exisiting Flexisip database and the old FlexiAPI SQLite database file (if you have one) in the new one. To do so, please specify the new database configuration in the `.env` file and run the following command.
The migration script requires at least 300mb of memory to run. You should edit the `memory_limit` in the `php.ini` file to increase it.
php artisan db:import {old_dbname} {old_sqlite_file_path?} --username={old_username} --password={old_password}
Several other parameters are also available to customize the migration process, you can list them all using the command documentation.
php artisan -h db:import
### Create an admin account ### Create an admin account
Create an admin account, an API Key will also be generated along the way, it might expire after a while. Create an admin account, an API Key will also be generated along the way, it might expire after a while.

View file

@ -26,10 +26,12 @@ ACCOUNT_EMAIL_UNIQUE=false # Emails are unique between all the accounts
ACCOUNT_CONSUME_EXTERNAL_ACCOUNT_ON_CREATE=false ACCOUNT_CONSUME_EXTERNAL_ACCOUNT_ON_CREATE=false
ACCOUNT_BLACKLISTED_USERNAMES= ACCOUNT_BLACKLISTED_USERNAMES=
ACCOUNT_USERNAME_REGEX="^[a-z0-9+_.-]*$" ACCOUNT_USERNAME_REGEX="^[a-z0-9+_.-]*$"
ACCOUNT_DEFAULT_PASSWORD_ALGORITHM=SHA-256 # Can ONLY be MD5 or SHA-256 in capital, default to SHA-256
# Account provisioning # Account provisioning
ACCOUNT_PROVISIONING_RC_FILE= ACCOUNT_PROVISIONING_RC_FILE=
ACCOUNT_PROVISIONING_OVERWRITE_ALL= ACCOUNT_PROVISIONING_OVERWRITE_ALL=
ACCOUNT_PROVISIONING_USE_X_LINPHONE_PROVISIONING_HEADER=true
# Instance specific parameters # Instance specific parameters
INSTANCE_COPYRIGHT= # Simple text displayed in the page footer INSTANCE_COPYRIGHT= # Simple text displayed in the page footer

View file

@ -345,8 +345,10 @@ class Account extends Authenticatable
return !empty($this->recovery_code) && $this->updated_at->greaterThan($oneHourAgo); return !empty($this->recovery_code) && $this->updated_at->greaterThan($oneHourAgo);
} }
public function updatePassword($newPassword, string $algorithm = 'SHA-256') public function updatePassword($newPassword, ?string $algorithm = null)
{ {
$algorithm = $algorithm ?? config('app.account_default_password_algorithm');
$this->passwords()->delete(); $this->passwords()->delete();
$password = new Password; $password = new Password;
@ -356,14 +358,6 @@ class Account extends Authenticatable
$password->save(); $password->save();
} }
public function fillPassword(Request $request)
{
if ($request->filled('password')) {
$this->algorithm = $request->has('password_sha256') ? 'SHA-256' : 'MD5';
$this->updatePassword($request->get('password'), $this->algorithm);
}
}
public function toVcard4() public function toVcard4()
{ {
$vcard = 'BEGIN:VCARD $vcard = 'BEGIN:VCARD

View file

@ -28,6 +28,14 @@ use League\CommonMark\Extension\HeadingPermalink\HeadingPermalinkExtension;
use League\CommonMark\Extension\TableOfContents\TableOfContentsExtension; use League\CommonMark\Extension\TableOfContents\TableOfContentsExtension;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
function passwordAlgorithms(): array
{
return [
'MD5' => 'md5',
'SHA-256' => 'sha256',
];
}
function generateNonce(): string function generateNonce(): string
{ {
return Str::random(32); return Str::random(32);
@ -45,9 +53,7 @@ function generateValidNonce(Account $account): string
function bchash(string $username, string $domain, string $password, string $algorithm = 'MD5') function bchash(string $username, string $domain, string $password, string $algorithm = 'MD5')
{ {
$algos = ['MD5' => 'md5', 'SHA-256' => 'sha256']; return hash(passwordAlgorithms()[$algorithm], $username . ':' . $domain . ':' . $password);
return hash($algos[$algorithm], $username . ':' . $domain . ':' . $password);
} }
function generatePin() function generatePin()

View file

@ -45,7 +45,7 @@ class PasswordController extends Controller
$account->activated = true; $account->activated = true;
$account->save(); $account->save();
$account->updatePassword($request->get('password'), 'SHA-256'); $account->updatePassword($request->get('password'));
if ($account->passwords()->count() > 0) { if ($account->passwords()->count() > 0) {
Log::channel('events')->info('Web: Password changed', ['id' => $account->identifier]); Log::channel('events')->info('Web: Password changed', ['id' => $account->identifier]);

View file

@ -124,7 +124,8 @@ class ProvisioningController extends Controller
private function generateProvisioning(Request $request, Account $account = null) private function generateProvisioning(Request $request, Account $account = null)
{ {
if (!$request->hasHeader('x-linphone-provisioning')) { if (!$request->hasHeader('x-linphone-provisioning')
&& config('app.provisioning_use_x_linphone_provisioning_header')) {
abort(400, 'x-linphone-provisioning header is missing'); abort(400, 'x-linphone-provisioning header is missing');
} }

View file

@ -98,7 +98,7 @@ class AccountController extends Controller
$account->save(); $account->save();
$account->phone = $request->get('phone'); $account->phone = $request->get('phone');
$account->fillPassword($request); $account->updatePassword($request->get('password'));
$account->refresh(); $account->refresh();
$account->setRole($request->get('role')); $account->setRole($request->get('role'));
@ -136,10 +136,7 @@ class AccountController extends Controller
$account->phone = $request->get('phone'); $account->phone = $request->get('phone');
if ($request->filled('password') && $request->filled('password_confirmation')) { $account->updatePassword($request->get('password'));
$account->fillPassword($request);
}
$account->setRole($request->get('role')); $account->setRole($request->get('role'));
Log::channel('events')->info('Web Admin: Account updated', ['id' => $account->identifier]); Log::channel('events')->info('Web Admin: Account updated', ['id' => $account->identifier]);

View file

@ -31,15 +31,19 @@ use App\Account;
use App\AccountCreationToken; use App\AccountCreationToken;
use App\AccountTombstone; use App\AccountTombstone;
use App\Alias; use App\Alias;
use App\Http\Controllers\Account\AuthenticateController as WebAuthenticateController; use App\Http\Controllers\Account\AuthenticateController as WebAuthenticateController;
use App\Http\Requests\CreateAccountRequest; use App\Http\Requests\CreateAccountRequest;
use App\Libraries\OvhSMS; use App\Libraries\OvhSMS;
use App\Mail\RegisterConfirmation; use App\Mail\RegisterConfirmation;
use App\Rules\AccountCreationToken as RulesAccountCreationToken; use App\Rules\AccountCreationToken as RulesAccountCreationToken;
use App\Rules\BlacklistedUsername; use App\Rules\BlacklistedUsername;
use App\Rules\NoUppercase; use App\Rules\NoUppercase;
use App\Rules\SIPUsername; use App\Rules\SIPUsername;
use App\Rules\WithoutSpaces; use App\Rules\WithoutSpaces;
use App\Rules\PasswordAlgorithm;
use App\Services\AccountService; use App\Services\AccountService;
class AccountController extends Controller class AccountController extends Controller
@ -104,7 +108,7 @@ class AccountController extends Controller
}), }),
'filled', 'filled',
], ],
'algorithm' => 'required|in:SHA-256,MD5', 'algorithm' => ['required', new PasswordAlgorithm],
'password' => 'required|filled', 'password' => 'required|filled',
'domain' => 'min:3', 'domain' => 'min:3',
'email' => config('app.account_email_unique') 'email' => config('app.account_email_unique')

View file

@ -19,11 +19,13 @@
namespace App\Http\Controllers\Api\Account; namespace App\Http\Controllers\Api\Account;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;
use App\Rules\PasswordAlgorithm;
use App\Mail\ConfirmedRegistration; use App\Mail\ConfirmedRegistration;
class PasswordController extends Controller class PasswordController extends Controller
@ -31,7 +33,7 @@ class PasswordController extends Controller
public function update(Request $request) public function update(Request $request)
{ {
$request->validate([ $request->validate([
'algorithm' => 'required|in:SHA-256,MD5', 'algorithm' => ['required', new PasswordAlgorithm],
'password' => 'required', 'password' => 'required',
]); ]);

View file

@ -33,6 +33,7 @@ use App\ContactsList;
use App\Http\Controllers\Account\AuthenticateController as WebAuthenticateController; use App\Http\Controllers\Account\AuthenticateController as WebAuthenticateController;
use App\Http\Requests\CreateAccountRequest; use App\Http\Requests\CreateAccountRequest;
use App\Http\Requests\UpdateAccountRequest; use App\Http\Requests\UpdateAccountRequest;
use App\Rules\PasswordAlgorithm;
use App\Services\AccountService; use App\Services\AccountService;
class AccountController extends Controller class AccountController extends Controller
@ -109,7 +110,7 @@ class AccountController extends Controller
public function store(CreateAccountRequest $request) public function store(CreateAccountRequest $request)
{ {
$request->validate([ $request->validate([
'algorithm' => 'required|in:SHA-256,MD5', 'algorithm' => ['required', new PasswordAlgorithm],
'admin' => 'boolean|nullable', 'admin' => 'boolean|nullable',
'activated' => 'boolean|nullable', 'activated' => 'boolean|nullable',
'confirmation_key_expires' => [ 'confirmation_key_expires' => [
@ -159,7 +160,7 @@ class AccountController extends Controller
public function update(UpdateAccountRequest $request, int $accountId) public function update(UpdateAccountRequest $request, int $accountId)
{ {
$request->validate([ $request->validate([
'algorithm' => 'required|in:SHA-256,MD5', 'algorithm' => ['required', new PasswordAlgorithm],
'admin' => 'boolean|nullable', 'admin' => 'boolean|nullable',
'activated' => 'boolean|nullable' 'activated' => 'boolean|nullable'
]); ]);

View file

@ -30,11 +30,6 @@ use Validator;
class AuthenticateDigestOrKey class AuthenticateDigestOrKey
{ {
const ALGORITHMS = [
'MD5' => 'md5',
'SHA-256' => 'sha256',
];
/** /**
* Handle an incoming request. * Handle an incoming request.
* *
@ -106,7 +101,7 @@ class AuthenticateDigestOrKey
'cnonce' => 'required', 'cnonce' => 'required',
'algorithm' => [ 'algorithm' => [
'required', 'required',
Rule::in(array_keys(self::ALGORITHMS)), Rule::in(array_keys(passwordAlgorithms())),
], ],
'username' => 'required|in:'.$username, 'username' => 'required|in:'.$username,
])->validate(); ])->validate();
@ -130,7 +125,7 @@ class AuthenticateDigestOrKey
return $this->generateUnauthorizedResponse($account, 'Wrong algorithm'); return $this->generateUnauthorizedResponse($account, 'Wrong algorithm');
} }
$hash = self::ALGORITHMS[$auth['algorithm']]; $hash = passwordAlgorithms()[$auth['algorithm']];
// Hashing and checking // Hashing and checking
$a1 = $password->algorithm == 'CLRTXT' $a1 = $password->algorithm == 'CLRTXT'
@ -208,14 +203,14 @@ class AuthenticateDigestOrKey
foreach ($account->passwords as $password) { foreach ($account->passwords as $password) {
if ($password->algorithm == 'CLRTXT') { if ($password->algorithm == 'CLRTXT') {
foreach (array_keys(self::ALGORITHMS) as $algorithm) { foreach (array_keys(passwordAlgorithms()) as $algorithm) {
array_push( array_push(
$headers, $headers,
$this->generateAuthHeader($resolvedRealm, $algorithm, $nonce) $this->generateAuthHeader($resolvedRealm, $algorithm, $nonce)
); );
} }
break; break;
} else if (\in_array($password->algorithm, array_keys(self::ALGORITHMS))) { } else if (\in_array($password->algorithm, array_keys(passwordAlgorithms()))) {
array_push( array_push(
$headers, $headers,
$this->generateAuthHeader($resolvedRealm, $password->algorithm, $nonce) $this->generateAuthHeader($resolvedRealm, $password->algorithm, $nonce)

View file

@ -39,7 +39,6 @@ class UpdateAccountRequest extends FormRequest
config('app.account_email_unique') ? Rule::unique('accounts', 'email')->ignore($this->route('account_id')) : null config('app.account_email_unique') ? Rule::unique('accounts', 'email')->ignore($this->route('account_id')) : null
], ],
'role' => 'in:admin,end_user', 'role' => 'in:admin,end_user',
'password_sha256' => 'nullable|min:3',
'dtmf_protocol' => 'nullable|in:' . Account::dtmfProtocolsRule(), 'dtmf_protocol' => 'nullable|in:' . Account::dtmfProtocolsRule(),
'phone' => [ 'phone' => [
'nullable', 'nullable',

View file

@ -0,0 +1,18 @@
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class PasswordAlgorithm implements Rule
{
public function passes($attribute, $value)
{
return in_array($value, array_keys(passwordAlgorithms()));
}
public function message()
{
return 'The password algorithm must be in ' . implode(', ', array_keys(passwordAlgorithms()));
}
}

View file

@ -73,7 +73,7 @@ class AccountService
$account->provision(); $account->provision();
$account->save(); $account->save();
$account->updatePassword($request->get('password'), $request->has('algorithm') ? $request->get('algorithm') : 'SHA-256'); $account->updatePassword($request->get('password'), $request->get('algorithm'));
if ($this->api) { if ($this->api) {
$token = AccountCreationToken::where('token', $request->get('account_creation_token'))->first(); $token = AccountCreationToken::where('token', $request->get('account_creation_token'))->first();

279
flexiapi/composer.lock generated
View file

@ -241,6 +241,75 @@
], ],
"time": "2023-01-15T23:15:59+00:00" "time": "2023-01-15T23:15:59+00:00"
}, },
{
"name": "carbonphp/carbon-doctrine-types",
"version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
"reference": "67a77972b9f398ae7068dabacc39c08aeee170d5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/67a77972b9f398ae7068dabacc39c08aeee170d5",
"reference": "67a77972b9f398ae7068dabacc39c08aeee170d5",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0"
},
"conflict": {
"doctrine/dbal": "<3.7.0 || >=4.0.0"
},
"require-dev": {
"doctrine/dbal": "^3.7.0",
"nesbot/carbon": "^2.71.0 || ^3.0.0",
"phpunit/phpunit": "^10.3"
},
"type": "library",
"autoload": {
"psr-4": {
"Carbon\\Doctrine\\": "src/Carbon/Doctrine/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "KyleKatarn",
"email": "kylekatarnls@gmail.com"
}
],
"description": "Types to use Carbon in Doctrine",
"keywords": [
"carbon",
"date",
"datetime",
"doctrine",
"time"
],
"support": {
"issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
"source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.0.0"
},
"funding": [
{
"url": "https://github.com/kylekatarnls",
"type": "github"
},
{
"url": "https://opencollective.com/Carbon",
"type": "open_collective"
},
{
"url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
"type": "tidelift"
}
],
"time": "2023-10-01T14:29:01+00:00"
},
{ {
"name": "dasprid/enum", "name": "dasprid/enum",
"version": "1.0.5", "version": "1.0.5",
@ -461,16 +530,16 @@
}, },
{ {
"name": "doctrine/dbal", "name": "doctrine/dbal",
"version": "3.7.1", "version": "3.7.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/dbal.git", "url": "https://github.com/doctrine/dbal.git",
"reference": "5b7bd66c9ff58c04c5474ab85edce442f8081cb2" "reference": "0ac3c270590e54910715e9a1a044cc368df282b2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/5b7bd66c9ff58c04c5474ab85edce442f8081cb2", "url": "https://api.github.com/repos/doctrine/dbal/zipball/0ac3c270590e54910715e9a1a044cc368df282b2",
"reference": "5b7bd66c9ff58c04c5474ab85edce442f8081cb2", "reference": "0ac3c270590e54910715e9a1a044cc368df282b2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -486,7 +555,7 @@
"doctrine/coding-standard": "12.0.0", "doctrine/coding-standard": "12.0.0",
"fig/log-test": "^1", "fig/log-test": "^1",
"jetbrains/phpstorm-stubs": "2023.1", "jetbrains/phpstorm-stubs": "2023.1",
"phpstan/phpstan": "1.10.35", "phpstan/phpstan": "1.10.42",
"phpstan/phpstan-strict-rules": "^1.5", "phpstan/phpstan-strict-rules": "^1.5",
"phpunit/phpunit": "9.6.13", "phpunit/phpunit": "9.6.13",
"psalm/plugin-phpunit": "0.18.4", "psalm/plugin-phpunit": "0.18.4",
@ -554,7 +623,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/dbal/issues", "issues": "https://github.com/doctrine/dbal/issues",
"source": "https://github.com/doctrine/dbal/tree/3.7.1" "source": "https://github.com/doctrine/dbal/tree/3.7.2"
}, },
"funding": [ "funding": [
{ {
@ -570,7 +639,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-10-06T05:06:20+00:00" "time": "2023-11-19T08:06:58+00:00"
}, },
{ {
"name": "doctrine/deprecations", "name": "doctrine/deprecations",
@ -1453,16 +1522,16 @@
}, },
{ {
"name": "guzzlehttp/guzzle", "name": "guzzlehttp/guzzle",
"version": "7.8.0", "version": "7.8.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/guzzle.git", "url": "https://github.com/guzzle/guzzle.git",
"reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" "reference": "41042bc7ab002487b876a0683fc8dce04ddce104"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104",
"reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", "reference": "41042bc7ab002487b876a0683fc8dce04ddce104",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1477,11 +1546,11 @@
"psr/http-client-implementation": "1.0" "psr/http-client-implementation": "1.0"
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.1", "bamarni/composer-bin-plugin": "^1.8.2",
"ext-curl": "*", "ext-curl": "*",
"php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
"php-http/message-factory": "^1.1", "php-http/message-factory": "^1.1",
"phpunit/phpunit": "^8.5.29 || ^9.5.23", "phpunit/phpunit": "^8.5.36 || ^9.6.15",
"psr/log": "^1.1 || ^2.0 || ^3.0" "psr/log": "^1.1 || ^2.0 || ^3.0"
}, },
"suggest": { "suggest": {
@ -1559,7 +1628,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/guzzle/issues", "issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/7.8.0" "source": "https://github.com/guzzle/guzzle/tree/7.8.1"
}, },
"funding": [ "funding": [
{ {
@ -1575,28 +1644,28 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-08-27T10:20:53+00:00" "time": "2023-12-03T20:35:24+00:00"
}, },
{ {
"name": "guzzlehttp/promises", "name": "guzzlehttp/promises",
"version": "2.0.1", "version": "2.0.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/promises.git", "url": "https://github.com/guzzle/promises.git",
"reference": "111166291a0f8130081195ac4556a5587d7f1b5d" "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223",
"reference": "111166291a0f8130081195ac4556a5587d7f1b5d", "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.2.5 || ^8.0" "php": "^7.2.5 || ^8.0"
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.1", "bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.29 || ^9.5.23" "phpunit/phpunit": "^8.5.36 || ^9.6.15"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -1642,7 +1711,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/promises/issues", "issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/2.0.1" "source": "https://github.com/guzzle/promises/tree/2.0.2"
}, },
"funding": [ "funding": [
{ {
@ -1658,20 +1727,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-08-03T15:11:55+00:00" "time": "2023-12-03T20:19:20+00:00"
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
"version": "2.6.1", "version": "2.6.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/psr7.git", "url": "https://github.com/guzzle/psr7.git",
"reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221",
"reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1685,9 +1754,9 @@
"psr/http-message-implementation": "1.0" "psr/http-message-implementation": "1.0"
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.1", "bamarni/composer-bin-plugin": "^1.8.2",
"http-interop/http-factory-tests": "^0.9", "http-interop/http-factory-tests": "^0.9",
"phpunit/phpunit": "^8.5.29 || ^9.5.23" "phpunit/phpunit": "^8.5.36 || ^9.6.15"
}, },
"suggest": { "suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
@ -1758,7 +1827,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/psr7/issues", "issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.6.1" "source": "https://github.com/guzzle/psr7/tree/2.6.2"
}, },
"funding": [ "funding": [
{ {
@ -1774,32 +1843,38 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-08-27T10:13:57+00:00" "time": "2023-12-03T20:05:35+00:00"
}, },
{ {
"name": "guzzlehttp/uri-template", "name": "guzzlehttp/uri-template",
"version": "v1.0.2", "version": "v1.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/uri-template.git", "url": "https://github.com/guzzle/uri-template.git",
"reference": "61bf437fc2197f587f6857d3ff903a24f1731b5d" "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/uri-template/zipball/61bf437fc2197f587f6857d3ff903a24f1731b5d", "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c",
"reference": "61bf437fc2197f587f6857d3ff903a24f1731b5d", "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.2.5 || ^8.0", "php": "^7.2.5 || ^8.0",
"symfony/polyfill-php80": "^1.17" "symfony/polyfill-php80": "^1.24"
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.1", "bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.19 || ^9.5.8", "phpunit/phpunit": "^8.5.36 || ^9.6.15",
"uri-template/tests": "1.0.0" "uri-template/tests": "1.0.0"
}, },
"type": "library", "type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
"forward-command": false
}
},
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"GuzzleHttp\\UriTemplate\\": "src" "GuzzleHttp\\UriTemplate\\": "src"
@ -1838,7 +1913,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/uri-template/issues", "issues": "https://github.com/guzzle/uri-template/issues",
"source": "https://github.com/guzzle/uri-template/tree/v1.0.2" "source": "https://github.com/guzzle/uri-template/tree/v1.0.3"
}, },
"funding": [ "funding": [
{ {
@ -1854,7 +1929,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-08-27T10:19:19+00:00" "time": "2023-12-03T19:50:20+00:00"
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
@ -2056,16 +2131,16 @@
}, },
{ {
"name": "laravel/serializable-closure", "name": "laravel/serializable-closure",
"version": "v1.3.2", "version": "v1.3.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/serializable-closure.git", "url": "https://github.com/laravel/serializable-closure.git",
"reference": "076fe2cf128bd54b4341cdc6d49b95b34e101e4c" "reference": "3dbf8a8e914634c48d389c1234552666b3d43754"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/serializable-closure/zipball/076fe2cf128bd54b4341cdc6d49b95b34e101e4c", "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754",
"reference": "076fe2cf128bd54b4341cdc6d49b95b34e101e4c", "reference": "3dbf8a8e914634c48d389c1234552666b3d43754",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2112,7 +2187,7 @@
"issues": "https://github.com/laravel/serializable-closure/issues", "issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure" "source": "https://github.com/laravel/serializable-closure"
}, },
"time": "2023-10-17T13:38:16+00:00" "time": "2023-11-08T14:08:06+00:00"
}, },
{ {
"name": "league/commonmark", "name": "league/commonmark",
@ -2304,16 +2379,16 @@
}, },
{ {
"name": "league/flysystem", "name": "league/flysystem",
"version": "3.19.0", "version": "3.23.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem.git", "url": "https://github.com/thephpleague/flysystem.git",
"reference": "1b2aa10f2326e0351399b8ce68e287d8e9209a83" "reference": "d4ad81e2b67396e33dc9d7e54ec74ccf73151dcc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1b2aa10f2326e0351399b8ce68e287d8e9209a83", "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/d4ad81e2b67396e33dc9d7e54ec74ccf73151dcc",
"reference": "1b2aa10f2326e0351399b8ce68e287d8e9209a83", "reference": "d4ad81e2b67396e33dc9d7e54ec74ccf73151dcc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2341,7 +2416,7 @@
"friendsofphp/php-cs-fixer": "^3.5", "friendsofphp/php-cs-fixer": "^3.5",
"google/cloud-storage": "^1.23", "google/cloud-storage": "^1.23",
"microsoft/azure-storage-blob": "^1.1", "microsoft/azure-storage-blob": "^1.1",
"phpseclib/phpseclib": "^3.0.14", "phpseclib/phpseclib": "^3.0.34",
"phpstan/phpstan": "^1.10", "phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^9.5.11|^10.0", "phpunit/phpunit": "^9.5.11|^10.0",
"sabre/dav": "^4.3.1" "sabre/dav": "^4.3.1"
@ -2378,7 +2453,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/thephpleague/flysystem/issues", "issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.19.0" "source": "https://github.com/thephpleague/flysystem/tree/3.23.0"
}, },
"funding": [ "funding": [
{ {
@ -2390,20 +2465,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-11-07T09:04:28+00:00" "time": "2023-12-04T10:16:17+00:00"
}, },
{ {
"name": "league/flysystem-local", "name": "league/flysystem-local",
"version": "3.19.0", "version": "3.23.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem-local.git", "url": "https://github.com/thephpleague/flysystem-local.git",
"reference": "8d868217f9eeb4e9a7320db5ccad825e9a7a4076" "reference": "5cf046ba5f059460e86a997c504dd781a39a109b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/8d868217f9eeb4e9a7320db5ccad825e9a7a4076", "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/5cf046ba5f059460e86a997c504dd781a39a109b",
"reference": "8d868217f9eeb4e9a7320db5ccad825e9a7a4076", "reference": "5cf046ba5f059460e86a997c504dd781a39a109b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2438,7 +2513,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/thephpleague/flysystem-local/issues", "issues": "https://github.com/thephpleague/flysystem-local/issues",
"source": "https://github.com/thephpleague/flysystem-local/tree/3.19.0" "source": "https://github.com/thephpleague/flysystem-local/tree/3.23.0"
}, },
"funding": [ "funding": [
{ {
@ -2450,7 +2525,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-11-06T20:35:28+00:00" "time": "2023-12-04T10:14:46+00:00"
}, },
{ {
"name": "league/mime-type-detection", "name": "league/mime-type-detection",
@ -2732,19 +2807,20 @@
}, },
{ {
"name": "nesbot/carbon", "name": "nesbot/carbon",
"version": "2.71.0", "version": "2.72.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/briannesbitt/Carbon.git", "url": "https://github.com/briannesbitt/Carbon.git",
"reference": "98276233188583f2ff845a0f992a235472d9466a" "reference": "a6885fcbad2ec4360b0e200ee0da7d9b7c90786b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/98276233188583f2ff845a0f992a235472d9466a", "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/a6885fcbad2ec4360b0e200ee0da7d9b7c90786b",
"reference": "98276233188583f2ff845a0f992a235472d9466a", "reference": "a6885fcbad2ec4360b0e200ee0da7d9b7c90786b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"carbonphp/carbon-doctrine-types": "*",
"ext-json": "*", "ext-json": "*",
"php": "^7.1.8 || ^8.0", "php": "^7.1.8 || ^8.0",
"psr/clock": "^1.0", "psr/clock": "^1.0",
@ -2756,8 +2832,8 @@
"psr/clock-implementation": "1.0" "psr/clock-implementation": "1.0"
}, },
"require-dev": { "require-dev": {
"doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0",
"doctrine/orm": "^2.7", "doctrine/orm": "^2.7 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.0", "friendsofphp/php-cs-fixer": "^3.0",
"kylekatarnls/multi-tester": "^2.0", "kylekatarnls/multi-tester": "^2.0",
"ondrejmirtes/better-reflection": "*", "ondrejmirtes/better-reflection": "*",
@ -2834,7 +2910,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-09-25T11:31:05+00:00" "time": "2023-11-28T10:13:25+00:00"
}, },
{ {
"name": "nette/schema", "name": "nette/schema",
@ -3744,16 +3820,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "9.6.13", "version": "9.6.15",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/05017b80304e0eb3f31d90194a563fd53a6021f1",
"reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3827,7 +3903,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy", "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.15"
}, },
"funding": [ "funding": [
{ {
@ -3843,7 +3919,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-09-19T05:39:22+00:00" "time": "2023-12-01T16:55:19+00:00"
}, },
{ {
"name": "psr/cache", "name": "psr/cache",
@ -4606,16 +4682,16 @@
}, },
{ {
"name": "react/dns", "name": "react/dns",
"version": "v1.11.0", "version": "v1.12.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/reactphp/dns.git", "url": "https://github.com/reactphp/dns.git",
"reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f" "reference": "c134600642fa615b46b41237ef243daa65bb64ec"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/reactphp/dns/zipball/3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", "url": "https://api.github.com/repos/reactphp/dns/zipball/c134600642fa615b46b41237ef243daa65bb64ec",
"reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", "reference": "c134600642fa615b46b41237ef243daa65bb64ec",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4625,7 +4701,7 @@
"react/promise": "^3.0 || ^2.7 || ^1.2.1" "react/promise": "^3.0 || ^2.7 || ^1.2.1"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^9.5 || ^4.8.35", "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
"react/async": "^4 || ^3 || ^2", "react/async": "^4 || ^3 || ^2",
"react/promise-timer": "^1.9" "react/promise-timer": "^1.9"
}, },
@ -4670,7 +4746,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/reactphp/dns/issues", "issues": "https://github.com/reactphp/dns/issues",
"source": "https://github.com/reactphp/dns/tree/v1.11.0" "source": "https://github.com/reactphp/dns/tree/v1.12.0"
}, },
"funding": [ "funding": [
{ {
@ -4678,7 +4754,7 @@
"type": "open_collective" "type": "open_collective"
} }
], ],
"time": "2023-06-02T12:45:26+00:00" "time": "2023-11-29T12:41:06+00:00"
}, },
{ {
"name": "react/event-loop", "name": "react/event-loop",
@ -4754,24 +4830,24 @@
}, },
{ {
"name": "react/promise", "name": "react/promise",
"version": "v3.0.0", "version": "v3.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/reactphp/promise.git", "url": "https://github.com/reactphp/promise.git",
"reference": "c86753c76fd3be465d93b308f18d189f01a22be4" "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/reactphp/promise/zipball/c86753c76fd3be465d93b308f18d189f01a22be4", "url": "https://api.github.com/repos/reactphp/promise/zipball/e563d55d1641de1dea9f5e84f3cccc66d2bfe02c",
"reference": "c86753c76fd3be465d93b308f18d189f01a22be4", "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1.0" "php": ">=7.1.0"
}, },
"require-dev": { "require-dev": {
"phpstan/phpstan": "1.10.20 || 1.4.10", "phpstan/phpstan": "1.10.39 || 1.4.10",
"phpunit/phpunit": "^9.5 || ^7.5" "phpunit/phpunit": "^9.6 || ^7.5"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -4815,7 +4891,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/reactphp/promise/issues", "issues": "https://github.com/reactphp/promise/issues",
"source": "https://github.com/reactphp/promise/tree/v3.0.0" "source": "https://github.com/reactphp/promise/tree/v3.1.0"
}, },
"funding": [ "funding": [
{ {
@ -4823,7 +4899,7 @@
"type": "open_collective" "type": "open_collective"
} }
], ],
"time": "2023-07-11T16:12:49+00:00" "time": "2023-11-16T16:21:57+00:00"
}, },
{ {
"name": "react/socket", "name": "react/socket",
@ -8319,16 +8395,16 @@
}, },
{ {
"name": "theseer/tokenizer", "name": "theseer/tokenizer",
"version": "1.2.1", "version": "1.2.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/theseer/tokenizer.git", "url": "https://github.com/theseer/tokenizer.git",
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96",
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8357,7 +8433,7 @@
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": { "support": {
"issues": "https://github.com/theseer/tokenizer/issues", "issues": "https://github.com/theseer/tokenizer/issues",
"source": "https://github.com/theseer/tokenizer/tree/1.2.1" "source": "https://github.com/theseer/tokenizer/tree/1.2.2"
}, },
"funding": [ "funding": [
{ {
@ -8365,7 +8441,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2021-07-28T10:34:58+00:00" "time": "2023-11-20T00:12:19+00:00"
}, },
{ {
"name": "tijsverkoyen/css-to-inline-styles", "name": "tijsverkoyen/css-to-inline-styles",
@ -9222,23 +9298,24 @@
}, },
{ {
"name": "pdepend/pdepend", "name": "pdepend/pdepend",
"version": "2.15.1", "version": "2.16.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/pdepend/pdepend.git", "url": "https://github.com/pdepend/pdepend.git",
"reference": "d12f25bcdfb7754bea458a4a5cb159d55e9950d0" "reference": "8dfc0c46529e2073fa97986552f80646eedac562"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/pdepend/pdepend/zipball/d12f25bcdfb7754bea458a4a5cb159d55e9950d0", "url": "https://api.github.com/repos/pdepend/pdepend/zipball/8dfc0c46529e2073fa97986552f80646eedac562",
"reference": "d12f25bcdfb7754bea458a4a5cb159d55e9950d0", "reference": "8dfc0c46529e2073fa97986552f80646eedac562",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.3.7", "php": ">=5.3.7",
"symfony/config": "^2.3.0|^3|^4|^5|^6.0", "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0",
"symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0", "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0",
"symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0" "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0",
"symfony/polyfill-mbstring": "^1.19"
}, },
"require-dev": { "require-dev": {
"easy-doc/easy-doc": "0.0.0|^1.2.3", "easy-doc/easy-doc": "0.0.0|^1.2.3",
@ -9273,7 +9350,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/pdepend/pdepend/issues", "issues": "https://github.com/pdepend/pdepend/issues",
"source": "https://github.com/pdepend/pdepend/tree/2.15.1" "source": "https://github.com/pdepend/pdepend/tree/2.16.0"
}, },
"funding": [ "funding": [
{ {
@ -9281,7 +9358,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-09-28T12:00:56+00:00" "time": "2023-11-29T08:52:35+00:00"
}, },
{ {
"name": "phpmd/phpmd", "name": "phpmd/phpmd",

View file

@ -32,6 +32,7 @@ return [
'account_email_unique' => env('ACCOUNT_EMAIL_UNIQUE', false), 'account_email_unique' => env('ACCOUNT_EMAIL_UNIQUE', false),
'blacklisted_usernames' => env('ACCOUNT_BLACKLISTED_USERNAMES', ''), 'blacklisted_usernames' => env('ACCOUNT_BLACKLISTED_USERNAMES', ''),
'account_username_regex' => env('ACCOUNT_USERNAME_REGEX', '^[a-z0-9+_.-]*$'), 'account_username_regex' => env('ACCOUNT_USERNAME_REGEX', '^[a-z0-9+_.-]*$'),
'account_default_password_algorithm' => env('ACCOUNT_DEFAULT_PASSWORD_ALGORITHM', 'SHA-256'),
/** /**
* Time limit before the API Key and related cookie are expired * Time limit before the API Key and related cookie are expired
@ -55,6 +56,7 @@ return [
*/ */
'provisioning_rc_file' => env('ACCOUNT_PROVISIONING_RC_FILE', ''), 'provisioning_rc_file' => env('ACCOUNT_PROVISIONING_RC_FILE', ''),
'provisioning_overwrite_all' => env('ACCOUNT_PROVISIONING_OVERWRITE_ALL', false), 'provisioning_overwrite_all' => env('ACCOUNT_PROVISIONING_OVERWRITE_ALL', false),
'provisioning_use_x_linphone_provisioning_header' => env('ACCOUNT_PROVISIONING_USE_X_LINPHONE_PROVISIONING_HEADER', true),
/** /**
* Set a global realm for all the accounts, if not set, the account domain * Set a global realm for all the accounts, if not set, the account domain

View file

@ -65,7 +65,7 @@ return [
'collation' => 'utf8mb4_unicode_ci', 'collation' => 'utf8mb4_unicode_ci',
'prefix' => '', 'prefix' => '',
'prefix_indexes' => true, 'prefix_indexes' => true,
'strict' => true, 'strict' => false,
'engine' => null, 'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([ 'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),

View file

@ -13,7 +13,7 @@
@endif @endif
<a href="{{ route('account.dashboard') }}" class="btn btn-secondary oppose">Cancel</a> <a href="{{ route('account.dashboard') }}" class="btn btn-secondary oppose">Cancel</a>
<input form="password_updated" class="btn" type="submit" value="Change"> <input form="password_update" class="btn" type="submit" value="Change">
</header> </header>
<form id="password_update" method="POST" action="{{ route('account.password.update') }}" accept-charset="UTF-8"> <form id="password_update" method="POST" action="{{ route('account.password.update') }}" accept-charset="UTF-8">
@ -24,7 +24,7 @@
<label for="password">New password</label> <label for="password">New password</label>
</div> </div>
<div> <div>
<input type="password_confirmation" name="password_confirmation" required> <input type="password" name="password_confirmation" required>
<label for="password_confirmation">Password confirmation</label> <label for="password_confirmation">Password confirmation</label>
</div> </div>
</form> </form>

View file

@ -51,6 +51,16 @@ class AccountProvisioningTest extends TestCase
->assertDontSee('ha1'); ->assertDontSee('ha1');
} }
public function testDisabledProvisioningHeader()
{
config()->set('app.provisioning_use_x_linphone_provisioning_header', false);
$this->get($this->route)
->assertStatus(200)
->assertHeader('Content-Type', 'application/xml')
->assertDontSee('ha1');
}
public function testXLinphoneProvisioningHeader() public function testXLinphoneProvisioningHeader()
{ {
$this->withHeaders([ $this->withHeaders([

View file

@ -28,8 +28,6 @@ abstract class TestCase extends BaseTestCase
{ {
use CreatesApplication; use CreatesApplication;
const ALGORITHMS = ['md5' => 'MD5', 'sha256' => 'SHA-256'];
protected $route = '/api/accounts/me'; protected $route = '/api/accounts/me';
protected $method = 'GET'; protected $method = 'GET';
@ -88,7 +86,7 @@ abstract class TestCase extends BaseTestCase
$extractedChallenge['qop'], $extractedChallenge['qop'],
$response, $response,
$extractedChallenge['opaque'], $extractedChallenge['opaque'],
self::ALGORITHMS[$hash], array_flip(passwordAlgorithms())[$hash],
); );
return 'Digest ' . $digest; return 'Digest ' . $digest;