Skip to content

Support mutable users#38

Merged
nikstur merged 3 commits intomainfrom
mutable-users
Jan 26, 2026
Merged

Support mutable users#38
nikstur merged 3 commits intomainfrom
mutable-users

Conversation

@nikstur
Copy link
Copy Markdown
Owner

@nikstur nikstur commented Jan 26, 2026

Supersedes #36

In non-nixos settings, it is frequent that some users/groups are created
by default by the distribution, or impurely by the user. Because
Userborn is stateless, those users/groups are disabled when they are not
included in the Userborn configuration.

With this change, this can now be accomodated. Users can be created
impurely/imperatively and are not disabled by Userborn if they were not
previously managed by Userborn.

Userborn now looks at the previous config to determine whether to
disable users or drain groups. In the mutable users mode users/groups
are only disabled/drained if they were already contained in the previous
config.

This commit was inspired by Julien's work which made me consider this
issue in the first place and his implementation helped me to think of a
way that this can be implemented more elegantly in my opinion.

Co-authored-by: Julien Malka <julien@malka.sh>
@nikstur nikstur merged commit f6f051c into main Jan 26, 2026
1 check passed
@nikstur nikstur deleted the mutable-users branch January 26, 2026 17:22
jfroche added a commit to numtide/system-manager that referenced this pull request Jan 27, 2026
mutable users handling has been merged into userborn with nikstur/userborn#38
This commit update system-manager to use the new userborn features and
properly sequence userborn execution during activation and deactivation.

System manager ensure users exist before tmpfiles runs and managed
accounts are locked on deactivation.

Activation changes:
- Restart userborn.service after daemon-reload but before tmpfiles
- Use restart (not start) because userborn is a oneshot service with
  RemainAfterExit=true - start on an already-active service is a no-op

Deactivation changes:
- Move user locking logic from Nix shell script to Rust engine
- Add users.rs module with lock_managed_users() that calls userborn
  with empty config to lock previously managed accounts
- Set USERBORN_MUTABLE_USERS=true so only managed users are locked,
  not stateful users created outside userborn
- Create top-level deactivate.rs module for cleaner API naming
jfroche added a commit to numtide/system-manager that referenced this pull request Feb 3, 2026
mutable users handling has been merged into userborn with nikstur/userborn#38
This commit update system-manager to use the new userborn features and
properly sequence userborn execution during activation and deactivation.

System manager ensure users exist before tmpfiles runs and managed
accounts are locked on deactivation.

Activation changes:
- Restart userborn.service after daemon-reload but before tmpfiles
- Use restart (not start) because userborn is a oneshot service with
  RemainAfterExit=true - start on an already-active service is a no-op

Deactivation changes:
- Move user locking logic from Nix shell script to Rust engine
- Add users.rs module with lock_managed_users() that calls userborn
  with empty config to lock previously managed accounts
- Set USERBORN_MUTABLE_USERS=true so only managed users are locked,
  not stateful users created outside userborn
- Create top-level deactivate.rs module for cleaner API naming
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant