Ein Token darf jetzt mehrere Ordner -- statt einem oder allen

Das Fotostudio schreibt nach vehicles/ UND items/, der Token war aber auf
"vehicles" gefesselt. Damit blieb nur die Wahl zwischen "einer davon" und
"darf ueberall": das eine lehnt die Haelfte der Uploads mit 403 ab, das andere
erlaubt auch sicherungen/.

Gemessen und dabei aufgefallen: config.upload.lua setzt kein clothingPath,
also gilt die Vorgabe items/{model}.png -- und die durfte dieser Token nicht.
Kleidungs-Uploads aus dem Studio sind also stillschweigend an 403 gescheitert.

Die Spalte bleibt ein Textfeld, mehrere Werte stehen durch Komma darin. Damit
gilt JEDER bestehende Token unveraendert weiter: ein Wert ohne Komma ist eine
Liste mit einem Eintrag. Kein Migrationsschritt, kein Sonderfall.

Geprueft mit acht Faellen, darunter zwei, die scheitern MUESSEN: items/ unter
der Fessel "vehicles" (403) und "vehiclesXYZ/a.png" unter "vehicles" -- das
angehaengte / war schon vorher da und bleibt, sonst wuerde ein Praefix seinen
eigenen Namensvetter durchlassen.

Die 403-Meldung nennt jetzt alle erlaubten Ordner. Vorher haette sie bei
mehreren Fesseln "vehicles,items/" geschrieben -- einen Ordner, den es nicht
gibt. Wer abgewiesen wird, soll lesen koennen, wohin er darf.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 13:57:17 +02:00
co-authored by Claude Opus 5
parent c9e5bb3c31
commit 06285a3a53
5 changed files with 75 additions and 14 deletions
+10 -5
View File
@@ -98,10 +98,10 @@ export function Tokens() {
onChange={(e) => setName(e.target.value)}
/>
<Feld
label="Präfix (optional)"
label="Ordner (optional)"
value={prefix}
placeholder="vehicles"
hinweis="Der Token darf dann nur darunter schreiben."
placeholder="vehicles, items"
hinweis="Nur unter diesen Ordnern darf der Token schreiben. Mehrere durch Komma. Leer = überall."
onChange={(e) => setPrefix(e.target.value)}
/>
</div>
@@ -237,7 +237,7 @@ export function Tokens() {
<thead>
<tr className="text-left text-xs text-schrift-leise">
<th className="pb-2 font-medium">Name</th>
<th className="pb-2 font-medium">Präfix</th>
<th className="pb-2 font-medium">Ordner</th>
<th className="pb-2 font-medium">Rechte</th>
<th className="pb-2 font-medium">Grenzen</th>
{/* Was mit dem Token wirklich abgelegt wurde.
@@ -266,7 +266,12 @@ export function Tokens() {
)}
</td>
<td className="py-2 font-mono text-schrift-leise">
{t.prefix ? `${t.prefix}/` : '— (überall)'}
{t.prefix
? t.prefix
.split(',')
.map((p) => `${p.trim()}/`)
.join(' · ')
: '— (überall)'}
</td>
<td className="py-2">
{t.can_delete ? (