Go to file
duffyduck 76beda113e Konstruktor: setDirty(false) am Ende, statt setDirty(true) via onShareToggled
Verhindert dass das Öffnen des Properties-Dialogs als ungespeicherte
Änderung interpretiert wird. KDE rief sonst applyChanges() auf allen
Plugins auf, was z.B. das parallel installierte SMB-Plugin dazu brachte,
seine User-Berechtigungen mit dem Default 'Everyone:R' zu überschreiben.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 12:15:17 +02:00
kf5 Konstruktor: setDirty(false) am Ende, statt setDirty(true) via onShareToggled 2026-04-13 12:15:17 +02:00
kf6 Konstruktor: setDirty(false) am Ende, statt setDirty(true) via onShareToggled 2026-04-13 12:15:17 +02:00
scripts Server-Config UI (aktiv/passiv) und Port-Forwarding Tipps in README 2026-04-04 19:39:24 +02:00
.gitignore .gitignore: Build-Verzeichnisse ausschließen 2026-04-04 19:50:30 +02:00
README.md README: Warnung dass aktiver FTP-Modus nicht durch NAT funktioniert 2026-04-04 19:42:39 +02:00
screenshot.png first commit 2026-03-22 21:25:09 +01:00

README.md

Dolphin FTP Share Tab

Ein KDE Dolphin Properties-Dialog Plugin zum Erstellen und Verwalten von FTP-Freigaben — direkt über die GUI.

Share Tab

Features

  • FTP-Tab in Dolphins Ordner-Eigenschaften (Rechtsklick → Eigenschaften)
  • Freigabe per Checkbox aktivieren/deaktivieren
  • Freigabename konfigurierbar (Standard = Ordnername)
  • Per-User Berechtigungen: Read Only / Read-Write pro Benutzer
  • Jeder Benutzer sieht nur seine freigegebenen Ordner per FTP
  • Read-Only wird direkt am Dateisystem durchgesetzt (read-only Bind-Mount)
  • Automatische Einrichtung mit dolphin-ftp-share setup

Voraussetzungen

  • Pure-FTPd als FTP-Server
  • Das Helper-Script dolphin-ftp-share im PATH
  • Build-Dependencies (siehe unten)

Einrichtung

1. Pure-FTPd installieren

sudo apt install pure-ftpd

2. Helper-Script installieren

sudo cp scripts/dolphin-ftp-share /usr/local/bin/
sudo chmod +x /usr/local/bin/dolphin-ftp-share

3. Automatisches Setup

Das Setup konfiguriert Pure-FTPd komplett und erstellt die sudoers-Regel:

sudo dolphin-ftp-share setup

Das macht automatisch:

  • Aktiviert PureDB-Authentifizierung (virtuelle FTP-Benutzer)
  • Deaktiviert System-Login und anonymen Zugang
  • Aktiviert Chroot (jeder sieht nur seine Ordner)
  • Erstellt sudoers-Regel für mount/umount/pure-pw
  • Aktiviert Logging
  • Startet Pure-FTPd neu

4. FTP-Passwörter

FTP-Benutzer werden beim ersten Freigeben automatisch erstellt — das Plugin fragt dabei nach einem Passwort.

Passwort später ändern:

  • Im Plugin: FTP-Tab → "FTP Password" → Benutzer auswählen → "Change Password..."
  • Per Kommandozeile: dolphin-ftp-share passwd <benutzername> <neues-passwort>

Logging

Pure-FTPd loggt über syslog:

# Logs live verfolgen:
sudo tail -f /var/log/syslog | grep pure-ftpd

Versionen

Verzeichnis Zielplattform KDE Frameworks Qt
kf5/ Debian 12 Bookworm KF5 Qt5
kf6/ Debian 13 Trixie KF6 Qt6

Der C++ Quellcode ist identisch — nur die CMake-Konfiguration unterscheidet sich.

Build & Installation

Debian 12 (KF5)

Build-Dependencies:

sudo apt install build-essential cmake extra-cmake-modules \
    libkf5kio-dev libkf5coreaddons-dev libkf5i18n-dev \
    qtbase5-dev

