Skip to content

Commit 258f372

Browse files
NeoRazorXclaude
andcommitted
Validar formData en AjaxForms antes de aplicarlo
json_decode devuelve null si el POST llega truncado (post_max_size, max_input_vars) y provocaba un TypeError en los apply(). Ahora las acciones de guardado rechazan con invalid-request y las de solo lectura usan un array vacío. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent b000757 commit 258f372

2 files changed

Lines changed: 25 additions & 4 deletions

File tree

Core/Lib/AjaxForms/PurchasesController.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ protected function findProductAction(): bool
294294
{
295295
$this->setTemplate(false);
296296
$model = $this->getModel();
297-
$formData = json_decode($this->request->input('data'), true);
297+
$formData = json_decode($this->request->input('data'), true) ?? [];
298298
PurchasesHeaderHTML::apply($model, $formData);
299299
PurchasesFooterHTML::apply($model, $formData);
300300
PurchasesModalHTML::apply($model, $formData);
@@ -364,7 +364,7 @@ protected function recalculateAction(bool $renderLines): bool
364364
$this->setTemplate(false);
365365
$model = $this->getModel();
366366
$lines = $model->getLines();
367-
$formData = json_decode($this->request->input('data'), true);
367+
$formData = json_decode($this->request->input('data'), true) ?? [];
368368
PurchasesHeaderHTML::apply($model, $formData);
369369
PurchasesFooterHTML::apply($model, $formData);
370370
PurchasesLineHTML::apply($model, $lines, $formData);
@@ -393,7 +393,15 @@ protected function saveDocAction(bool $sendOk = true): bool
393393
}
394394

395395
$model = $this->getModel();
396+
397+
// si los datos del formulario no llegan o no son JSON válido (petición truncada,
398+
// límites post_max_size / max_input_vars), rechazamos en lugar de guardar en blanco
396399
$formData = json_decode($this->request->input('data'), true);
400+
if (false === is_array($formData)) {
401+
Tools::log()->warning('invalid-request');
402+
$this->sendJsonWithLogs(['ok' => false]);
403+
return false;
404+
}
397405

398406
// bloqueo optimista: si el estado del documento ha cambiado desde que se cargó el formulario,
399407
// rechazamos para no borrar líneas a partir de un formulario obsoleto (tarea 4673)

Core/Lib/AjaxForms/SalesController.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ protected function findProductAction(): bool
310310
{
311311
$this->setTemplate(false);
312312
$model = $this->getModel();
313-
$formData = json_decode($this->request->input('data'), true);
313+
$formData = json_decode($this->request->input('data'), true) ?? [];
314314
SalesHeaderHTML::apply($model, $formData);
315315
SalesFooterHTML::apply($model, $formData);
316316
SalesModalHTML::apply($model, $formData);
@@ -380,7 +380,7 @@ protected function recalculateAction(bool $renderLines): bool
380380
$this->setTemplate(false);
381381
$model = $this->getModel();
382382
$lines = $model->getLines();
383-
$formData = json_decode($this->request->input('data'), true);
383+
$formData = json_decode($this->request->input('data'), true) ?? [];
384384
SalesHeaderHTML::apply($model, $formData);
385385
SalesFooterHTML::apply($model, $formData);
386386
SalesLineHTML::apply($model, $lines, $formData);
@@ -409,7 +409,15 @@ protected function saveDocAction(bool $sendOk = true): bool
409409
}
410410

411411
$model = $this->getModel();
412+
413+
// si los datos del formulario no llegan o no son JSON válido (petición truncada,
414+
// límites post_max_size / max_input_vars), rechazamos en lugar de guardar en blanco
412415
$formData = json_decode($this->request->input('data'), true);
416+
if (false === is_array($formData)) {
417+
Tools::log()->warning('invalid-request');
418+
$this->sendJsonWithLogs(['ok' => false]);
419+
return false;
420+
}
413421

414422
// bloqueo optimista: si el estado del documento ha cambiado desde que se cargó el formulario,
415423
// rechazamos para no borrar líneas a partir de un formulario obsoleto (tarea 4673)
@@ -486,6 +494,11 @@ protected function savePaidAction(): bool
486494
// cargamos el modelo actualizado y los datos del form
487495
$model = $this->getModel();
488496
$formData = json_decode($this->request->input('data'), true);
497+
if (false === is_array($formData)) {
498+
Tools::log()->warning('invalid-request');
499+
$this->sendJsonWithLogs(['ok' => false]);
500+
return false;
501+
}
489502

490503
// si la factura es de 0 €, la marcamos como pagada
491504
if (empty($model->total) && $model->hasColumn('pagada')) {

0 commit comments

Comments
 (0)