Compare commits

...

3 Commits

Author SHA1 Message Date
dependabot[bot]
555675f3fc Bump the minor-updates group across 1 directory with 26 updates
Bumps the minor-updates group with 25 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [datomatic/laravel-enum-helper](https://github.com/datomatic/laravel-enum-helper) | `2.1.1` | `2.1.4` |
| [dedoc/scramble](https://github.com/dedoc/scramble) | `0.12.23` | `0.13.21` |
| [flowframe/laravel-trend](https://github.com/Flowframe/laravel-trend) | `0.4.0` | `0.5.0` |
| [gotenberg/gotenberg-php](https://github.com/gotenberg/gotenberg-php) | `2.14.0` | `2.21.0` |
| [korridor/laravel-has-many-sync](https://github.com/korridor/laravel-has-many-sync) | `3.1.0` | `3.2.0` |
| [korridor/laravel-model-validation-rules](https://github.com/korridor/laravel-model-validation-rules) | `3.3.0` | `3.4.0` |
| [laravel/jetstream](https://github.com/laravel/jetstream) | `5.3.7` | `5.5.2` |
| [laravel/octane](https://github.com/laravel/octane) | `2.11.0` | `2.17.2` |
| [laravel/passport](https://github.com/laravel/passport) | `13.0.5` | `13.7.5` |
| [league/flysystem-aws-s3-v3](https://github.com/thephpleague/flysystem-aws-s3-v3) | `3.29.0` | `3.32.0` |
| [league/iso3166](https://github.com/alcohol/iso3166) | `4.3.3` | `4.4.0` |
| [maatwebsite/excel](https://github.com/SpartnerNL/Laravel-Excel) | `3.1.67` | `3.1.68` |
| [owen-it/laravel-auditing](https://github.com/owen-it/laravel-auditing) | `14.0.0` | `14.0.3` |
| [spatie/temporary-directory](https://github.com/spatie/temporary-directory) | `2.3.0` | `2.3.1` |
| [tightenco/ziggy](https://github.com/tighten/ziggy) | `2.5.3` | `2.6.2` |
| [tpetry/laravel-postgresql-enhanced](https://github.com/tpetry/laravel-postgresql-enhanced) | `3.0.0` | `3.6.0` |
| [barryvdh/laravel-ide-helper](https://github.com/barryvdh/laravel-ide-helper) | `3.5.5` | `3.7.0` |
| [fumeapp/modeltyper](https://github.com/fumeapp/modeltyper) | `3.3.0` | `3.10.0` |
| [larastan/larastan](https://github.com/larastan/larastan) | `3.5.0` | `3.9.6` |
| [laravel/pint](https://github.com/laravel/pint) | `1.24.0` | `1.29.1` |
| [laravel/sail](https://github.com/laravel/sail) | `1.43.1` | `1.57.0` |
| [laravel/telescope](https://github.com/laravel/telescope) | `5.10.0` | `5.20.0` |
| [nunomaduro/collision](https://github.com/nunomaduro/collision) | `8.8.2` | `8.9.4` |
| [spatie/laravel-ignition](https://github.com/spatie/laravel-ignition) | `2.9.1` | `2.12.0` |
| [timacdonald/log-fake](https://github.com/timacdonald/log-fake) | `2.4.0` | `2.4.2` |



Updates `datomatic/laravel-enum-helper` from 2.1.1 to 2.1.4
- [Release notes](https://github.com/datomatic/laravel-enum-helper/releases)
- [Changelog](https://github.com/datomatic/laravel-enum-helper/blob/main/CHANGELOG.md)
- [Commits](https://github.com/datomatic/laravel-enum-helper/compare/v2.1.1...v2.1.4)

Updates `dedoc/scramble` from 0.12.23 to 0.13.21
- [Release notes](https://github.com/dedoc/scramble/releases)
- [Commits](https://github.com/dedoc/scramble/compare/v0.12.23...v0.13.21)

Updates `flowframe/laravel-trend` from 0.4.0 to 0.5.0
- [Release notes](https://github.com/Flowframe/laravel-trend/releases)
- [Changelog](https://github.com/Flowframe/laravel-trend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Flowframe/laravel-trend/compare/v0.4.0...v0.5.0)

Updates `gotenberg/gotenberg-php` from 2.14.0 to 2.21.0
- [Release notes](https://github.com/gotenberg/gotenberg-php/releases)
- [Commits](https://github.com/gotenberg/gotenberg-php/compare/v2.14.0...v2.21.0)

Updates `korridor/laravel-has-many-sync` from 3.1.0 to 3.2.0
- [Release notes](https://github.com/korridor/laravel-has-many-sync/releases)
- [Commits](https://github.com/korridor/laravel-has-many-sync/compare/3.1.0...3.2.0)

Updates `korridor/laravel-model-validation-rules` from 3.3.0 to 3.4.0
- [Release notes](https://github.com/korridor/laravel-model-validation-rules/releases)
- [Commits](https://github.com/korridor/laravel-model-validation-rules/compare/3.3.0...3.4.0)

Updates `laravel/framework` from 12.52.0 to 12.58.0
- [Release notes](https://github.com/laravel/framework/releases)
- [Changelog](https://github.com/laravel/framework/blob/13.x/CHANGELOG.md)
- [Commits](https://github.com/laravel/framework/compare/v12.52.0...v12.58.0)

Updates `laravel/jetstream` from 5.3.7 to 5.5.2
- [Release notes](https://github.com/laravel/jetstream/releases)
- [Changelog](https://github.com/laravel/jetstream/blob/5.x/CHANGELOG.md)
- [Commits](https://github.com/laravel/jetstream/compare/v5.3.7...v5.5.2)

Updates `laravel/octane` from 2.11.0 to 2.17.2
- [Release notes](https://github.com/laravel/octane/releases)
- [Changelog](https://github.com/laravel/octane/blob/2.x/CHANGELOG.md)
- [Commits](https://github.com/laravel/octane/compare/v2.11.0...v2.17.2)

Updates `laravel/passport` from 13.0.5 to 13.7.5
- [Release notes](https://github.com/laravel/passport/releases)
- [Changelog](https://github.com/laravel/passport/blob/13.x/CHANGELOG.md)
- [Commits](https://github.com/laravel/passport/compare/v13.0.5...v13.7.5)

Updates `league/flysystem-aws-s3-v3` from 3.29.0 to 3.32.0
- [Commits](https://github.com/thephpleague/flysystem-aws-s3-v3/compare/3.29.0...3.32.0)

Updates `league/iso3166` from 4.3.3 to 4.4.0
- [Release notes](https://github.com/alcohol/iso3166/releases)
- [Changelog](https://github.com/alcohol/iso3166/blob/main/CHANGELOG.md)
- [Commits](https://github.com/alcohol/iso3166/compare/4.3.3...4.4.0)

Updates `maatwebsite/excel` from 3.1.67 to 3.1.68
- [Release notes](https://github.com/SpartnerNL/Laravel-Excel/releases)
- [Changelog](https://github.com/SpartnerNL/Laravel-Excel/blob/3.1/CHANGELOG.md)
- [Commits](https://github.com/SpartnerNL/Laravel-Excel/compare/3.1.67...3.1.68)

Updates `owen-it/laravel-auditing` from 14.0.0 to 14.0.3
- [Release notes](https://github.com/owen-it/laravel-auditing/releases)
- [Changelog](https://github.com/owen-it/laravel-auditing/blob/master/CHANGELOG.md)
- [Commits](https://github.com/owen-it/laravel-auditing/compare/v14.0.0...v14.0.3)

Updates `spatie/temporary-directory` from 2.3.0 to 2.3.1
- [Release notes](https://github.com/spatie/temporary-directory/releases)
- [Changelog](https://github.com/spatie/temporary-directory/blob/main/CHANGELOG.md)
- [Commits](https://github.com/spatie/temporary-directory/compare/2.3.0...2.3.1)

Updates `tightenco/ziggy` from 2.5.3 to 2.6.2
- [Release notes](https://github.com/tighten/ziggy/releases)
- [Changelog](https://github.com/tighten/ziggy/blob/2.x/CHANGELOG.md)
- [Commits](https://github.com/tighten/ziggy/compare/v2.5.3...v2.6.2)

Updates `tpetry/laravel-postgresql-enhanced` from 3.0.0 to 3.6.0
- [Changelog](https://github.com/tpetry/laravel-postgresql-enhanced/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tpetry/laravel-postgresql-enhanced/compare/3.0.0...3.6.0)

Updates `barryvdh/laravel-ide-helper` from 3.5.5 to 3.7.0
- [Release notes](https://github.com/barryvdh/laravel-ide-helper/releases)
- [Changelog](https://github.com/barryvdh/laravel-ide-helper/blob/master/CHANGELOG.md)
- [Commits](https://github.com/barryvdh/laravel-ide-helper/compare/v3.5.5...v3.7.0)

Updates `fumeapp/modeltyper` from 3.3.0 to 3.10.0
- [Release notes](https://github.com/fumeapp/modeltyper/releases)
- [Commits](https://github.com/fumeapp/modeltyper/compare/v3.3.0...v3.10.0)

Updates `larastan/larastan` from 3.5.0 to 3.9.6
- [Release notes](https://github.com/larastan/larastan/releases)
- [Changelog](https://github.com/larastan/larastan/blob/3.x/RELEASE.md)
- [Commits](https://github.com/larastan/larastan/compare/v3.5.0...v3.9.6)

Updates `laravel/pint` from 1.24.0 to 1.29.1
- [Release notes](https://github.com/laravel/pint/releases)
- [Changelog](https://github.com/laravel/pint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/laravel/pint/compare/v1.24.0...v1.29.1)

Updates `laravel/sail` from 1.43.1 to 1.57.0
- [Release notes](https://github.com/laravel/sail/releases)
- [Changelog](https://github.com/laravel/sail/blob/1.x/CHANGELOG.md)
- [Commits](https://github.com/laravel/sail/compare/v1.43.1...v1.57.0)

Updates `laravel/telescope` from 5.10.0 to 5.20.0
- [Release notes](https://github.com/laravel/telescope/releases)
- [Changelog](https://github.com/laravel/telescope/blob/5.x/CHANGELOG.md)
- [Commits](https://github.com/laravel/telescope/compare/v5.10.0...v5.20.0)

Updates `nunomaduro/collision` from 8.8.2 to 8.9.4
- [Commits](https://github.com/nunomaduro/collision/compare/v8.8.2...v8.9.4)

Updates `spatie/laravel-ignition` from 2.9.1 to 2.12.0
- [Release notes](https://github.com/spatie/laravel-ignition/releases)
- [Changelog](https://github.com/spatie/laravel-ignition/blob/main/CHANGELOG.md)
- [Commits](https://github.com/spatie/laravel-ignition/compare/2.9.1...2.12.0)

Updates `timacdonald/log-fake` from 2.4.0 to 2.4.2
- [Release notes](https://github.com/timacdonald/log-fake/releases)
- [Commits](https://github.com/timacdonald/log-fake/compare/v2.4.0...v2.4.2)

---
updated-dependencies:
- dependency-name: barryvdh/laravel-ide-helper
  dependency-version: 3.7.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: datomatic/laravel-enum-helper
  dependency-version: 2.1.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-updates
- dependency-name: dedoc/scramble
  dependency-version: 0.13.20
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: flowframe/laravel-trend
  dependency-version: 0.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: fumeapp/modeltyper
  dependency-version: 3.10.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: gotenberg/gotenberg-php
  dependency-version: 2.21.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: korridor/laravel-has-many-sync
  dependency-version: 3.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: korridor/laravel-model-validation-rules
  dependency-version: 3.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: larastan/larastan
  dependency-version: 3.9.6
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: laravel/framework
  dependency-version: 12.56.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: laravel/jetstream
  dependency-version: 5.5.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: laravel/octane
  dependency-version: 2.17.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: laravel/passport
  dependency-version: 13.7.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: laravel/pint
  dependency-version: 1.29.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: laravel/sail
  dependency-version: 1.57.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: laravel/telescope
  dependency-version: 5.20.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: league/flysystem-aws-s3-v3
  dependency-version: 3.32.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: league/iso3166
  dependency-version: 4.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: maatwebsite/excel
  dependency-version: 3.1.68
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-updates
- dependency-name: nunomaduro/collision
  dependency-version: 8.9.3
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: owen-it/laravel-auditing
  dependency-version: 14.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-updates
- dependency-name: spatie/laravel-ignition
  dependency-version: 2.12.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: spatie/temporary-directory
  dependency-version: 2.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-updates
- dependency-name: tightenco/ziggy
  dependency-version: 2.6.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
- dependency-name: timacdonald/log-fake
  dependency-version: 2.4.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-updates
- dependency-name: tpetry/laravel-postgresql-enhanced
  dependency-version: 3.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-27 08:47:00 +00:00
Gregor Vostrak
b73aa543fd Merge commit from fork 2026-04-21 21:12:30 +02:00
Gregor Vostrak
2d6f9e514f add groupSimilarTimeEntries to TimeEntryGroupedTable 2026-04-21 20:44:33 +02:00
5 changed files with 939 additions and 848 deletions

View File

@@ -629,9 +629,9 @@ class TimeEntryController extends Controller
/** @var Member|null $member */
$member = $request->has('member_id') ? Member::query()->findOrFail($request->input('member_id')) : null;
if ($timeEntry->member->user_id === Auth::id() && ($member === null || $member->user_id === Auth::id())) {
$this->checkPermission($organization, 'time-entries:update:own');
$this->checkPermission($organization, 'time-entries:update:own', $timeEntry);
} else {
$this->checkPermission($organization, 'time-entries:update:all');
$this->checkPermission($organization, 'time-entries:update:all', $timeEntry);
}
if ($timeEntry->end !== null && $request->has('end') && $request->input('end') === null) {

View File

@@ -9,9 +9,9 @@
"ext-zip": "*",
"brick/money": "^0.10.0",
"datomatic/laravel-enum-helper": "^2.0.0",
"dedoc/scramble": "^0.12.2",
"dedoc/scramble": "^0.13.21",
"filament/filament": "^3.2",
"flowframe/laravel-trend": "^0.4.0",
"flowframe/laravel-trend": "^0.5.0",
"gotenberg/gotenberg-php": "^2.8",
"guzzlehttp/guzzle": "^7.2",
"inertiajs/inertia-laravel": "^2.0.3",

1695
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -20,25 +20,30 @@ const selectedTimeEntries = defineModel<TimeEntry[]>('selected', {
default: [],
});
const props = defineProps<{
timeEntries: TimeEntry[];
projects: Project[];
tasks: Task[];
tags: Tag[];
clients: Client[];
createTag: (name: string) => Promise<Tag | undefined>;
updateTimeEntry: (entry: TimeEntry) => void;
updateTimeEntries: (ids: string[], changes: Partial<TimeEntry>) => void;
deleteTimeEntries: (entries: TimeEntry[]) => void;
createTimeEntry: (entry: Omit<CreateTimeEntryBody, 'member_id'>) => void;
createProject: (project: CreateProjectBody) => Promise<Project | undefined>;
createClient: (client: CreateClientBody) => Promise<Client | undefined>;
currency: string;
organizationBillableRate: number | null;
enableEstimatedTime: boolean;
canCreateProject: boolean;
groupSimilarTimeEntries: boolean;
}>();
const props = withDefaults(
defineProps<{
timeEntries: TimeEntry[];
projects: Project[];
tasks: Task[];
tags: Tag[];
clients: Client[];
createTag: (name: string) => Promise<Tag | undefined>;
updateTimeEntry: (entry: TimeEntry) => void;
updateTimeEntries: (ids: string[], changes: Partial<TimeEntry>) => void;
deleteTimeEntries: (entries: TimeEntry[]) => void;
createTimeEntry: (entry: Omit<CreateTimeEntryBody, 'member_id'>) => void;
createProject: (project: CreateProjectBody) => Promise<Project | undefined>;
createClient: (client: CreateClientBody) => Promise<Client | undefined>;
currency: string;
organizationBillableRate: number | null;
enableEstimatedTime: boolean;
canCreateProject: boolean;
groupSimilarTimeEntries?: boolean;
}>(),
{
groupSimilarTimeEntries: true,
}
);
const groupedTimeEntries = computed(() => {
const groupedEntriesByDay: Record<string, TimeEntry[]> = {};

View File

@@ -2490,6 +2490,47 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
$response->assertForbidden();
}
public function test_update_endpoint_fails_if_time_entry_belongs_to_different_organization_than_url_even_with_update_all_permission(): void
{
// Arrange
// Attacker: has `time-entries:update:all` in their own organization (orgA).
$data = $this->createUserWithPermission([
'time-entries:update:all',
'projects:view:all',
]);
$attackerProject = Project::factory()->forOrganization($data->organization)->create();
// Victim: entirely separate organization (orgB). Attacker has NO membership in orgB.
$victimOrgData = $this->createUserWithPermission([], true);
$victimTimeEntry = TimeEntry::factory()
->forOrganization($victimOrgData->organization)
->forMember($victimOrgData->ownerMember)
->create([
'description' => 'victim-original',
'project_id' => null,
'task_id' => null,
]);
Passport::actingAs($data->user);
// Act: PUT to /organizations/{orgA}/time-entries/{victim_uuid} — URL org is attacker's
// own org, but the route-bound time entry belongs to orgB.
$response = $this->putJson(route('api.v1.time-entries.update', [$data->organization->getKey(), $victimTimeEntry->getKey()]), [
'description' => 'attacker-overwrite',
'project_id' => $attackerProject->getKey(),
]);
// Assert: must be rejected. Before the fix this returned 200 and rewrote the
// victim row with attacker's project_id while keeping organization_id = orgB.
$response->assertForbidden();
$this->assertDatabaseHas(TimeEntry::class, [
'id' => $victimTimeEntry->getKey(),
'organization_id' => $victimOrgData->organization->getKey(),
'description' => 'victim-original',
'project_id' => null,
]);
}
public function test_update_endpoint_fails_if_user_has_no_permission_to_update_time_entries_for_other_users_in_organization(): void
{
// Arrange