greetd-moongreet/CLAUDE.md
nevaforget 448e4212e3 docs: drop Selene persona, unify attribution on ClaudeCode
Remove the Selene persona block from CLAUDE.md and rewrite prior
DECISIONS entries from Selene to ClaudeCode for consistency with
the rest of the Moonarch ecosystem.
2026-04-21 09:03:21 +02:00

4.4 KiB
Raw Blame History

Moongreet

Projekt

Moongreet ist ein greetd-Greeter für Wayland, gebaut mit Rust + gtk4-rs + gtk4-layer-shell. Teil des Moonarch-Ökosystems.

Tech-Stack

  • Rust (Edition 2024), gtk4-rs 0.11, glib 0.22
  • gtk4-layer-shell 0.8 für Wayland Layer Shell (TOP Layer)
  • greetd IPC über Unix Domain Socket (length-prefixed JSON)
  • cargo test für Unit-Tests

Projektstruktur

  • src/ — Rust-Quellcode (main.rs, greeter.rs, ipc.rs, config.rs, users.rs, sessions.rs, i18n.rs, power.rs)
  • resources/ — GResource-Assets (style.css, default-avatar.svg)
  • config/ — Beispiel-Konfigurationsdateien für /etc/moongreet/ und /etc/greetd/
  • pkg/ — PKGBUILD für Arch-Linux-Paketierung (makepkg -sf)

Kommandos

# Tests ausführen
cargo test

# Release-Build
cargo build --release

# Greeter im Fenster starten (ohne greetd/Layer Shell)
MOONGREET_NO_LAYER_SHELL=1 ./target/release/moongreet

# Paket bauen und installieren
cd pkg && makepkg -sf && sudo pacman -U moongreet-git-<version>-x86_64.pkg.tar.zst

Architektur

  • ipc.rs — greetd Socket-Kommunikation (4-byte LE header + JSON)
  • users.rs — Benutzer aus /etc/passwd, Avatare (AccountsService + ~/.face), Symlink-Rejection
  • sessions.rs — Wayland/X11 Sessions aus .desktop Files
  • power.rs — Reboot/Shutdown via loginctl
  • i18n.rs — Locale-Erkennung (LANG / /etc/locale.conf) und String-Tabellen (DE/EN), alle UI- und Login-Fehlermeldungen
  • fingerprint.rs — fprintd D-Bus Probe (gio::DBusProxy) — Geräteerkennung und Enrollment-Check für UI-Feedback
  • config.rs — TOML-Config ([appearance] background, gtk-theme, fingerprint-enabled) + Wallpaper-Fallback + Blur-Validierung (finite, clamp 0200)
  • greeter.rs — GTK4 UI (Overlay-Layout), Login-Flow via greetd IPC (Multi-Stage-Auth für fprintd), Faillock-Warnung, Avatar-Cache, Last-User/Last-Session Persistence (0o700 Dirs, 0o600 Files)
  • main.rs — Entry Point, GTK App, Layer Shell Setup, Multi-Monitor mit Hotplug via items-changed auf Monitor-ListModel (one greeter window per monitor, first gets keyboard), systemd-journal-logger
  • resources/style.css — Catppuccin-inspiriertes Theme

Design Decisions

  • TOP Layer statt OVERLAY: Greeter läuft unter greetd, nicht über Waybar
  • GResource-Bundle: CSS, Wallpaper und Default-Avatar sind in die Binary kompiliert
  • Async Login: glib::spawn_future_local + gio::spawn_blocking statt raw Threads
  • Socket-Cancellation: Arc<Mutex<Option<UnixStream>>> + AtomicBool für saubere Abbrüche
  • Avatar-Cache: HashMap<String, gdk::Texture> in Rc<RefCell<GreeterState>>
  • GPU-Blur via GskBlurNode: Snapshot::push_blur() + GskRenderer::render_texture() im connect_realize Callback — kein CPU-Blur, kein Disk-Cache, kein image-Crate. Blurred Texture wird per Rc<RefCell<Option<gdk::Texture>>> über alle Monitore gecacht (1x GPU-Renderpass statt N).
  • Fingerprint via greetd Multi-Stage PAM: fprintd D-Bus nur als Probe (Gerät/Enrollment), eigentliche Verifizierung läuft über PAM im greetd-Auth-Loop. auth_message_type: "secret" → Passwort, alles andere → None (PAM entscheidet). 60s Socket-Timeout bei fprintd. Device-Proxy in GreeterState gecacht, Generation-Counter gegen Race Conditions bei schnellem User-Switch.
  • Symmetrie mit moonlock/moonset: Gleiche Patterns (i18n, config, users, power, GResource, GPU-Blur)
  • Session-Validierung: Relative Pfade erlaubt (greetd löst PATH auf), nur ../Null-Bytes werden abgelehnt
  • GTK-Theme-Validierung: Nur alphanumerisch + _-+. erlaubt, verhindert Path-Traversal über Config
  • Journal-Logging: systemd-journal-logger statt File-Logging — journalctl -t moongreet, Debug-Level per MOONGREET_DEBUG Env-Var
  • File Permissions: Cache-Verzeichnisse 0o700 via DirBuilder::mode(), Cache-Dateien 0o600
  • Testbare Persistence: save_*_to/load_*_from Varianten mit konfigurierbarem Pfad für Unit-Tests
  • Shared Wallpaper Texture: gdk::Texture wird einmal in load_background_texture() dekodiert und per Ref-Count an alle Fenster geteilt — vermeidet redundante JPEG-Dekodierung pro Monitor
  • Wallpaper-Validierung: GResource-Zweig via resources_lookup_data() + from_bytes() (kein Abort bei fehlendem Pfad), Dateigröße-Limit 50 MB, non-UTF-8-Pfade → None
  • Error-Detail-Filterung: GDK/greetd-Fehlerdetails nur auf debug!-Level, warn! ohne interne Details — verhindert Systeminfo-Leak ins Journal