Bauen:

cd kf5
bash build.sh

Installieren:

sudo cp build/bin/ftpshareplugin.so \
    /usr/lib/x86_64-linux-gnu/qt5/plugins/kf5/propertiesdialog/

Dolphin neustarten:

killall dolphin; dolphin &

Debian 13 Trixie (KF6)

Build-Dependencies:

sudo apt install build-essential cmake extra-cmake-modules \
    libkf6kio-dev libkf6coreaddons-dev libkf6i18n-dev \
    qt6-base-dev

Bauen:

cd kf6
bash build.sh

Installieren:

sudo cp build/bin/ftpshareplugin.so \
    /usr/lib/x86_64-linux-gnu/qt6/plugins/kf6/propertiesdialog/

Dolphin neustarten:

killall dolphin; dolphin &

Deinstallation

# KF5
sudo rm /usr/lib/x86_64-linux-gnu/qt5/plugins/kf5/propertiesdialog/ftpshareplugin.so

# KF6
sudo rm /usr/lib/x86_64-linux-gnu/qt6/plugins/kf6/propertiesdialog/ftpshareplugin.so

# Helper-Script & sudoers
sudo rm /usr/local/bin/dolphin-ftp-share
sudo rm /etc/sudoers.d/dolphin-ftp-share

# Pure-FTPd (optional)
sudo apt remove pure-ftpd

Projektstruktur

kde-dolphin-ftp-sharing-tab/
├── README.md
├── scripts/
│   └── dolphin-ftp-share            # Helper-Script für Share-Verwaltung
├── kf5/                              # Debian 12 (KDE Plasma 5)
│   ├── CMakeLists.txt
│   ├── build.sh
│   └── src/
│       ├── CMakeLists.txt
│       ├── ftpshareplugin.json
│       ├── ftpshareplugin.h
│       └── ftpshareplugin.cpp
└── kf6/                              # Debian 13 (KDE Plasma 6)
    ├── CMakeLists.txt
    ├── build.sh
    └── src/
        ├── CMakeLists.txt
        ├── ftpshareplugin.json
        ├── ftpshareplugin.h
        └── ftpshareplugin.cpp

Wie es funktioniert

  1. Rechtsklick auf Ordner → Eigenschaften → FTP-Tab
  2. Freigabe aktivieren, Berechtigungen pro Benutzer setzen (Read Only / Read-Write)
  3. Beim Anwenden ruft das Plugin dolphin-ftp-share add auf
  4. Das Helper-Script:
    • Erstellt für jeden Benutzer ein persönliches FTP-Root (~/.local/share/dolphin-ftp-root/users/<name>/)
    • Bind-mounted den freigegebenen Ordner dorthin
    • Read-Only Freigaben werden als read-only Bind-Mount gemountet
    • Erstellt automatisch virtuelle Pure-FTPd-Benutzer (PureDB)
  5. Jeder FTP-Benutzer sieht nur seine freigegebenen Ordner — durch Chroot auf sein persönliches FTP-Root

Kommandos

Kommando Beschreibung
dolphin-ftp-share setup Einmalige Pure-FTPd Einrichtung
dolphin-ftp-share add <name> <path> <acl> Freigabe erstellen
dolphin-ftp-share delete <name> Freigabe löschen
dolphin-ftp-share info Bestehende Freigaben auflisten
dolphin-ftp-share passwd <user> <pass> FTP-Passwort ändern

Berechtigungen

Level Beschreibung
--- Kein Zugriff — Ordner ist für diesen Benutzer nicht sichtbar
ro Read Only — nur Download
rw Read-Write — Upload und Download

Tipps: Port-Forwarding für FTP

Szenario

Ein Gerät (z.B. ein Dokumentenscanner) soll per FTP auf den Server scannen, hat aber keinen direkten Zugang zum Server-Netzwerk (z.B. VPN). Ein Windows- oder Linux-Rechner, der in beiden Netzen hängt, leitet die FTP-Ports weiter.

Scanner ──► Windows/Linux (Port-Forwarding) ──► VPN ──► FTP-Server

