4.2 KiB
4.2 KiB
Changelog
0.1.0 — Unreleased
first public release
What's In
- tui login screen with username/password fields, session switcher, and status messages
- supports x11, wayland, and tty sessions
- pam authentication via cgo (thread-locked for safety)
- faillock integration — detects lockouts, shows remaining attempts, admin bypass via ctrl+u
- conway's game of life background rendered at 30 fps with unicode half-block characters
- spring animation on switcher transitions
- shake animation on failed login
- caps lock indicator via ioctl
- configurable power controls (shutdown/reboot on f1/f2 by default)
- toml configuration with
$VARIABLEsubstitution - preview mode (
--preview) to test the login screen without leaving your session - utmpx user accounting (glibc only)
- x11 session setup — xauthority cookies, sigusr1 handshake, server timeout
- privilege dropping for child processes
- log piping with 64 mb cap
Recent Fixes
- utmpx time field portability — replaced hardcoded
C.__uint32_t/C.__int32_tcasts with a C helper function (auth/utmpx_time.h) that lets the compiler handle type conversion. fixes build failure on systems whereut_tvusesstruct timevalinstead of the 32/64 compat struct - cgo pointer safety for pam — replaced
unsafe.Pointer(&h)(Go stack pointer passed to C) withstoreHandle/loadHandlehelpers that keep thecgo.Handlein C-heap memory. fixescgo argument has Go pointer to unpinned Go pointerpanic on Go 1.22+ - pam conversation callback — fixed
unsafe.Sliceusing&r(pointer-to-pointer) as the backing array instead ofr(the calloc'd response array), which wrote password bytes into random stack memory. also now only responds toPAM_PROMPT_ECHO_OFF/PAM_PROMPT_ECHO_ONmessages — info and error messages get nil. fixespam_unix: auth could not identify password - cgo handle lifecycle — moved
cgo.Handleand its C-heap backing fromValidate(where they weredefer-freed on return) into theCredentialsstruct so they stay alive throughOpenSessionand untilCloseSession. fixesmisuse of an invalid Handlepanic - session spawning — replaced the broken
ForkExec(which relaunched the same binary with made-up flags) with a directsession.Spawncall that drops privileges and runs the desktop in-process. fixesflag provided but not defined: -user - renamed extra/ files —
lemurs.pam→latchd.pam,lemurs.service→latchd.service - readme credits — added a credits section acknowledging lemurs for the
extra/directory structure and session scanning approach - makefile
enableandupdatetargets —make enablestops any running DM, disables the aliased display-manager, and enables latchd.make updateruns uninstall → git pull → reinstall in one command - missing
extra/directory — addedextra/config.toml,extra/xsetup.sh,extra/lemurs.pam, andextra/lemurs.servicesomake installcan find them - makefile
depstarget — addedmake depsto automatically installlibpam0g-devandbuild-essential, and verify go is present - readme overhaul — rewrote for clarity: added "what problem does this solve", "how it works", known issues, simpler install instructions, and proper dependency listing
- view cleanup — removed the non-functional automata background overlay from
View()(theFrame()was never called, and the black-space placeholder causedEEEEgarbage characters on some terminals). also removed a hardcoded 80-char width on the top bar so it adapts to the terminal - session environment setup —
spawnSessionnow callsSetBasicVariables,SetDisplay,SetSessionParams,SetSeatVars,SetSessionVars, andSetXDGCommonPathsbefore spawning the desktop. fixessetupXfailing immediately withmissing DISPLAY/XDG_VTNR/HOME env varsbecause none were set
What's Missing
- no tests
- session leader is the latchd process, not the desktop — pam session tracking via systemd-logind may be imperfect
- not all config options affect the rendering yet
- occasional terminal state corruption on abrupt exit
- automata background rendered as tick-only visual (not wired into the view yet)