From cd7ddd1c61dd9c98471bb28e1de1ce0f5f0af024 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 18 May 2024 06:42:09 +0200 Subject: [PATCH] Add more IBAN filters --- app/Api/V1/Requests/Models/Account/StoreRequest.php | 2 +- app/Api/V1/Requests/Models/Account/UpdateRequest.php | 2 +- .../V1/Requests/Models/Transaction/StoreRequest.php | 4 ++-- app/Http/Requests/AccountFormRequest.php | 2 +- app/Repositories/Account/AccountRepository.php | 2 ++ .../UserGroups/Account/AccountRepository.php | 2 ++ app/Rules/UniqueIban.php | 5 +++++ app/Support/Request/ConvertsDataTypes.php | 12 ++++++++++++ app/Support/Steam.php | 4 +++- app/Validation/FireflyValidator.php | 1 + 10 files changed, 30 insertions(+), 6 deletions(-) diff --git a/app/Api/V1/Requests/Models/Account/StoreRequest.php b/app/Api/V1/Requests/Models/Account/StoreRequest.php index c78184381d..3d04bb7cee 100644 --- a/app/Api/V1/Requests/Models/Account/StoreRequest.php +++ b/app/Api/V1/Requests/Models/Account/StoreRequest.php @@ -63,7 +63,7 @@ class StoreRequest extends FormRequest 'order' => $this->convertInteger('order'), 'currency_code' => $this->convertString('currency_code'), 'virtual_balance' => $this->convertString('virtual_balance'), - 'iban' => $this->convertString('iban'), + 'iban' => $this->convertIban('iban'), 'BIC' => $this->convertString('bic'), 'account_number' => $this->convertString('account_number'), 'account_role' => $this->convertString('account_role'), diff --git a/app/Api/V1/Requests/Models/Account/UpdateRequest.php b/app/Api/V1/Requests/Models/Account/UpdateRequest.php index 5ea693c645..ec219e3938 100644 --- a/app/Api/V1/Requests/Models/Account/UpdateRequest.php +++ b/app/Api/V1/Requests/Models/Account/UpdateRequest.php @@ -51,7 +51,7 @@ class UpdateRequest extends FormRequest 'include_net_worth' => ['include_net_worth', 'boolean'], 'account_type_name' => ['type', 'convertString'], 'virtual_balance' => ['virtual_balance', 'convertString'], - 'iban' => ['iban', 'convertString'], + 'iban' => ['iban', 'convertIban'], 'BIC' => ['bic', 'convertString'], 'account_number' => ['account_number', 'convertString'], 'account_role' => ['account_role', 'convertString'], diff --git a/app/Api/V1/Requests/Models/Transaction/StoreRequest.php b/app/Api/V1/Requests/Models/Transaction/StoreRequest.php index 7910be0d16..74ff54ff12 100644 --- a/app/Api/V1/Requests/Models/Transaction/StoreRequest.php +++ b/app/Api/V1/Requests/Models/Transaction/StoreRequest.php @@ -103,14 +103,14 @@ class StoreRequest extends FormRequest // source of transaction. If everything is null, assume cash account. 'source_id' => $this->integerFromValue((string)$object['source_id']), 'source_name' => $this->clearString((string)$object['source_name']), - 'source_iban' => $this->clearString((string)$object['source_iban']), + 'source_iban' => $this->clearIban((string)$object['source_iban']), 'source_number' => $this->clearString((string)$object['source_number']), 'source_bic' => $this->clearString((string)$object['source_bic']), // destination of transaction. If everything is null, assume cash account. 'destination_id' => $this->integerFromValue((string)$object['destination_id']), 'destination_name' => $this->clearString((string)$object['destination_name']), - 'destination_iban' => $this->clearString((string)$object['destination_iban']), + 'destination_iban' => $this->clearIban((string)$object['destination_iban']), 'destination_number' => $this->clearString((string)$object['destination_number']), 'destination_bic' => $this->clearString((string)$object['destination_bic']), diff --git a/app/Http/Requests/AccountFormRequest.php b/app/Http/Requests/AccountFormRequest.php index e9b4f06206..fba3a9c101 100644 --- a/app/Http/Requests/AccountFormRequest.php +++ b/app/Http/Requests/AccountFormRequest.php @@ -57,7 +57,7 @@ class AccountFormRequest extends FormRequest 'account_type_name' => $this->convertString('objectType'), 'currency_id' => $this->convertInteger('currency_id'), 'virtual_balance' => $this->convertString('virtual_balance'), - 'iban' => $this->convertString('iban'), + 'iban' => $this->convertIban('iban'), 'BIC' => $this->convertString('BIC'), 'account_number' => $this->convertString('account_number'), 'account_role' => $this->convertString('account_role'), diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index 90ea3ceaf5..49033bb168 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -37,6 +37,7 @@ use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Services\Internal\Destroy\AccountDestroyService; use FireflyIII\Services\Internal\Update\AccountUpdateService; +use FireflyIII\Support\Facades\Steam; use FireflyIII\User; use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; @@ -123,6 +124,7 @@ class AccountRepository implements AccountRepositoryInterface public function findByIbanNull(string $iban, array $types): ?Account { + $iban = Steam::filterSpaces($iban); $query = $this->user->accounts()->where('iban', '!=', '')->whereNotNull('iban'); if (0 !== count($types)) { diff --git a/app/Repositories/UserGroups/Account/AccountRepository.php b/app/Repositories/UserGroups/Account/AccountRepository.php index 3494cad207..bb4072dec0 100644 --- a/app/Repositories/UserGroups/Account/AccountRepository.php +++ b/app/Repositories/UserGroups/Account/AccountRepository.php @@ -31,6 +31,7 @@ use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Services\Internal\Update\AccountUpdateService; +use FireflyIII\Support\Facades\Steam; use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Support\Collection; @@ -80,6 +81,7 @@ class AccountRepository implements AccountRepositoryInterface public function findByIbanNull(string $iban, array $types): ?Account { + $iban = Steam::filterSpaces($iban); $query = $this->userGroup->accounts()->where('iban', '!=', '')->whereNotNull('iban'); if (0 !== count($types)) { diff --git a/app/Rules/UniqueIban.php b/app/Rules/UniqueIban.php index 3bc00be090..1124749cdd 100644 --- a/app/Rules/UniqueIban.php +++ b/app/Rules/UniqueIban.php @@ -25,6 +25,7 @@ namespace FireflyIII\Rules; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; +use FireflyIII\Support\Facades\Steam; use Illuminate\Contracts\Validation\ValidationRule; /** @@ -95,6 +96,10 @@ class UniqueIban implements ValidationRule $maxCounts = $this->getMaxOccurrences(); foreach ($maxCounts as $type => $max) { + + // make sure to trim the value of $value so all spaces are removed. + $value = Steam::filterSpaces($value); + $count = $this->countHits($type, $value); app('log')->debug(sprintf('Count for "%s" and IBAN "%s" is %d', $type, $value, $count)); if ($count > $max) { diff --git a/app/Support/Request/ConvertsDataTypes.php b/app/Support/Request/ConvertsDataTypes.php index 74c7a3d544..a7600f75fe 100644 --- a/app/Support/Request/ConvertsDataTypes.php +++ b/app/Support/Request/ConvertsDataTypes.php @@ -27,6 +27,7 @@ use Carbon\Carbon; use Carbon\Exceptions\InvalidDateException; use Carbon\Exceptions\InvalidFormatException; use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface; +use FireflyIII\Support\Facades\Steam; use Illuminate\Support\Collection; /** @@ -114,6 +115,11 @@ trait ConvertsDataTypes return (string)$this->clearString((string)$entry); } + public function convertIban(string $field): string + { + return Steam::filterSpaces($this->convertString($field)); + } + public function clearString(?string $string): ?string { $string = $this->clearStringKeepNewlines($string); @@ -131,6 +137,12 @@ trait ConvertsDataTypes return trim($string); } + public function clearIban(?string $string): ?string + { + $string = $this->clearString($string); + return Steam::filterSpaces($string); + } + public function clearStringKeepNewlines(?string $string): ?string { if (null === $string) { diff --git a/app/Support/Steam.php b/app/Support/Steam.php index bc789390fd..2f545782b3 100644 --- a/app/Support/Steam.php +++ b/app/Support/Steam.php @@ -681,11 +681,13 @@ class Steam "\u{202F}", // narrow no-break space "\u{3000}", // ideographic space "\u{FEFF}", // zero width no -break space - "\x20", // plain old normal space + "\x20", // plain old normal space, + ' ' ]; // clear zalgo text $string = preg_replace('/(\pM{2})\pM+/u', '\1', $string); + $string = preg_replace('/\s+/', '', $string); return str_replace($search, '', $string); } diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index f527b4a376..0ed6e8311d 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -170,6 +170,7 @@ class FireflyValidator extends Validator "\u{202F}", // narrow no-break space "\u{3000}", // ideographic space "\u{FEFF}", // zero width no -break space + ' ', '-', '?', ];