API-Referenz

Wichtige Klassen und Methoden für Entwickler und Mitwirkende.

Authentifizierungs-Ablauf

  1. User gibt im Login-Fenster Username + Passwort ein.
  2. UserManager.authenticate(username, password) vergleicht den Hash, leitet bei Erfolg den Session-Key ab und gibt ihn zurück.
  3. Session-Key wird in UserConnectionManager übergeben und nur in dessen Instanz gehalten.
  4. Beim Lesen einer Verbindung wird das verschlüsselte Passwort mit dem Session-Key entschlüsselt.
  5. Beim Logout: UserConnectionManager.dispose() löscht den Schlüssel aus dem RAM.

Mount- / Unmount-Ablauf

  1. UI ruft SSHFSController.mount(connection) in einem Worker-Thread auf.
  2. Bei auth_method="ask": Modal-Dialog für Passwort, sonst connection.password oder connection.key_path.
  3. Argument-Liste wird gebaut, sshfs.exe als detached Subprocess gestartet.
  4. Nach 3 s wird per list_mounts() validiert, ob das Laufwerk verfügbar ist.
  5. UI bekommt ein Signal mount_state_changed(connection_id, "mounted"|"failed", error_text).
  6. 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

  1. Settings-Dialog ändert AppSettings-Instanz.
  2. AppSettings.save() schreibt JSON.
  3. Signal settings_changed wird ausgegeben.
  4. Theme: QApplication.setStyleSheet(load_theme(name)) — kein Neustart nötig.
  5. Sprache: i18n.set_locale(code); alle Widgets re-rendern via retranslate_ui().

Öffentliche Klassen & Methoden

config.AppSettings

Methode Beschreibung
AppSettings.load() → AppSettingsLiest config.json, merged mit Defaults, gibt Instanz zurück.
save() → NoneSchreibt aktuelle Werte als JSON.
reset_to_defaults() → NoneSetzt alles auf Default und persistiert.

auth_manager.UserManager

Methode Beschreibung
create_user(username, password) → UserLegt neuen User an, hasht Passwort.
authenticate(username, password) → SessionKey | NoneLogin. Gibt bei Erfolg den abgeleiteten Session-Key zurück.
change_password(user_id, old, new) → boolRe-encryptet alle Verbindungs-Passwörter mit neuem Session-Key.
delete_user(user_id) → NoneCascade-löscht Verbindungen.

auth_manager.UserConnectionManager

Methode Beschreibung
list() → list[Connection]Alle Verbindungen des aktuellen Users.
get(id) → ConnectionEine Verbindung — Passwort entschlüsselt.
create(connection) → intAnlegen, Passwort verschlüsselt persistieren. Gibt ID zurück.
update(connection) → NoneRe-encrypt &amp; persist.
delete(id) → NoneLöschen.
by_access_key(key) → Connection | NoneVom IPC-Server für CLI-Lookup verwendet.

sshfs_controller.SSHFSController

Methode Beschreibung
mount(connection, password=None) → MountResultStartet Mount. Gibt Status + ggf. stderr zurück.
unmount(letter) → boolTrennt sauber, mit Fallback-Strategien.
list_mounts() → list[MountInfo]Aktuelle Mounts.
status_for(connection) → str"mounted" / "unmounted" / "stale".
cleanup_stale() → intRä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