Compare commits

...

10 Commits

Author SHA1 Message Date
github-actions[bot]
9ad5dfd45b Merge pull request #11950 from firefly-iii/release-1773557001
🤖 Automatically merge the PR into the develop branch.
2026-03-15 07:43:27 +01:00
JC5
9e3b8e6232 🤖 Auto commit for release 'develop' on 2026-03-15 2026-03-15 07:43:21 +01:00
James Cole
34b5d9fcf6 Update changelog. 2026-03-15 07:37:41 +01:00
James Cole
12bbc91dca Some minor code cleanup. 2026-03-15 06:48:11 +01:00
James Cole
a77ff6a51f Expand changelog with fixed issues. 2026-03-14 20:44:58 +01:00
James Cole
62eb054c7f Fix class/id value. 2026-03-14 20:31:16 +01:00
James Cole
13536a2f65 Clean up some phpstan issues. 2026-03-14 20:26:38 +01:00
github-actions[bot]
19dece287e Merge pull request #11949 from firefly-iii/release-1773489415
🤖 Automatically merge the PR into the develop branch.
2026-03-14 12:57:02 +01:00
JC5
897e1f773e 🤖 Auto commit for release 'develop' on 2026-03-14 2026-03-14 12:56:55 +01:00
James Cole
5788e18d6d Fix inline CSS. 2026-03-14 12:39:33 +01:00
21 changed files with 59 additions and 40 deletions

View File

