From 08f347cd57ea452deba4482a5664a5fe41b93dfc Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 24 Oct 2020 16:49:05 +0200 Subject: [PATCH] Fix bad array validation. --- .../V1/Requests/TransactionStoreRequest.php | 4 ++++ app/Validation/TransactionValidation.php | 19 +++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/app/Api/V1/Requests/TransactionStoreRequest.php b/app/Api/V1/Requests/TransactionStoreRequest.php index 5f57465c5e..ef9e05eac3 100644 --- a/app/Api/V1/Requests/TransactionStoreRequest.php +++ b/app/Api/V1/Requests/TransactionStoreRequest.php @@ -275,6 +275,10 @@ class TransactionStoreRequest extends FormRequest { $validator->after( function (Validator $validator) { + + // must be valid array. + $this->validateTransactionArray($validator); + // must submit at least one transaction. $this->validateOneTransaction($validator); diff --git a/app/Validation/TransactionValidation.php b/app/Validation/TransactionValidation.php index 5d9e2c7eab..691482df2d 100644 --- a/app/Validation/TransactionValidation.php +++ b/app/Validation/TransactionValidation.php @@ -53,6 +53,9 @@ trait TransactionValidation * @var array $transaction */ foreach ($transactions as $index => $transaction) { + if(!is_int($index)) { + continue; + } $this->validateSingleAccount($validator, $index, $transactionType, $transaction); } } @@ -178,6 +181,20 @@ trait TransactionValidation } } + /** + * @param Validator $validator + */ + public function validateTransactionArray(Validator $validator): void { + $transactions = $this->getTransactionsArray($validator); + foreach($transactions as $key => $value) { + if(!is_int($key)) { + $validator->errors()->add('transactions.0.description', (string) trans('validation.at_least_one_transaction')); + Log::debug('Added error: at_least_one_transaction.'); + return; + } + } + } + /** * Adds an error to the validator when there are no transactions in the array of data. * @@ -235,8 +252,6 @@ trait TransactionValidation foreach ($transactions as $transaction) { $originalType = $this->getOriginalType((int) ($transaction['transaction_journal_id'] ?? 0)); // if type is not set, fall back to the type of the journal, if one is given. - - $types[] = $transaction['type'] ?? $originalType; } $unique = array_unique($types);