Arreglado bug añadir usuarios con email repetido

This commit is contained in:
imnavajas
2024-11-18 22:00:37 +01:00
parent 006a9a1413
commit cb2ca522c6
12 changed files with 183 additions and 185 deletions

15
.idea/codeception.xml generated Normal file
View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Codeception">
<option name="configurations">
<list>
<Configuration>
<option name="path" value="$PROJECT_DIR$/tests" />
</Configuration>
<Configuration>
<option name="path" value="$PROJECT_DIR$/ci4/tests" />
</Configuration>
</list>
</option>
</component>
</project>

7
.idea/php.xml generated
View File

@ -55,6 +55,13 @@
<path value="$PROJECT_DIR$/ci4/vendor/codeigniter4/shield" /> <path value="$PROJECT_DIR$/ci4/vendor/codeigniter4/shield" />
<path value="$PROJECT_DIR$/ci4/vendor/codeigniter4/settings" /> <path value="$PROJECT_DIR$/ci4/vendor/codeigniter4/settings" />
<path value="$PROJECT_DIR$/ci4/vendor/codeigniter4/framework" /> <path value="$PROJECT_DIR$/ci4/vendor/codeigniter4/framework" />
<path value="$PROJECT_DIR$/ci4/vendor/nicolab/php-ftp-client" />
<path value="$PROJECT_DIR$/ci4/vendor/hermawan/codeigniter4-datatables" />
<path value="$PROJECT_DIR$/ci4/vendor/firebase/php-jwt" />
<path value="$PROJECT_DIR$/ci4/vendor/greenlion/php-sql-parser" />
<path value="$PROJECT_DIR$/ci4/vendor/paragonie/random_compat" />
<path value="$PROJECT_DIR$/ci4/vendor/paragonie/constant_time_encoding" />
<path value="$PROJECT_DIR$/ci4/vendor/phpseclib/phpseclib" />
</include_path> </include_path>
</component> </component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.2"> <component name="PhpProjectSharedConfiguration" php_language_level="8.2">

16
.idea/phpspec.xml generated Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PHPSpec">
<suites>
<PhpSpecSuiteConfiguration>
<option name="myPath" value="$PROJECT_DIR$" />
</PhpSpecSuiteConfiguration>
<PhpSpecSuiteConfiguration>
<option name="myPath" value="$PROJECT_DIR$/ci4" />
</PhpSpecSuiteConfiguration>
<PhpSpecSuiteConfiguration>
<option name="myPath" value="$PROJECT_DIR$/ci4" />
</PhpSpecSuiteConfiguration>
</suites>
</component>
</project>

10
.idea/safekat.iml generated
View File

@ -7,6 +7,16 @@
<sourceFolder url="file://$MODULE_DIR$/ci4/app/ThirdParty/DatatablesEditor/" isTestSource="false" packagePrefix="DataTables\" /> <sourceFolder url="file://$MODULE_DIR$/ci4/app/ThirdParty/DatatablesEditor/" isTestSource="false" packagePrefix="DataTables\" />
<sourceFolder url="file://$MODULE_DIR$/ci4/tests" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/ci4/tests" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/ci4/tests/_support" isTestSource="true" packagePrefix="Tests\Support\" /> <sourceFolder url="file://$MODULE_DIR$/ci4/tests/_support" isTestSource="true" packagePrefix="Tests\Support\" />
<sourceFolder url="file://$MODULE_DIR$/ci4/spec" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/ci4/vendor/firebase/php-jwt" />
<excludeFolder url="file://$MODULE_DIR$/ci4/vendor/greenlion/php-sql-parser" />
<excludeFolder url="file://$MODULE_DIR$/ci4/vendor/hermawan/codeigniter4-datatables" />
<excludeFolder url="file://$MODULE_DIR$/ci4/vendor/nicolab/php-ftp-client" />
<excludeFolder url="file://$MODULE_DIR$/ci4/vendor/paragonie/constant_time_encoding" />
<excludeFolder url="file://$MODULE_DIR$/ci4/vendor/paragonie/random_compat" />
<excludeFolder url="file://$MODULE_DIR$/ci4/vendor/phpseclib/phpseclib" />
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />

View File

