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.
4.4 KiB
4.4 KiB
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 testfü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-Rejectionsessions.rs— Wayland/X11 Sessions aus .desktop Filespower.rs— Reboot/Shutdown via loginctli18n.rs— Locale-Erkennung (LANG / /etc/locale.conf) und String-Tabellen (DE/EN), alle UI- und Login-Fehlermeldungenfingerprint.rs— fprintd D-Bus Probe (gio::DBusProxy) — Geräteerkennung und Enrollment-Check für UI-Feedbackconfig.rs— TOML-Config ([appearance] background, gtk-theme, fingerprint-enabled) + Wallpaper-Fallback + Blur-Validierung (finite, clamp 0–200)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 viaitems-changedauf Monitor-ListModel (one greeter window per monitor, first gets keyboard), systemd-journal-loggerresources/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_blockingstatt raw Threads - Socket-Cancellation:
Arc<Mutex<Option<UnixStream>>>+AtomicBoolfür saubere Abbrüche - Avatar-Cache:
HashMap<String, gdk::Texture>inRc<RefCell<GreeterState>> - GPU-Blur via GskBlurNode:
Snapshot::push_blur()+GskRenderer::render_texture()imconnect_realizeCallback — kein CPU-Blur, kein Disk-Cache, keinimage-Crate. Blurred Texture wird perRc<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 inGreeterStategecacht, 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-loggerstatt File-Logging —journalctl -t moongreet, Debug-Level perMOONGREET_DEBUGEnv-Var - File Permissions: Cache-Verzeichnisse 0o700 via
DirBuilder::mode(), Cache-Dateien 0o600 - Testbare Persistence:
save_*_to/load_*_fromVarianten mit konfigurierbarem Pfad für Unit-Tests - Shared Wallpaper Texture:
gdk::Texturewird einmal inload_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