FriendsOfREDAXO / FriendsOfREDAXO/api
checkMediaPerm(): Ziel nicht geprüft bei Verschieben + keine Kaskadierung auf Unterkategorien
- 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