Django internet radio player
Find a file
marwin b205625e21
All checks were successful
Build and push Docker image / build (push) Successful in 13s
Test / test (push) Successful in 52s
Bücher: Cloud-Import aus WebDAV/Nextcloud (SW v41)
Verbindungen werden pro Nutzer in den Einstellungen angelegt (Nextcloud,
ownCloud, Synology oder generisches WebDAV) — der Server ist bewusst nicht
auf eine feste Instanz verdrahtet. Im Bücher-Tab lässt sich der entfernte
Ordner durchblättern und eine .epub/.pdf direkt in die Bibliothek ziehen.

Der Download läuft über den Server, weil der WebDAV-Host cross-origin ist
und keine CORS-Header schickt. Verschlüsselt wird trotzdem erst im Browser:
uploadEbook ist in _importEbookBuffer aufgeteilt, das sich lokaler Upload
und Cloud-Import teilen. Gespeichert wird wie bisher nur Geheimtext.

Weil jeder registrierte Nutzer die Ziel-URL bestimmt und diora im Docker-Netz
neben anderen Diensten läuft, ist der Import eine SSRF-Fläche. Dagegen:

  - assert_safe_url weist Hosts ab, die auf nicht-öffentliche Adressen
    auflösen (inkl. NAT64 und IPv4-kompatibler v6-Adressen, die is_global
    durchlässt)
  - _assert_peer_is_safe prüft die tatsächliche Peer-Adresse nach dem
    Verbinden — requests löst den Namen ein zweites Mal auf, sonst wäre der
    Guard per DNS-Rebinding umgehbar
  - Redirects werden abgelehnt statt verfolgt
  - identische Fehlermeldung für "nicht auflösbar" und "privat", ohne die
    IP zu nennen, damit der Endpunkt kein Scanner für interne Dienste wird

Antwort-Bodies laufen durch _read_capped, und DTDs werden vor dem Parsen
abgewiesen: ElementTree expandiert interne Entities, und seit Python 3.12
gibt es XMLParser.parser nicht mehr, um einen Handler zu setzen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 08:26:22 +00:00
.forgejo/workflows Show build time in bottom-right corner 2026-03-19 21:35:41 +01:00
accounts Bücher: Cloud-Import aus WebDAV/Nextcloud (SW v41) 2026-08-28 08:26:22 +00:00
books Bücher: Cloud-Import aus WebDAV/Nextcloud (SW v41) 2026-08-28 08:26:22 +00:00
diora Bücher: Cloud-Import aus WebDAV/Nextcloud (SW v41) 2026-08-28 08:26:22 +00:00
e2e Reader/UI: mehrere Fixes + Playwright-Setup (SW v21) 2026-08-04 09:01:52 +02:00
gpodder Fix gpodder: add update_urls to episode actions POST response 2026-03-28 19:08:46 +01:00
podcasts Centralize remaining magic numbers in settings.py 2026-04-04 21:10:14 +02:00
radio Centralize remaining magic numbers in settings.py 2026-04-04 21:10:14 +02:00
static Bücher: Cloud-Import aus WebDAV/Nextcloud (SW v41) 2026-08-28 08:26:22 +00:00
templates Bücher: Cloud-Import aus WebDAV/Nextcloud (SW v41) 2026-08-28 08:26:22 +00:00
.env.example Bücher: Cloud-Import aus WebDAV/Nextcloud (SW v41) 2026-08-28 08:26:22 +00:00
.gitignore Reader/UI: mehrere Fixes + Playwright-Setup (SW v21) 2026-08-04 09:01:52 +02:00
docker-compose.yml Add podcast feature with feed management, Docker cron, and ebook reader assets 2026-03-19 13:39:59 +01:00
Dockerfile Show build time in bottom-right corner 2026-03-19 21:35:41 +01:00
Dockerfile.cron Fix cron container: switch dcron→cron, export env vars for cron jobs 2026-03-20 09:16:29 +01:00
manage.py Initial commit 2026-03-16 19:19:22 +01:00
package-lock.json Reader/UI: mehrere Fixes + Playwright-Setup (SW v21) 2026-08-04 09:01:52 +02:00
package.json Reader/UI: mehrere Fixes + Playwright-Setup (SW v21) 2026-08-04 09:01:52 +02:00
playwright.config.js Reader/UI: mehrere Fixes + Playwright-Setup (SW v21) 2026-08-04 09:01:52 +02:00
requirements.txt Use gevent workers in gunicorn to fix SSE blocking 2026-03-19 19:15:01 +01:00