Skip to content

Optional local password rotation - #21

Open
smithjw wants to merge 4 commits into
Macjutsu:mainfrom
smithjw:feat/local-password-rotation
Open

Optional local password rotation#21
smithjw wants to merge 4 commits into
Macjutsu:mainfrom
smithjw:feat/local-password-rotation

Conversation

@smithjw

@smithjw smithjw commented Aug 14, 2026

Copy link
Copy Markdown
  • New optional local password rotation workflow that guides the user to change their local account password (so it no longer matches their IdP password) before Platform SSO registration. This is aimed at Secure Enclave deployments where the local password is decoupled from the IdP password. The new PASSWORD_ROTATION_CONFIG parameter supports "REQUIRED" or "OPTIONAL"; any other value, including blank "", disables the workflow.
  • The workflow never captures the password. It opens the password System Settings and nudges the user, then confirms the change by watching the local account's password last set time advance past a baseline. The baseline (the password last set time seen on pseudo's first run for that user) is persisted per user, so this behaves as a one-time migration rather than a recurring password policy.
  • Rotation is best effort by design. Because pseudo never sees the password, it can confirm that the password changed but not that the new password is different from the IdP password.
  • New optional PASSWORD_ROTATION_GRACE_DAYS parameter. If the local password was set within this many days, rotation is treated as already satisfied so recently changed users are not prompted. A blank "" or "0" value disables the grace period.
  • New com.macjutsu.pseudo managed preference support so PASSWORD_ROTATION_CONFIG and PASSWORD_ROTATION_GRACE_DAYS can be set from Jamf Pro, Intune, or any MDM that delivers a configuration profile. Per-user workflow state is persisted to /Library/Preferences/com.macjutsu.pseudo.plist.
  • swiftDialog is now kept when its installed version is at or above SWIFT_DIALOG_MINIMUM_VERSION, instead of requiring an exact version match, so a newer swiftDialog is no longer reinstalled on every run.

- New PASSWORD_ROTATION_CONFIG and PASSWORD_ROTATION_GRACE_DAYS options
- Settable via com.macjutsu.pseudo managed preference
- Guard grace period against negative age
- Validate state writes and set the state plist to 644
- Detect System Settings without matching the localized pane title
- Only a required rotation blocks the run
- Remove stale comment; note rotation is best effort
Keeps a newer installed swiftDialog instead of reinstalling on every run.
@Macjutsu

Copy link
Copy Markdown
Owner

Wow... these are all great additions!

There is also a LOT to review.... but on a currsory look I really appreciate that you did a great job in copying the style of my orginal code.

I'm currently neck deep in a super rewrite, but I'll try to get to reviewing/testing this next week.

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.

2 participants