codeigniter4 / codeigniter4/shield

Bug: Assigning null to ?array $identities property without proper handling

Abierto
#1,302 4 comentarios 0 reacciones 0 asignados Ver en GitHub
bug
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

Abrir la 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

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.