minimalistische API und Konzept auf Basis eines Standard Apache Webservers mit webdav. Standard Bordmittel. Kein CGI, kein PHP o.ä nötig. KISS Prinzip, aber eigene Token-Erzeugung und Verwaltung durch den Nutzer.
ACHTUNG! Nicht auf einem öffentliche Server installieren, sondern noch zwingend einen TLS proxy vorschalten, der auch den auth übernimmt, beim Zugriff auf "/new/" und "/chain/"Bei einer Anfrage unter /new/ wird die Anfrage (wenn sie einem regex Muster eines Tokens entspricht) von apache statt in ein logfile in ein gawk script geleitet, das dann ein Verzeichnis mit diesem Namen erstellt. Unter Kenntnis dieses tokens (also verzeichnissen) können dann Daten in jenem Verzeichnis hochgeladen werden.
Zu einem bestehenden derartigen token, kann man mittels /chain/ dann weitere read-only tokens erzeugen, unter deren Kenntnis wiederum dann Zugriffe via /ro/ möglich sind. Diese sind symlinks zum rw token, jedoch über die methode GET auf nurlesenden Zugriff limitiert.
curl -Ls https://finalmedia.de/code/kb/6fbfe4089e26/setup.txt | shEmpfohlen: Alpine-Linux ab 3.23 (!) Instant-Setup via
curl -Ls https://finalmedia.de/code/kb/6fbfe4089e26/setup_alpine.txt | shLetztlich geschieht dabei das:
#!/bin/sh # mindestens: alpine linux 3.23 # keep hot dav storage (simple variant) # reinhard@finalmedia.de # Sun Dec 7 02:56:53 PM CET 2025 # example setup apk add apache2 gawk apache2-webdav apr-util-dbm_gdbm curl findutils rc-update add apache2 rm /etc/apache2/conf.d/dav.conf mkdir -p /var/www/localhost/keep/ro mkdir -p /var/www/localhost/keep/rw chown root:root /var/www/localhost/keep/rw chown root:root /var/www/localhost/keep/ro chmod 111 /var/www/localhost/keep/rw chmod 111 /var/www/localhost/keep/ro mkdir /var/lib/dav touch /var/lib/dav/lockdb chown apache:apache /var/lib/dav chown apache:apache /var/lib/dav/lockdb echo forbidden > /var/www/localhost/keep/ro/index.html echo forbidden > /var/www/localhost/keep/rw/index.html echo keep > /var/www/localhost/keep/index.html chown -R apache:apache /var/www/localhost/keep chattr +i /var/www/localhost/keep/rw/index.html chattr +i /var/www/localhost/keep/ro/index.html chattr +i /var/www/localhost/keep base64 -d << ::EOF:: | tar -C /etc/apache2/ -x -z -v H4sIAAAAAAAAA+1XbVMbNxD2V9+vWB+EtExtHXdnm3QIE1JIwgwJHRr4UhpGvlvbN76T3JNs40np b+/KbxhsB2ZapyXV88GStY9Oq9W+SFGbJ0LLDoqKahfWA49Qr1ZHLeF+6wU7tcJO1ffqQd2r+vWC t+P7Ya0A3pr0uYOe0jwHKORS6i/xHpI/UWyUWCMRTLUdvMYIekK1eY5QFtDigw6U3zB4vhnAn8A+ /eqVX/z2uXZjWl5uUje82WSwtQWb4UOEAEovDQ0+q6HSmH3npgLKqgmXLuvznA0GA5bKiKdtqTTr IHZZPmDuZuBeul/iSOKEhrPlfn/z3Pm3rfn0EEnRrMRsrWuM4r++Ov5Nfxz/tXqt7lP8e/UwLEB1 rVpN8D+P/8n5x9jkvVRXzN9/fA1zwDU60BXnH1T98Pb8ayb/B35Ytfn/a2DvIsl1j6fvKKfC9o+7 3r5T3PgF8z7mH3iGQEm3gtc866ZIzpE5TvFE8vi9jHspQsz7V9m4O24Uo/aKhitKLjCbagWZJPf5 PE3lIEPdlvHSWfNyM9cpHvL+iYw6h69hVCzSpMHo06ZgdOIGyTfgAvMhHGddmWsudKlUMoNCAu9p CXGSY6QlMRIR4zWkCdnDEJoyhxx5LEU6hFFxVD9AAyPeUzjlIu8oUMMsTUQHyJ1aqAUZr0TLjk15 EGeJgAE2Mk7VL381K2PEOMpzmZ/I1kRv2WK8y6M2+gyNpEIjTvEnclOZLWXxKEKlDA3ogKiYY2zM IaNehkKfkdvCivI5XXzKhdALzH4bSRyjuBSL4hBkZ9l4dcX4CzAJJU0ivSiteh7QDpcJgonAmE8f if5xE87w9x4qfXV+dgyfmMABA/ppS9kZ2Ycs80bmGdfgPjt374huTfcHQx3N7BbRqWokJl185yYA iv7LufkrdYjMzZnBqFmlx13hSk3m7+B35oyUufMRBybYI2/nOpECXObuz4anOO0amYLysXFRVE6x aNQnLzexBa2cQoAc5f60AxNX78dxBW+PPsK7o4PD5axT8us8iRE+SIELlMODCzhtNm/VZVN995fv wVz3voVtyG9jGwO2zbYfs5NHaLPAoRCJ8OOwS7vvdik7jFZlMtKoy0pTXGYPm+Ln86k5lu9WLAyf JFmiJzH8WsZD8HfCergb1MLdxU9MqkmiItk3dUMa6y213x6bK6FkTudJvULms+C61njo/e8Hwe37 PzT3f9O397+vgb///p+96BNBpqRsVo6hTLeqUXGDcmvWy8B4waNe/OY1/6TCyMLCwsLCwsLCwsLC wsLCwsLCwsLiP4e/ABQrKVkAKAAA ::EOF:: chattr +i /etc/apache2/chaintoken.sh chattr +i /etc/apache2/unchaintoken.sh chattr +i /etc/apache2/createnew.sh service apache2 start
/new/ neues rw token erstellen /chain/ symlinken eines ro token zu einem rw /unchain/ symlink entfernen /ro/ nurlese zugriff (GET HEAD) /rw/ schreibender und lesender zugriff (PUT GET HEAD)
[0-9]{6}[0-9a-f]{64}
YYYYmmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxToken mit zwei Jahren Gültigkeit (Ablauf datum, also +2 Jahre):
echo "$((2+$(date +%Y)))$(date +%m)$(tr -dc "0-9a-f" < /dev/urandom | head -c 64)"
curl -s http://127.0.0.1/new/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb41 curl -s http://127.0.0.1/new/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb42 curl -s http://127.0.0.1/new/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb43
curl -s http://127.0.0.1/chain/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb41/20260618e7c00c8b616b6e36fdc9a524bf9101d85b74e67601ce150faa5a80db68c7a3
## should chain some ro tokens to the rw token 20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb42 curl -s http://127.0.0.1/chain/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb42/20260618e7c00c8b616b6e36fdc9a524bf9101d85b74e67601ce150faa5a80db68c7a2 curl -s http://127.0.0.1/chain/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb42/20260618e7c00c8b616b6e36fdc9a524bf9101d85b74e67601ce150faa5a80db68c7a1 curl -s http://127.0.0.1/chain/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb42/20260618e7c00c8b616b6e36fdc9a524bf9101d85b74e67601ce150faa5a80db68c7a0
echo ich_bin_content | curl -s -X PUT -T- http://127.0.0.1/rw/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb41/blonk.txt
curl -s http://127.0.0.1/ro/20260618e7c00c8b616b6e36fdc9a524bf9101d85b74e67601ce150faa5a80db68c7a3/blonk.txt
curl -s http://127.0.0.1/rw/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb41/blonk.txt
Tipp: Ergänze einen http_basic_auth für den Pfad /new/ und /chain/, um diesen abzusichern, wenn du nicht freie Token-Erstellung und Nutzung gestatten willst. Du kannst dies auch in einem vorgeschaltenen TLS Path Proxy mit einem separaten apache oder haproxy realisieren.