API-Referenz
Wichtige Klassen und Methoden für Entwickler und Mitwirkende.
Authentifizierungs-Ablauf
- User gibt im Login-Fenster Username + Passwort ein.
UserManager.authenticate(username, password) vergleicht den Hash, leitet bei Erfolg den Session-Key ab und gibt ihn zurück.
- Session-Key wird in
UserConnectionManager übergeben und nur in dessen Instanz gehalten.
- Beim Lesen einer Verbindung wird das verschlüsselte Passwort mit dem Session-Key entschlüsselt.
- Beim Logout:
UserConnectionManager.dispose() löscht den Schlüssel aus dem RAM.
Mount- / Unmount-Ablauf
- UI ruft
SSHFSController.mount(connection) in einem Worker-Thread auf.
- Bei
auth_method="ask": Modal-Dialog für Passwort, sonst connection.password oder connection.key_path.
- Argument-Liste wird gebaut,
sshfs.exe als detached Subprocess gestartet.
- Nach 3 s wird per
list_mounts() validiert, ob das Laufwerk verfügbar ist.
- UI bekommt ein Signal
mount_state_changed(connection_id, "mounted"|"failed", error_text).
- Unmount:
SSHFSController.unmount(letter) mit Fallback-Kette.
CLI-IPC-Ablauf
┌────────────┐ JSON-Request ┌──────────────┐
│ cli_main.py│ ─────────────────►│ ipc_server │
│ (CLI EXE) │ │ (GUI Thread)│
└────────────┘ ◄───── JSON ──────└──────────────┘
Credentials │
▼ ▼
spawn ssh UserConnMgr.lookup(key)
│
▼
SQLite + Decrypt
Pipe-Protokoll
// Request
{
"op": "connect",
"key": "<access_key>",
"exec": "<optional command>"
}
// Response (success)
{
"ok": true,
"host": "...",
"port": 22,
"user": "...",
"auth_method": "password" | "key",
"password": "...",
"key_path": "...",
"exec": "..."
}
// Response (error)
{ "ok": false, "error": "invalid_key" | "no_session" | "cli_disabled" }
Einstellungs-Ablauf
- Settings-Dialog ändert
AppSettings-Instanz.
AppSettings.save() schreibt JSON.
- Signal
settings_changed wird ausgegeben.
- Theme:
QApplication.setStyleSheet(load_theme(name)) — kein Neustart nötig.
- Sprache:
i18n.set_locale(code); alle Widgets re-rendern via retranslate_ui().
Öffentliche Klassen & Methoden
config.AppSettings
| Methode |
Beschreibung |
AppSettings.load() → AppSettings | Liest config.json, merged mit Defaults, gibt Instanz zurück. |
save() → None | Schreibt aktuelle Werte als JSON. |
reset_to_defaults() → None | Setzt alles auf Default und persistiert. |
auth_manager.UserManager
| Methode |
Beschreibung |
create_user(username, password) → User | Legt neuen User an, hasht Passwort. |
authenticate(username, password) → SessionKey | None | Login. Gibt bei Erfolg den abgeleiteten Session-Key zurück. |
change_password(user_id, old, new) → bool | Re-encryptet alle Verbindungs-Passwörter mit neuem Session-Key. |
delete_user(user_id) → None | Cascade-löscht Verbindungen. |
auth_manager.UserConnectionManager
| Methode |
Beschreibung |
list() → list[Connection] | Alle Verbindungen des aktuellen Users. |
get(id) → Connection | Eine Verbindung — Passwort entschlüsselt. |
create(connection) → int | Anlegen, Passwort verschlüsselt persistieren. Gibt ID zurück. |
update(connection) → None | Re-encrypt & persist. |
delete(id) → None | Löschen. |
by_access_key(key) → Connection | None | Vom IPC-Server für CLI-Lookup verwendet. |
sshfs_controller.SSHFSController
| Methode |
Beschreibung |
mount(connection, password=None) → MountResult | Startet Mount. Gibt Status + ggf. stderr zurück. |
unmount(letter) → bool | Trennt sauber, mit Fallback-Strategien. |
list_mounts() → list[MountInfo] | Aktuelle Mounts. |
status_for(connection) → str | "mounted" / "unmounted" / "stale". |
cleanup_stale() → int | Räumt verwaiste Mountpoints auf. |
single_instance.SingleInstance
with SingleInstance("SSHWinManager_Mutex_v1") as inst:
if not inst.acquired:
inst.activate_existing_window()
sys.exit(0)
run_app()
Generierte API-Dokumentation (optional)
Variante A — pdoc
pip install pdoc
pdoc -o site/api src/
Variante B — MkDocs Material + mkdocstrings
pip install mkdocs-material mkdocstrings[python]
mkdocs serve