Wichtig: Warum Passiver Modus bei NAT/Port-Forwarding?

Aktiver Modus funktioniert NICHT durch NAT hindurch! Im aktiven Modus versucht der Server eine Verbindung zurück zum Client (Scanner) aufzubauen — aber der Scanner sitzt hinter NAT, und der Server erreicht ihn nicht.

Passiver Modus ist Pflicht wenn der Client (Scanner) über NAT/Port-Forwarding angebunden ist:

  • Der Client verbindet sich zum Server (nicht umgekehrt) → funktioniert durch NAT
  • Dafür muss neben Port 21 auch die passive Port-Range weitergeleitet werden

Aktiver Modus

Funktioniert nur bei direkter Verbindung ohne NAT. Nur 2 Ports nötig: 20 (Daten) und 21 (Steuerung).

Passiver Modus (empfohlen bei NAT/Port-Forwarding)

Port 21 (Steuerung) + die gesamte Port-Range (z.B. 30000-31000) müssen weitergeleitet werden. Mehr Ports, aber die einzige Option die durch NAT funktioniert.

Windows: Port-Forwarding mit netsh

Als Administrator in der Eingabeaufforderung (cmd):

:: Aktiver Modus — Port 21 (Steuerung) und Port 20 (Daten) weiterleiten
netsh interface portproxy add v4tov4 listenport=21 listenaddress=0.0.0.0 connectport=21 connectaddress=<SERVER-VPN-IP>
netsh interface portproxy add v4tov4 listenport=20 listenaddress=0.0.0.0 connectport=20 connectaddress=<SERVER-VPN-IP>

:: Passiver Modus — zusätzlich die Port-Range weiterleiten
:: (PowerShell, da netsh keine Ranges unterstützt)
for ($p=30000; $p -le 31000; $p++) { netsh interface portproxy add v4tov4 listenport=$p listenaddress=0.0.0.0 connectport=$p connectaddress=<SERVER-VPN-IP> }

Windows-Firewall öffnen:

netsh advfirewall firewall add rule name="FTP Active" dir=in action=allow protocol=TCP localport=20,21
:: Für passiven Modus zusätzlich:
netsh advfirewall firewall add rule name="FTP Passive" dir=in action=allow protocol=TCP localport=30000-31000

Port-Forwarding anzeigen / entfernen:

:: Alle Weiterleitungen anzeigen
netsh interface portproxy show all

:: Einzelne Weiterleitung entfernen
netsh interface portproxy delete v4tov4 listenport=21 listenaddress=0.0.0.0

:: Alle Weiterleitungen entfernen
netsh interface portproxy reset

Linux: Port-Forwarding mit iptables oder socat

Variante 1: socat (einfach, gut zum Testen)

# Aktiver Modus
sudo socat TCP-LISTEN:21,fork,reuseaddr TCP:<SERVER-VPN-IP>:21 &
sudo socat TCP-LISTEN:20,fork,reuseaddr TCP:<SERVER-VPN-IP>:20 &

# Passiver Modus — zusätzlich Port-Range
for p in $(seq 30000 31000); do
    sudo socat TCP-LISTEN:$p,fork,reuseaddr TCP:<SERVER-VPN-IP>:$p &
done

Variante 2: iptables (performanter, dauerhaft)

# IP-Forwarding aktivieren
sudo sysctl -w net.ipv4.ip_forward=1

# Aktiver Modus
sudo iptables -t nat -A PREROUTING -p tcp --dport 21 -j DNAT --to-destination <SERVER-VPN-IP>:21
sudo iptables -t nat -A PREROUTING -p tcp --dport 20 -j DNAT --to-destination <SERVER-VPN-IP>:20
sudo iptables -t nat -A POSTROUTING -j MASQUERADE

# Passiver Modus — zusätzlich Port-Range
sudo iptables -t nat -A PREROUTING -p tcp --dport 30000:31000 -j DNAT --to-destination <SERVER-VPN-IP>

Dauerhaft speichern:

sudo apt install iptables-persistent
sudo netfilter-persistent save

Lizenz

GPLv2+