codeigniter4 / codeigniter4/shield
Bug: Assigning null to ?array $identities property without proper handling
- Lenguaje dominante
- PHP
- Estrellas
- 427
- Forks
- 144
- Merge medio
- 9 h 19 min
- PR fusionados (30 d)
- 6
Descripción
### PHP Version
8.2.7
### CodeIgniter4 Version
4.6.3
### Shield Version
1.2.0
### Which operating systems have you tested for this bug?
Windows
### Which server did you use?
cli-server (PHP built-in webserver)
### Database
mysqlite(memory unittest)
### Did you customize Shield?
yes:
```php
class User extends \CodeIgniter\Shield\Entities\User
.
.
.
public function saveUsernameIdentity(): bool
{
if (empty($this->username) && empty($this->password) && empty($this->password_hash)) {
return true;
}
/** @var UserIdentityModel $identityModel */
$identityModel = model(UserIdentityModel::class);
$identity = $this->getIdentity('username_password');
if ($identity === null && !empty($this->username)) {
$this->identities = null;
$this->createUsernameIdentity( [
'username' => $this->username,
'password' => '',
]);
$identity = $this->getUsernameIdentity();
}
if ($identity !== null) {
if (!empty($this->username)) {
$identity->secret = $this->username;
}
if (!empty($this->password)) {
$identity->secret2 = service('passwords')->hash($this->password);
}
if (!empty($this->password_hash) && empty($this->password)) {
$identity->secret2 = $this->password_hash;
}
try {
$identityModel->save($identity);
} catch (\CodeIgniter\Database\Exceptions\DataException $e) {
$messages = [
lang('Database.emptyDataset', ['insert']),
lang('Database.emptyDataset', ['update']),
];
if (in_array($e->getMessage(), $messages, true)) {
return true;
}
throw $e;
}
}
return true;
}
```
### What happened?
the `$identities` property is correctly declared as nullable array:
https://github.com/codeigniter4/shield/blob/d07c0f9442dd0712b3fa39bfba677838ff1b8e26/src/Entities/User.php#L50
However, in several places, we directly assign null like these:
https://github.com/codeigniter4/shield/blob/d07c0f9442dd0712b3fa39bfba677838ff1b8e26/src/Entities/User.php#L130
https://github.com/codeigniter4/shield/blob/d07c0f9442dd0712b3fa39bfba677838ff1b8e26/src/Entities/User.php#L149
TypeError: CodeIgniter\Shield\Entities\User::setIdentities(): Argument 1 ($identities) must be of type array, null given,
### Steps to Reproduce
try to reload all identities
### Expected Output
reload identities without error
### Anything else?
_No response_
Guía de contribución
Línea de trabajo
Empieza en src/Entities/User.php, especialmente en la declaración nullable de $identities cerca de la línea 50 y en las asignaciones alrededor de las líneas 130 y 149. Reproduce el problema recargando todas las identidades y, después, inspecciona la ruta del setter que provoca el TypeError. La tarea está terminada cuando las identidades se recargan sin el error relacionado con null.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- php
- Área
- authentication
- Tipo de issue
- Error
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 52/100