FriendsOfREDAXO / FriendsOfREDAXO/api

checkMediaPerm(): Ziel nicht geprüft bei Verschieben + keine Kaskadierung auf Unterkategorien

Open
#80 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
PHP
Stars
20
Forks
0
Avg merge
49m
Merged PRs (30d)
17

Description

[checkMediaPerm()](https://github.com/FriendsOfREDAXO/api/blob/82466508620deb01c9b98cada073053059c1b0ed/lib/RoutePackage/Media.php#L557) in Media.php prüft bei Verschiebe-artigen Operationen nur die Quelle, nicht das Ziel. [handleUpdateCategory()](https://github.com/FriendsOfREDAXO/api/blob/82466508620deb01c9b98cada073053059c1b0ed/lib/RoutePackage/Media.php#L1123) und [handleDeleteCategory()](https://github.com/FriendsOfREDAXO/api/blob/82466508620deb01c9b98cada073053059c1b0ed/lib/RoutePackage/Media.php#L1091) prüfen Zugriff auf die zu ändernde Kategorie selbst (`checkMediaPerm($user, $Category->getId())`, [Z. 1132](https://github.com/FriendsOfREDAXO/api/blob/82466508620deb01c9b98cada073053059c1b0ed/lib/RoutePackage/Media.php#L1132) bzw. [Z. 1100](https://github.com/FriendsOfREDAXO/api/blob/82466508620deb01c9b98cada073053059c1b0ed/lib/RoutePackage/Media.php#L1100)) statt auf deren Elternkategorie, wodurch eine zugewiesene Ordnergrenze durch den betroffenen User selbst aufgelöst werden kann. [handleUpdateMedia()](https://github.com/FriendsOfREDAXO/api/blob/82466508620deb01c9b98cada073053059c1b0ed/lib/RoutePackage/Media.php#L882) prüft beim Verschieben einer Datei nur die alte Kategorie ([Z. 891](https://github.com/FriendsOfREDAXO/api/blob/82466508620deb01c9b98cada073053059c1b0ed/lib/RoutePackage/Media.php#L891)), nicht die neue category_id aus dem Body ([Z. 912](https://github.com/FriendsOfREDAXO/api/blob/82466508620deb01c9b98cada073053059c1b0ed/lib/RoutePackage/Media.php#L912) bzw. [Z. 940](https://github.com/FriendsOfREDAXO/api/blob/82466508620deb01c9b98cada073053059c1b0ed/lib/RoutePackage/Media.php#L940)), wodurch eine Datei in jede beliebige fremde Kategorie verschoben werden kann.

**Lösungsvorschlag:** Bei Operationen, die category_id/parent_id ändern, zusätzlich zur Quelle auch die Zielkategorie prüfen.

Zusätzlich prüft [hasCategoryPerm($categoryId)](https://github.com/FriendsOfREDAXO/api/blob/82466508620deb01c9b98cada073053059c1b0ed/lib/RoutePackage/Media.php#L566) immer nur exakten Treffer, nie Vorfahren. Sobald Zugriff auf eine Kategorie auch für ihren Unterbaum gelten soll, führt das dazu, dass Lesen/Hochladen/Löschen/Verschieben in einer Unterkategorie einer freigegebenen Kategorie mit 403 fehlschlägt. Betrifft Liste, Upload, Löschen, Get/Get-File, Update.

**Lösungsvorschlag:** Den bestehenden permitted_only-Opt-in um eine kaskadierende Prüfung erweitern – bei gesetztem Flag zusätzlich zum exakten Treffer die Vorfahrenkette prüfen (rex_media_category::getPath(), pro Vorfahre hasCategoryPerm()). Ändert nichts am Default-Verhalten.

---

Der klassische Medienpool hatte dieselbe Fehlerklasse (spiegelbildlich: `updatecat_selectedmedia` prüfte nur die Ziel-Kategorie, nicht die Quell-Kategorie jeder ausgewählten Datei), das ist im Core aber inzwischen behoben – die Quell-Kategorie wird pro Datei geprüft, siehe [Z. 46-50](https://github.com/redaxo/core/blob/86107124e88f4cf6f4eedb94340675cb8694e374/redaxo/src/addons/mediapool/pages/media.list.php#L46-L50). Guter Referenzpunkt für den Fix hier.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start in lib/RoutePackage/Media.php with checkMediaPerm(), hasCategoryPerm(), handleUpdateMedia(), handleUpdateCategory(), and handleDeleteCategory(). Compare the source-category checks with redaxo/src/addons/mediapool/pages/media.list.php lines 46-50. Done means move operations check both source and destination, the permitted_only option can check ancestors without changing default behavior, and affected permission paths remain protected.

Written by the indexing model from the issue text.

Assessment

Tech stack
php
Domain
api, authorization, backend, security
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.