@ -245,7 +245,6 @@ class Auth extends ShieldAuth
'required', 'required',
'max_length[254]', 'max_length[254]',
'valid_email', 'valid_email',
'is_unique[auth_identities.secret]',
], ],
]; ];

View File

@ -97,7 +97,6 @@ $routes->group('configuracion', ['namespace' => 'App\Controllers\Configuracion']
$routes->group('users', ['namespace' => 'App\Controllers\Configuracion'], function ($routes) { $routes->group('users', ['namespace' => 'App\Controllers\Configuracion'], function ($routes) {
$routes->get('', 'Users::index', ['as' => 'userList']); $routes->get('', 'Users::index', ['as' => 'userList']);
$routes->get('index', 'Users::index', ['as' => 'userIndex']);
$routes->get('list', 'Users::index', ['as' => 'userList2']); $routes->get('list', 'Users::index', ['as' => 'userList2']);
$routes->get('add', 'Users::add', ['as' => 'newUser']); $routes->get('add', 'Users::add', ['as' => 'newUser']);
$routes->post('add', 'Users::add', ['as' => 'createUser']); $routes->post('add', 'Users::add', ['as' => 'createUser']);

View File

@ -87,7 +87,6 @@ class Users extends \App\Controllers\GoBaseController
unset($postData['chatDepartments']); unset($postData['chatDepartments']);
// Marcar el username como NULL // Marcar el username como NULL
$postData['username'] = null;
$sanitizedData = $this->sanitized($postData, true); $sanitizedData = $this->sanitized($postData, true);
$noException = true; $noException = true;
@ -99,35 +98,43 @@ class Users extends \App\Controllers\GoBaseController
if ($this->canValidate()) : if ($this->canValidate()) :
try { try {
// Crear el usuario si pasa la validación // The Email is unique
$user = new User([ if ($this->user_model->isEmailUnique($sanitizedData['email'])) {
'username' => $sanitizedData['username'],
'first_name' => $sanitizedData['first_name'], // Crear el usuario si pasa la validación
'last_name' => $sanitizedData['last_name'], $user = new \CodeIgniter\Shield\Entities\User([
'email' => $sanitizedData['email'], 'username' => null, // If you don't have a username, be sure to set the value to null anyway, so that it passes CodeIgniter's empty data check
'password' => $sanitizedData['password'], 'first_name' => $sanitizedData['first_name'],
'status' => $sanitizedData['status'] ?? 0, 'last_name' => $sanitizedData['last_name'],
'active' => $sanitizedData['active'] ?? 0, 'cliente_id' => $sanitizedData['cliente_id'],
]); 'comments' => $sanitizedData['comments'],
$users->save($user); 'email' => $sanitizedData['email'],
$successfulResult = true; // Hacked 'password' => $sanitizedData['password'],
'status' => $sanitizedData['status'] ?? 0,
'active' => $sanitizedData['active'] ?? 0,
]);
// Add the user to the system
$users->save($user);
$successfulResult = true; // Hacked
} // Email is not unique!
else {
$this->viewData['errorMessage'] = "El correo '". $sanitizedData['email'] ."' ya está registrado en el sistema";
$this->session->setFlashdata('formErrors', $this->model->errors());
$successfulResult = false; // Hacked
}
} catch (\Exception $e) { } catch (\Exception $e) {
$noException = false; $noException = false;
//$this->dealWithException($e); $this->viewData['errorMessage'] = $e->getMessage();
if (strpos($e->getMessage(), 'correo duplicado') !== false) {
$this->viewData['errorMessage'] = "El correo electrónico ya está registrado en el sistema";
$this->session->setFlashdata('formErrors', $this->model->errors());
}
} }
else: else:
$this->viewData['errorMessage'] = lang('Basic.global.formErr1', [mb_strtolower(lang('Users.user'))]); $this->viewData['errorMessage'] = lang('Basic.global.formErr1', [mb_strtolower(lang('Users.user'))]);
$this->session->setFlashdata('formErrors', $this->model->errors()); $this->session->setFlashdata('formErrors', $this->model->errors());
endif; endif;
$thenRedirect = true; // Change this to false if you want your user to stay on the form after submission $thenRedirect = true; // Change this to false if you want your user to stay on the form after submission
endif; endif;
if ($noException && $successfulResult) : if ($noException && $successfulResult) :
$id = $users->getInsertID(); $id = $users->getInsertID();

View File

@ -30,14 +30,12 @@ class UserModel extends ShieldUserModel
protected $updatedField = 'updated_at'; protected $updatedField = 'updated_at';
protected $deletedField = 'deleted_at'; protected $deletedField = 'deleted_at';
protected $validationRules = [ protected $validationRules = [
"first_name" => "required|trim|max_length[150]", "first_name" => "required|trim|max_length[150]",
"last_name" => "required|trim|max_length[150]", "last_name" => "required|trim|max_length[150]",
'new_pwd' => 'permit_empty|min_length[8]', 'new_pwd' => 'permit_empty|min_length[8]',
'new_pwd_confirm' => 'permit_empty|required_with[new_pwd]|matches[new_pwd]', 'new_pwd_confirm' => 'permit_empty|required_with[new_pwd]|matches[new_pwd]',
"comments" => "permit_empty|trim|max_length[512]", "comments" => "permit_empty|trim|max_length[512]"
'email' => 'required|valid_email|is_unique[auth_identities.secret]',
]; ];
protected $validationMessages = [ protected $validationMessages = [
@ -81,7 +79,16 @@ class UserModel extends ShieldUserModel
// Método para comprobar si el email ya está registrado // Método para comprobar si el email ya está registrado
public function isEmailUnique($email) public function isEmailUnique($email)
{ {
return $this->where('email', $email)->countAllResults() == 0; $builder = $this->db
->table("auth_identities t1") // La tabla correcta
->select("t1.secret AS email")
->where('secret', $email);
// Obtener resultados
$result = $builder->get()->getRow();
// Devuelve true si no se encuentra el correo (es único), false en caso contrario
return $result === null;
} }

View File

@ -20,6 +20,7 @@ class UserModel extends \App\Models\BaseModel
protected $allowedFields = [ protected $allowedFields = [
"username", "username",
"email",
"first_name", "first_name",
"last_name", "last_name",
"client_id", "client_id",

View File

@ -21,7 +21,7 @@
name="save" name="save"
value="<?= lang("Basic.global.Save") ?>" value="<?= lang("Basic.global.Save") ?>"
> >
<?= anchor(route_to("userIndex"), lang("Basic.global.Cancel"), ["class" => "btn btn-secondary"]) ?> <?= anchor(route_to("userList"), lang("Basic.global.Cancel"), ["class" => "btn btn-secondary"]) ?>
</div> </div>
</form> </form>
</div><!-- /.card-body --> </div><!-- /.card-body -->

View File

@ -1,122 +1,59 @@
<?=$this->include('themes/_commonPartialsBs/datatables') ?> <?= $this->include('themes/_commonPartialsBs/datatables') ?>
<?=$this->extend('themes/vuexy/main/defaultlayout') ?> <?= $this->extend('themes/vuexy/main/defaultlayout') ?>
<?=$this->section('content'); ?> <?= $this->section('content'); ?>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="card card-info"> <div class="card card-info">
<div class="card-header"> <div class="card-header">
<h3 class="card-title"><?=lang('Users.userList') ?></h3> <h3 class="card-title"><?= lang('Users.userList') ?></h3>
<?=anchor(route_to('newUser'), lang('Basic.global.addNew').' '.lang('Users.user'), ['class'=>'btn btn-primary float-end']); ?> <?= anchor(route_to('newUser'), lang('Basic.global.addNew') . ' ' . lang('Users.user'), ['class' => 'btn btn-primary float-end']); ?>
</div><!--//.card-header --> </div><!--//.card-header -->
<div class="card-body"> <div class="card-body">
<?= view('themes/_commonPartialsBs/_alertBoxes'); ?> <?= view('themes/_commonPartialsBs/_alertBoxes'); ?>
<table id="tableOfUsers" class="table table-striped table-hover using-data-table" style="width: 100%;"> <table id="tableOfUsers" class="table table-striped table-hover using-data-table"
<thead> style="width: 100%;">
<tr> <thead>
<th><?= lang('Users.firstName') ?></th> <tr>
<th><?= lang('Users.lastName') ?></th> <th><?= lang('Users.firstName') ?></th>
<th><?= lang('Users.email') ?></th> <th><?= lang('Users.lastName') ?></th>
<th><?= lang('Users.lastAccess') ?></th> <th><?= lang('Users.email') ?></th>
<?php /* <th><?= lang('Users.lastAccess') ?></th>
<th><?= lang('Users.mobile') ?></th> <th class="text-nowrap"><?= lang('Basic.global.Action') ?></th>
<th><?= lang('Users.email') ?></th> </tr>
<th><?= lang('Users.address') ?></th> </thead>
<th><?= lang('Users.city') ?></th> <tbody>
<th><?= lang('Users.state') ?></th> <?php foreach ($userList2 as $item) : ?>
<th><?= lang('Users.country') ?></th> <tr>
<th><?= lang('Users.zipCode') ?></th>
<th><?= lang('Users.lastIp') ?></th>
<th><?= lang('Users.picture') ?></th>
<th><?= lang('Users.language') ?></th>
<th><?= lang('Users.blocked') ?></th>
<th><?= lang('Users.emailConfirmed') ?></th>
*/ ?>
<th class="text-nowrap"><?= lang('Basic.global.Action') ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($userList2 as $item ) : ?>
<tr>
<td class="align-middle">
<?= empty($item->first_name) || strlen($item->first_name) < 51 ? esc($item->first_name) : character_limiter(esc($item->first_name), 50) ?>
</td>
<td class="align-middle">
<?= empty($item->last_name) || strlen($item->last_name) < 51 ? esc($item->last_name) : character_limiter(esc($item->last_name), 50) ?>
</td>
<td class="align-middle"> <td class="align-middle">
<?= empty($item->email) ? "" : character_limiter(esc(lang($item->email)), 50) ?> <?= empty($item->first_name) || strlen($item->first_name) < 51 ? esc($item->first_name) : character_limiter(esc($item->first_name), 50) ?>
</td> </td>
<td class="align-middle text-nowrap"> <td class="align-middle">
<?= empty($item->last_active) ? '' : date('d/m/Y H:m:s', strtotime($item->last_active)) ?> <?= empty($item->last_name) || strlen($item->last_name) < 51 ? esc($item->last_name) : character_limiter(esc($item->last_name), 50) ?>
</td>
<td class="align-middle">
<?= empty(auth()->getProvider()->findById($item->id)->email) ? "" : character_limiter(esc(auth()->getProvider()->findById($item->id)->email), 50) ?>
</td>
<td class="align-middle text-nowrap">
<?= empty($item->last_active) ? '' : date('d/m/Y H:m:s', strtotime($item->last_active)) ?>
</td> </td>
<?php /* <td class="align-middle text-center text-nowrap">
<?= anchor(route_to('editUser', $item->id), "<i class='ti ti-pencil ti-sm mx-2'></i>", ['class' => 'text-body', 'data-id' => $item->id,]); ?>
<td class="align-middle"> <?= anchor('#confirm2delete', "<i class='ti ti-trash ti-sm mx-2'></i>", ['class' => 'text-body', 'data-href' => route_to('deleteUser', $item->id), 'data-bs-toggle' => 'modal', 'data-bs-target' => '#confirm2delete']); ?>
<?= empty($user_model->getGroupsTitles($item->token)) || strlen($user_model->getGroupsTitles($item->token)) < 51 ? esc($user_model->getGroupsTitles($item->token)) : character_limiter($user_model->getGroupsTitles($item->token), 50) ?> </td>
</td> </tr>
<td class="align-middle"> <?php endforeach; ?>
<?= empty($item->mobile) || strlen($item->mobile) < 51 ? esc($item->mobile) : character_limiter(esc($item->mobile), 50) ?> </tbody>
</td> </table>
<td class="align-middle"> </div><!--//.card-body -->
<?= esc($item->email) ?> <div class="card-footer">
</td>
<td class="align-middle"> </div><!--//.card-footer -->
<?= empty($item->address) || strlen($item->address) < 51 ? esc($item->address) : character_limiter(esc($item->address), 50) ?> </div><!--//.card -->
</td> </div><!--//.col -->
<td class="align-middle"> </div><!--//.row -->
<?= empty($item->city) || strlen($item->city) < 51 ? esc($item->city) : character_limiter(esc($item->city), 50) ?>
</td>
<td class="align-middle">
<?= empty($item->state) || strlen($item->state) < 51 ? esc($item->state) : character_limiter(esc($item->state), 50) ?>
</td>
<td class="align-middle">
<?= esc($item->country) ?>
</td>
<td class="align-middle">
<?= empty($item->zip_code) || strlen($item->zip_code) < 51 ? esc($item->zip_code) : character_limiter(esc($item->zip_code), 50) ?>
</td>
<td class="align-middle">
<?= empty($item->last_ip) || strlen($item->last_ip) < 51 ? esc($item->last_ip) : character_limiter(esc($item->last_ip), 50) ?>
</td>
<td class="align-middle text-nowrap">
<?= empty($item->last_access) ? '' : date('d/m/Y H:m:s', strtotime($item->last_access)) ?>
</td>
<td class="align-middle">
<?= empty($item->picture) || strlen($item->picture) < 51 ? esc($item->picture) : character_limiter(esc($item->picture), 50) ?>
</td>
<td class="align-middle">
<?= esc($item->language) ?>
</td>
<td class="align-middle text-nowrap">
<?= empty($item->blocked) ? '' : date('d/m/Y H:m:s', strtotime($item->blocked)) ?>
</td>
<td class="align-middle">
<?= esc($item->email_confirmed) ?>
</td>
*/ ?>
<td class="align-middle text-center text-nowrap"> <?= $this->endSection() ?>
<?=anchor(route_to('editUser', $item->id), "<i class='ti ti-pencil ti-sm mx-2'></i>", ['class'=>'text-body', 'data-id'=>$item->id,]); ?>
<?=anchor('#confirm2delete', "<i class='ti ti-trash ti-sm mx-2'></i>", ['class'=>'text-body', 'data-href'=>route_to('deleteUser', $item->id), 'data-bs-toggle'=>'modal', 'data-bs-target'=>'#confirm2delete']); ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div><!--//.card-body -->
<div class="card-footer">
</div><!--//.card-footer -->
</div><!--//.card -->
</div><!--//.col -->
</div><!--//.row -->
<?=$this->endSection() ?>

90
ci4/composer.lock generated
View File

@ -438,33 +438,33 @@
}, },
{ {
"name": "laminas/laminas-escaper", "name": "laminas/laminas-escaper",
"version": "2.13.0", "version": "2.14.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laminas/laminas-escaper.git", "url": "https://github.com/laminas/laminas-escaper.git",
"reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba" "reference": "0f7cb975f4443cf22f33408925c231225cfba8cb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/af459883f4018d0f8a0c69c7a209daef3bf973ba", "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/0f7cb975f4443cf22f33408925c231225cfba8cb",
"reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba", "reference": "0f7cb975f4443cf22f33408925c231225cfba8cb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-ctype": "*", "ext-ctype": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"php": "~8.1.0 || ~8.2.0 || ~8.3.0" "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
}, },
"conflict": { "conflict": {
"zendframework/zend-escaper": "*" "zendframework/zend-escaper": "*"
}, },
"require-dev": { "require-dev": {
"infection/infection": "^0.27.0", "infection/infection": "^0.27.9",
"laminas/laminas-coding-standard": "~2.5.0", "laminas/laminas-coding-standard": "~3.0.0",
"maglnet/composer-require-checker": "^3.8.0", "maglnet/composer-require-checker": "^3.8.0",
"phpunit/phpunit": "^9.6.7", "phpunit/phpunit": "^9.6.16",
"psalm/plugin-phpunit": "^0.18.4", "psalm/plugin-phpunit": "^0.19.0",
"vimeo/psalm": "^5.9" "vimeo/psalm": "^5.21.1"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -496,7 +496,7 @@
"type": "community_bridge" "type": "community_bridge"
} }
], ],
"time": "2023-10-10T08:35:13+00:00" "time": "2024-10-24T10:12:53+00:00"
}, },
{ {
"name": "masterminds/html5", "name": "masterminds/html5",
@ -986,24 +986,24 @@
}, },
{ {
"name": "sabberworm/php-css-parser", "name": "sabberworm/php-css-parser",
"version": "v8.6.0", "version": "v8.7.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git",
"reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70" "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/d2fb94a9641be84d79c7548c6d39bbebba6e9a70", "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/f414ff953002a9b18e3a116f5e462c56f21237cf",
"reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70", "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-iconv": "*", "ext-iconv": "*",
"php": ">=5.6.20" "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^5.7.27" "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.40"
}, },
"suggest": { "suggest": {
"ext-mbstring": "for parsing UTF-8 CSS" "ext-mbstring": "for parsing UTF-8 CSS"
@ -1045,9 +1045,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues",
"source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.6.0" "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.7.0"
}, },
"time": "2024-07-01T07:33:21+00:00" "time": "2024-10-27T17:38:32+00:00"
} }
], ],
"packages-dev": [ "packages-dev": [
@ -1123,16 +1123,16 @@
}, },
{ {
"name": "fakerphp/faker", "name": "fakerphp/faker",
"version": "v1.23.1", "version": "v1.24.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/FakerPHP/Faker.git", "url": "https://github.com/FakerPHP/Faker.git",
"reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" "reference": "a136842a532bac9ecd8a1c723852b09915d7db50"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/a136842a532bac9ecd8a1c723852b09915d7db50",
"reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", "reference": "a136842a532bac9ecd8a1c723852b09915d7db50",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1180,9 +1180,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/FakerPHP/Faker/issues", "issues": "https://github.com/FakerPHP/Faker/issues",
"source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" "source": "https://github.com/FakerPHP/Faker/tree/v1.24.0"
}, },
"time": "2024-01-02T13:46:09+00:00" "time": "2024-11-07T15:11:20+00:00"
}, },
{ {
"name": "mikey179/vfsstream", "name": "mikey179/vfsstream",
@ -1238,16 +1238,16 @@
}, },
{ {
"name": "myclabs/deep-copy", "name": "myclabs/deep-copy",
"version": "1.12.0", "version": "1.12.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/myclabs/DeepCopy.git", "url": "https://github.com/myclabs/DeepCopy.git",
"reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
"reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1286,7 +1286,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/myclabs/DeepCopy/issues", "issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1"
}, },
"funding": [ "funding": [
{ {
@ -1294,20 +1294,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-06-12T14:39:25+00:00" "time": "2024-11-08T17:47:46+00:00"
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
"version": "v5.2.0", "version": "v5.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nikic/PHP-Parser.git", "url": "https://github.com/nikic/PHP-Parser.git",
"reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb" "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b",
"reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb", "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1350,9 +1350,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/nikic/PHP-Parser/issues", "issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v5.2.0" "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1"
}, },
"time": "2024-09-15T16:40:33+00:00" "time": "2024-10-08T18:51:32+00:00"
}, },
{ {
"name": "phar-io/manifest", "name": "phar-io/manifest",
@ -1793,16 +1793,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "9.6.20", "version": "9.6.21",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "49d7820565836236411f5dc002d16dd689cde42f" "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/49d7820565836236411f5dc002d16dd689cde42f", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa",
"reference": "49d7820565836236411f5dc002d16dd689cde42f", "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1817,7 +1817,7 @@
"phar-io/manifest": "^2.0.4", "phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1", "phar-io/version": "^3.2.1",
"php": ">=7.3", "php": ">=7.3",
"phpunit/php-code-coverage": "^9.2.31", "phpunit/php-code-coverage": "^9.2.32",
"phpunit/php-file-iterator": "^3.0.6", "phpunit/php-file-iterator": "^3.0.6",
"phpunit/php-invoker": "^3.1.1", "phpunit/php-invoker": "^3.1.1",
"phpunit/php-text-template": "^2.0.4", "phpunit/php-text-template": "^2.0.4",
@ -1876,7 +1876,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.20" "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21"
}, },
"funding": [ "funding": [
{ {
@ -1892,7 +1892,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-07-10T11:45:39+00:00" "time": "2024-09-19T10:50:18+00:00"
}, },
{ {
"name": "psr/container", "name": "psr/container",
@ -3037,5 +3037,5 @@
"php": "^8.2" "php": "^8.2"
}, },
"platform-dev": [], "platform-dev": [],
"plugin-api-version": "2.6.0" "plugin-api-version": "2.3.0"
} }