Ask for the sudo password once per omarchy update (#13323)
* Ask for the sudo password once per omarchy update Every sudo call in omarchy update prompted, because the no-update wrapper covered the whole run on top of per-phase revokes, and stay-awake revoked the timestamp on its own entry and exit. A single update could ask four times before the snapshot finished (#13319). Authorize once, right after confirmation, starting from a revoked timestamp so the prompt always belongs to this update. A background keepalive refreshes it until the update is done. Prune, snapshot, stay-awake, keyring, system packages, migrations, orphan removal, service restarts, the post-update hook, and mise all share that authorization. AUR builds run third-party PKGBUILD code, so they move to the end and run cold: the keepalive stops, the timestamp is revoked, and yay and any bare sudo use the no-update wrapper. The timestamp is revoked again after AUR and on every exit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the single authorization for passwordless sudo and ttyless inhibition Authorize by running a command instead of sudo -v. Under the default verifypw=all, -v prompts even when passwordless sudo is enabled, which would have added a prompt those users never had. Inside an update without a terminal, stay-awake now reuses the update's authorization with a non-interactive sudo instead of asking again through polkit. It falls back to polkit only if that authorization is gone. The test sudo refuses a cold non-interactive call, as the real one does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
7b336b1b0d
commit
e1614f2bdb
9 files changed
+163
-51
No files matched your search
@@ -20,15 +20,29 @@ for args in '-y' ''; do
|
||||
touch "$SUDO_TEST_CACHE"
|
||||
run_update $args || fail "update failed" "$(<"$boundary_tmp/output")"
|
||||
assert_boundary_cold "successful update"
|
||||
grep -q '^sudo -N /usr/bin/true$' "$SUDO_TEST_LOG" || fail "update package helpers must use no-update sudo"
|
||||
python3 - "$SUDO_TEST_LOG" <<'PY'
|
||||
import sys
|
||||
s=open(sys.argv[1]).read().splitlines()
|
||||
positions=[next(i for i,line in enumerate(s) if line.startswith(prefix)) for prefix in ['step:omarchy-update-restart --services-only','step:yay','step:omarchy-hook post-update','step:omarchy-update-mise','step:omarchy-update-stay-awake stop','step:omarchy-update-restart --reboot-only']]
|
||||
# A cached credential from before the update is revoked, then the update
|
||||
# authorizes exactly once before any step that could need sudo.
|
||||
assert s[0]=='sudo -k', s
|
||||
# Authorization runs a command (sudo -v prompts even with passwordless sudo).
|
||||
prune=s.index('step:omarchy-update-pkg-prune ')
|
||||
auth=s.index('sudo /usr/bin/true')
|
||||
assert auth < prune, s
|
||||
assert [l for l in s[:prune] if l.startswith('sudo ') and l not in ('sudo -k','sudo -h')]==['sudo /usr/bin/true'], s
|
||||
assert 'sudo -v' not in s, s
|
||||
positions=[next(i for i,line in enumerate(s) if line.startswith(prefix)) for prefix in ['step:omarchy-update-system-pkgs','step:omarchy-migrate','step:omarchy-update-restart --services-only','step:omarchy-hook post-update','step:omarchy-update-mise','step:yay','step:omarchy-update-stay-awake stop','step:omarchy-update-restart --reboot-only']]
|
||||
assert positions==sorted(positions), s
|
||||
assert not any(line.startswith('sudo -N ') for line in s[positions[2]:]), s
|
||||
yay=positions[5]
|
||||
# Everything before AUR shares the one authorization: plain sudo, no revokes.
|
||||
assert not any(line=='sudo -k' or line.startswith('sudo -N ') for line in s[auth:positions[4]]), s
|
||||
assert 'sudo /usr/bin/true' in s[auth:positions[0]+1], s
|
||||
# AUR builds start from a revoked credential and cannot refresh one.
|
||||
assert 'sudo -k' in s[positions[4]:yay], s
|
||||
assert not any(line.startswith('sudo ') and line!='sudo -k' and not line.startswith('sudo -N ') for line in s[yay:]), s
|
||||
PY
|
||||
pass "update $args runs privileged phases before hooks and exits cold"
|
||||
pass "update $args authorizes once for everything but AUR, which runs cold last, and exits cold"
|
||||
done
|
||||
|
||||
for step in omarchy-update-system-pkgs yay omarchy-hook omarchy-update-mise; do
|
||||
|
||||
Reference in new issue
Block a user