@@ -28,7 +28,7 @@ use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Contracts\Validation\Validator;
use FireflyIII\Validation\FireflyValidator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Log;
@@ -69,9 +69,9 @@ class ChartRequest extends FormRequest
];
}
public function withValidator(Validator $validator): void
public function withValidator(FireflyValidator $validator): void
{
$validator->after(static function (Validator $validator): void {
$validator->after(static function (FireflyValidator $validator): void {
// validate transaction query data.
$data = $validator->getData();
if (!array_key_exists('accounts', $data)) {

View File

@@ -27,7 +27,7 @@ namespace FireflyIII\Api\V1\Requests\Data\Bulk;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Contracts\Validation\Validator;
use FireflyIII\Validation\FireflyValidator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Log;
@@ -61,9 +61,9 @@ class MoveTransactionsRequest extends FormRequest
* Configure the validator instance with special rules for after the basic validation rules.
* TODO this is duplicate.
*/
public function withValidator(Validator $validator): void
public function withValidator(FireflyValidator $validator): void
{
$validator->after(function (Validator $validator): void {
$validator->after(function (FireflyValidator $validator): void {
// validate start before end only if both are there.
$data = $validator->getData();
if (array_key_exists('original_account', $data) && array_key_exists('destination_account', $data)) {
@@ -75,7 +75,7 @@ class MoveTransactionsRequest extends FormRequest
}
}
private function validateMove(Validator $validator): void
private function validateMove(FireflyValidator $validator): void
{
$data = $validator->getData();
$repository = app(AccountRepositoryInterface::class);

View File

@@ -33,7 +33,7 @@ use FireflyIII\Rules\UniqueIban;
use FireflyIII\Support\Request\AppendsLocationData;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Contracts\Validation\Validator;
use FireflyIII\Validation\FireflyValidator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Log;
@@ -121,9 +121,9 @@ class UpdateRequest extends FormRequest
/**
* Configure the validator instance with special rules for after the basic validation rules.
*/
public function withValidator(Validator $validator): void
public function withValidator(FireflyValidator $validator): void
{
$validator->after(function (Validator $validator): void {
$validator->after(function (FireflyValidator $validator): void {
// validate start before end only if both are there.
$data = $validator->getData();

View File

@@ -25,7 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V1\Requests\Models\TransactionCurrency;
use FireflyIII\Api\V1\Requests\ApiRequest;
use Illuminate\Contracts\Validation\Validator;
use FireflyIII\Validation\FireflyValidator;
class CurrencyCodeRequest extends ApiRequest
{
@@ -34,10 +34,10 @@ class CurrencyCodeRequest extends ApiRequest
return ['code' => sprintf('exists:transaction_currencies,code|%s', $this->required)];
}
public function withValidator(Validator $validator): void
public function withValidator(FireflyValidator $validator): void
{
$validator->after(function (Validator $validator): void {
if (!$validator->valid()) {
$validator->after(function (FireflyValidator $validator): void {
if (0 === count($validator->valid())) {
return;
}
$code = $this->convertString('code', '');

View File

@@ -99,6 +99,7 @@ abstract class Controller extends BaseController
$logoutUrl = config('firefly.custom_logout_url');
// overrule v2 layout back to v1.
if ('true' === request()->get('force_default_layout') && 'v2' === config('view.layout')) {
// config('view.layout','v1');
Config::set('view.layout', 'v1');

View File

@@ -59,7 +59,7 @@ class SecureHeaders
"object-src 'none'",
sprintf("script-src 'unsafe-eval' 'strict-dynamic' 'nonce-%1s'", $nonce),
// sprintf("style-src 'self' 'nonce-%1s'", $nonce), // safe variant
"style-src 'self' 'unsafe-eval'", // unsafe variant
"style-src 'self' 'unsafe-inline'", // unsafe variant
"base-uri 'self'",
"form-action 'self'",
"font-src 'self' data:",

View File

@@ -31,6 +31,9 @@ use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
* @property User $user
*/
class GroupMembership extends Model
{
use ReturnsIntegerIdTrait;

View File

@@ -32,6 +32,9 @@ use Illuminate\Database\Eloquent\SoftDeletes;
use function Safe\json_decode;
use function Safe\json_encode;
/**
* @property TransactionJournal $transactionJournal
*/
class TransactionJournalMeta extends Model
{
use ReturnsIntegerIdTrait;

View File

@@ -27,6 +27,8 @@ use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Attachment;
use FireflyIII\Models\UserGroup;
use FireflyIII\User;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Support\Collection;
/**
@@ -37,6 +39,7 @@ use Illuminate\Support\Collection;
* @method getUser()
* @method checkUserGroupAccess(UserRoleEnum $role)
* @method setUserGroupById(int $userGroupId)
* @method setUser(null|Authenticatable|User $user)
*/
interface AttachmentRepositoryInterface
{

View File

@@ -25,7 +25,10 @@ declare(strict_types=1);
namespace FireflyIII\Repositories\PeriodStatistic;
use Carbon\Carbon;
use FireflyIII\Models\Account;
use FireflyIII\Models\Category;
use FireflyIII\Models\PeriodStatistic;
use FireflyIII\Models\Tag;
use FireflyIII\Support\Repositories\UserGroup\UserGroupInterface;
use FireflyIII\Support\Repositories\UserGroup\UserGroupTrait;
use Illuminate\Database\Eloquent\Builder;
@@ -38,7 +41,7 @@ class PeriodStatisticRepository implements PeriodStatisticRepositoryInterface, U
{
use UserGroupTrait;
public function allInRangeForModel(Model $model, Carbon $start, Carbon $end): Collection
public function allInRangeForModel(Account|Category|Tag $model, Carbon $start, Carbon $end): Collection
{
return $model->primaryPeriodStatistics()->where('start', '>=', $start)->where('end', '<=', $end)->get();
}

View File

@@ -25,13 +25,16 @@ declare(strict_types=1);
namespace FireflyIII\Repositories\PeriodStatistic;
use Carbon\Carbon;
use FireflyIII\Models\Account;
use FireflyIII\Models\Category;
use FireflyIII\Models\PeriodStatistic;
use FireflyIII\Models\Tag;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
interface PeriodStatisticRepositoryInterface
{
public function allInRangeForModel(Model $model, Carbon $start, Carbon $end): Collection;
public function allInRangeForModel(Account|Category|Tag $model, Carbon $start, Carbon $end): Collection;
public function allInRangeForPrefix(string $prefix, Carbon $start, Carbon $end): Collection;
@@ -41,6 +44,8 @@ interface PeriodStatisticRepositoryInterface
public function deleteStatisticsForPrefix(string $prefix, Collection $dates): void;
public function deleteStatisticsForType(string $class, Collection $objects, Collection $dates): void;
public function findPeriodStatistic(Model $model, Carbon $start, Carbon $end, string $type): Collection;
public function findPeriodStatistics(Model $model, Carbon $start, Carbon $end, array $types): Collection;

View File

@@ -111,6 +111,8 @@ trait UserNavigation
return redirect(route('index'));
}
/** @var TransactionJournal $journal */
$journal = $transaction->transactionJournal;
/** @var null|Transaction $other */

View File

@@ -27,8 +27,10 @@ namespace FireflyIII\Support\Request;
use Carbon\Carbon;
use Carbon\Exceptions\InvalidDateException;
use Carbon\Exceptions\InvalidFormatException;
use FireflyIII\Models\UserGroup;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Facades\Steam;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
@@ -36,6 +38,8 @@ use function Safe\preg_replace;
/**
* Trait ConvertsDataTypes
*
* @method UserGroup validateUserGroup(Request $request)
*/
trait ConvertsDataTypes
{

View File

@@ -106,9 +106,6 @@ class User extends Authenticatable
throw new NotFoundHttpException();
}
/**
* Link to accounts.
*/
public function accounts(): HasMany
{
return $this->hasMany(Account::class);

View File

@@ -16,7 +16,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
- Lots of code cleanup and small quality issues fixed.
### Fixed
- [Issue 11803](https://github.com/firefly-iii/firefly-iii/issues/11803) (Monthly Left budget not correct) reported by @fabienfitoussi
- [Issue 11641](https://github.com/firefly-iii/firefly-iii/issues/11641) (Annual budget “Remaining” resets in subsequent months) reported by @maxwell5555
- [Discussion 11879](https://github.com/orgs/firefly-iii/discussions/11879) (Searching for accounts should include inactive accounts?) started by @b-ryan
- [Issue 11916](https://github.com/firefly-iii/firefly-iii/issues/11916) (Balance is not recalculated when multiple transactions are selected and then deleted) reported by @elp3dr0
- [Discussion 11936](https://github.com/orgs/firefly-iii/discussions/11936) (Links in emails don't link to correct domain) started by @SamLMB
@@ -24,17 +25,14 @@ This project adheres to [Semantic Versioning](http://semver.org/).
### Security
- Credits go to Igor for finding some interesting issues in Firefly III. They have been fixed.
> [!NOTE]
> A lot of people have access to the new Claude model that has enhanced code scanning capabilities. Many new issues are being reported through (semi-)automated means. I will update the security policy to reflect this. The following security related issues no longer need reporting:
> As AI-code scanning tools like Claude and Co-Pilot get more advanced, many (new) issues are being reported through (semi-)automated means. I have updated [the security policy](https://github.com/firefly-iii/firefly-iii/security/policy) to reflect my stance on this. The following security related issues no longer need reporting:
- It is possible to point webhooks to private or internal IPs.
- You can see all transaction link types. If you are an owner, you can also delete them.
- You can see all transaction link types.
- `unsafe-inline` is allowed for CSS, which means you can overrule the layout if you manage to get CSS on the page.
- You can make the rule engine print internal enums.
### API
- Initial release.
## v6.5.4 - 2026-03-06

View File

@@ -78,8 +78,8 @@ return [
'running_balance_column' => (bool)envDefaultWhenEmpty(env('USE_RUNNING_BALANCE'), true), // this is only the default value, is not used.
// see cer.php for exchange rates feature flag.
],
'version' => 'develop/2026-03-14',
'build_time' => 1773486518,
'version' => 'develop/2026-03-15',
'build_time' => 1773556820,
'api_version' => '2.1.0', // field is no longer used.
'db_version' => 28, // field is no longer used.

12
package-lock.json generated
View File

@@ -4135,9 +4135,9 @@
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
"version": "2.10.7",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.7.tgz",
"integrity": "sha512-1ghYO3HnxGec0TCGBXiDLVns4eCSx4zJpxnHrlqFQajmhfKMQBzUGDdkMK7fUW7PTHTeLf+j87aTuKuuwWzMGw==",
"version": "2.10.8",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz",
"integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -4587,9 +4587,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001778",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001778.tgz",
"integrity": "sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==",
"version": "1.0.30001779",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001779.tgz",
"integrity": "sha512-U5og2PN7V4DMgF50YPNtnZJGWVLFjjsN3zb6uMT5VGYIewieDj1upwfuVNXf4Kor+89c3iCRJnSzMD5LmTvsfA==",
"dev": true,
"funding": [
{

View File

@@ -653,7 +653,7 @@ export default {
// console.log('Upload complete!');
return true;
}).catch(error => {
console.error('Could not upload');
console.error('[b] Could not upload');
console.error(error);
// console.log('Uploaded attachment #' + key);
uploads++;

View File

@@ -964,7 +964,7 @@ export default {
// console.log('Upload complete!');
return true;
}).catch(error => {
console.error('Could not upload file.');
console.error('[c] Could not upload file.');
console.error(error);
uploads++;
this.error_message = 'Could not upload attachment: ' + error;

View File

@@ -37,7 +37,7 @@ let uploadFiles = function (fileData) {
document.dispatchEvent(event);
}
}).catch(error => {
console.error('Could not upload');
console.error('[a] Could not upload');
console.error(error);
uploads++;
// break right away

View File

@@ -83,7 +83,7 @@
<p>The upgrade and installation is ongoing. Please track its progress through the box below.</p>
<div class="row">
<div class="col-lg-12">
<div id="status-box p-3 install-box-border">
<div id="status-box" class="p-3 install-box-border">
<span class="fa fa-spin fa-spinner"></span> Waiting to start...
</div>
</div>