greetd-moongreet/CLAUDE.md
nevaforget 226bbb75e4 Rewrite moongreet from Python to Rust (v0.3.0)
Complete rewrite of the greetd greeter from Python/PyGObject to Rust/gtk4-rs
for consistency with moonset, single binary without Python runtime, and
improved security through Rust memory safety.

Modules: main, greeter, ipc, config, i18n, users, sessions, power
86 unit tests covering all modules including login_worker IPC flow.
Security hardening: shell-word splitting for exec_cmd, absolute path
validation for session binaries, session-name sanitization, absolute
loginctl path, atomic IPC writes.
2026-03-27 22:08:33 +01:00

2.2 KiB

Moongreet

Name: Selene (Mondgöttin — passend zu Moon-greet)

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, wallpaper.jpg, default-avatar.svg)
  • config/ — Beispiel-Konfigurationsdateien für /etc/moongreet/ und /etc/greetd/

Kommandos

# Tests ausführen
cargo test

# Release-Build
cargo build --release

# Greeter starten (nur zum Testen, braucht normalerweise greetd)
LD_PRELOAD=/usr/lib/libgtk4-layer-shell.so ./target/release/moongreet

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)
  • config.rs — TOML-Config ([appearance] background, gtk-theme) + Wallpaper-Fallback
  • greeter.rs — GTK4 UI (Overlay-Layout), Login-Flow via greetd IPC, Faillock-Warnung, Avatar-Cache, Last-User/Last-Session Persistence
  • main.rs — Entry Point, GTK App, Layer Shell Setup, Multi-Monitor
  • 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>>
  • Symmetrie mit moonset: Gleiche Patterns (i18n, config, users, power, GResource)