Geht schon :D/
(Natürlich nicht der Befehl STOR ordnername sondern die komplette Problemlösung).
Wie Du selbst erwähnt hast, ist Upload und Verzeichnis erstellen ein Unterschied.
Und wenn man nun einen mit Dateien gefüllten Ordner hochlädt, dann wird eben zuerst ein Verzeichnis erstellt, dann in dasselbige gewechselt und dann die Dateien hochgeladen.
Ich hatte nur einen Denkfehler mit dem * am ende des zweiten Directory-Blocks.
Ich habe sogar noch eine Anforderung erfüllen können: Im hochgeladenen Ordner dürfen keine weiteren Ordner enthalten sein!
Sollte jemand mal ne ähnlich komische Aufgabe haben, hier nochmal die Zusammenfassung der etwas ungewöhnlichen Anforderung:
1. Benutzer dürfen im Startverzeichnis nur Ordner aber keine Dateien anlegen/uploaden.
2. Innerhalb dieser Ordner dürfen nur Dateien aber keine weiteren Ordner hochgeladen werden.
3. Die Ordnernamen dürfen ausser einem Punkt und dem Unterstrich keine Sonderzeichen enthalten und nicht länger als 31 Zeichen sein.
4. Für die Dateinamen gilt dasselbe mit der Ausnahme dass diese 100 Zeichen lang sein dürfen.
Die Lösung:
Code: Select all
<Directory /srv/www/vhosts/xxxxxx.de/ftp/>
<Limit STOR>
DenyAll
</Limit>
PathAllowFilter ^[a-zA-Z0-9_.]{1,31}$
</Directory>
<Directory /srv/www/vhosts/xxxxxx.de/ftp/*/*>
<Limit STOR>
AllowAll
</Limit>
<Limit MKD>
DenyAll
</Limit>
PathAllowFilter ^[a-zA-Z0-9_.]{1,100}$
</Directory>
Erklärung:
Im ersten Directory-Block wird der Upload (STOR) komplett verboten und mit dem Filter den Ordnernamen-Vorgaben Genüge getan.
Im zweiten Block welcher sich auf so angelegten Ordner bezieht, wird zuerst der Upload erlaubt, dann das Erstellen von Ordnern (MKD) verboten und zum Schluss wieder mit dem Filter die Vorgabe der Dateinamenskonventionen erzwungen.
Beweis:
1. User lädt ein Verzeichnis mit einer Datei hoch:
Code: Select all
Status: Verbindung hergestellt, warte auf Willkommensnachricht...
Antwort: 220 ProFTPD 1.3.0 Server (ProFTPD)
Befehl: USER xxxxx
Antwort: 331 Password required for xxxxx.
Befehl: PASS ********
Antwort: 230 User xxxxx logged in.
Status: Verbunden
Status: Starte Upload von D:testORDNER123456789012345678901testDATEI_1234567890123456789012345678901234567890.txt
Befehl: CWD /ftp/testORDNER123456789012345678901/
Antwort: 550 /ftp/testORDNER123456789012345678901/: No such file or directory
Befehl: CWD /ftp/
Antwort: 250 CWD command successful
Befehl: MKD testORDNER123456789012345678901
Antwort: 257 "/ftp/testORDNER123456789012345678901" - Directory successfully created
Befehl: CWD /ftp/testORDNER123456789012345678901/
Antwort: 250 CWD command successful
Befehl: PWD
Antwort: 257 "/ftp/testORDNER123456789012345678901" is current directory.
Befehl: TYPE A
Antwort: 200 Type set to A
Befehl: PASV
Antwort: 227 Entering Passive Mode (xxxxx).
Befehl: STOR testDATEI_1234567890123456789012345678901234567890.txt
Antwort: 150 Opening ASCII mode data connection for testDATEI_1234567890123456789012345678901234567890.txt
Antwort: 226 Transfer complete.
Status: Dateitransfer erfolgreich
2. User will Datei direkt ins Hauptverzeichnis uppen:
Code: Select all
Status: Starte Upload von D:testdatei.txt
Befehl: CWD /ftp/
Antwort: 250 CWD command successful
Befehl: PWD
Antwort: 257 "/ftp" is current directory.
Befehl: TYPE A
Antwort: 200 Type set to A
Befehl: PASV
Antwort: 227 Entering Passive Mode (xxxxx).
Befehl: STOR testdatei.txt
Antwort: 550 testdatei.txt: Permission denied
3. User versucht im Ordner einen Ordner anzulegen:
Code: Select all
Status: Erstelle Ordner '/ftp/testORDNER123456789012345678901/TestOrdner/'...
Befehl: MKD TestOrdner
Antwort: 550 TestOrdner: Permission denied
Befehl: MKD /ftp/testORDNER123456789012345678901/TestOrdner/
Antwort: 550 /ftp/testORDNER123456789012345678901/TestOrdner/: Forbidden filename
Dass auch die Namenskonventionen funktionieren ist ja nicht weiter verwunderlich und war ja auch nicht die Nuss, welche es zu knacken galt.
Dank deines Geistesblitzes mit den LIMIT-Blöcken ist es mir endlich geglückt dieses Problem zu lösen :-D
Tut mir leid, dass dieser Beitrag so lang wurde aber ich so könnte er auch Anderen mal hilfreich sein.