Ensure code is not run as root #414
Closed
opened 2026-06-04 07:55:30 +00:00 by guettli
·
2 comments
No Branch/Tag Specified
main
issue-563-agentloop-validation
dummy-pr-test
issue-560-fix-firebase-run-url
issue-539-stable-imap-uid
issue-533-shared-email-list
plan-issue-555
drop-nix
plan-issue-484
plan-issue-539
plan-issue-535
plan-issue-474
plan-issue-533
fix-dagger-engineless-precommit
issue-521-fix-deploy-yml-wait-time-api
issue-502-fix-email-id-collision-mailbox
issue-492-eliminate-duplicate-build-runner
issue-494-website-change-detection
issue-491-parallelize-check
issue-478-fix-stalwart-dual-stack-bind
issue-475-allowed-addresses-glob
issue-473-search-result-reorder
issue-453-update-agentloop-defaults
issue-466-structured-search
issue-505-exclude-chaos-monkey-from-regular-ci
issue-509-fix-search-result-sorting
fix-ink-sparkle-remaining-tests
issue-506-fix-search-emails-tests
issue-504-runner-wait-time
issue-488-search-notes
issue-472-changelog-issue-links
issue-501-folder-search-local-sqlite
issue-486-fix-stale-test-shader-mismatch
fix/prevent-settled-search-rerun-473
issue-467-fix-search-stale-results
issue-446-installed-versions-in-changelog
issue-462-fix-pr
issue-448-chaos-monkey-test
issue-436-notes-on-emails
issue-429-unify-mail-display
issue-422-move-to-folder-create-new
issue-414-ensure-not-run-as-root
issue-424-unify-email-list-views
issue-419-trusted-senders-page
issue-425-fix-prs
test-foo
issue-421-bug-report
issue-383-fix-ci
issue-394-fix-deploy-flutter-version
issue-391-fix-ci-double-trigger
issue-376-combined-inbox-v2
issue-376-combined-inbox
issue-384-fix-open-prs
sops-migrate
issue-339-safe-first-on-imap-fetch
issue-340-try-catch-measure-height
issue-342-pin-intl-version
issue-341-guard-threademails-last
issue-335-agentloop-code-test
issue-329-fix
issue-315-fix
issue-320-fix
issue-325-fix
issue-312-fix
issue-311-fix
issue-305-fix
issue-304-fix
issue-299-fix
issue-300-fix
issue-298-fix
issue-296-fix
issue-294-fix
issue-289-fix
issue-288-fix
issue-287-fix
issue-286-fix
issue-277-fix
issue-282-fix
issue-280-fix
issue-272-fix
issue-268-fix
issue-267-fix
issue-266-fix
issue-258-fix
issue-260-fix
issue-257-fix
issue-253-fix
issue-216-fix
issue-251-fix
issue-249-fix
issue-question-fixes
issue-235-fix
issue-236-fix-v2
issue-237-fix
issue-236-fix
issue-228-fix
issue-217-fix
issue-214-fix
issue-213-fix
issue-208-fix
issue-205-fix
issue-204-fix
issue-203-fix
issue-202-fix
issue-129-fix
issue-161-fix
issue-160-fix
issue-201-fix
issue-210-fix
issue-198-fix
issue-200-fix
issue-144-fix
issue-199-fix
fix/playstore-upload-use-requests
issue-193-fix
issue-186-fix
issue-185-fix
issue-192-fix
issue-183-fix
issue-175-fix
issue-172-fix
issue-171-fix
issue-167-fix
issue-136-fix
issue-162-fix
issue-179-fix
issue-155-fix
issue-154-fix
issue-152-fix
issue-151-fix
issue-141-fix
issue-150-fix
issue-164-fix
migrate-to-dagger
task/d1-ci-matrix
task/a4-typeconverter-json
task/u7-onboarding-walkthrough
task/d3-sync-doc
task/a5-layer-boundary-lint
task/t5-golden-tests
task/p5-date-cache
task/s4-link-handling
task/p3-html-parse-isolate
task/u8-mark-all-read
task/u3-recent-searches
task/a3-jmap-injectable-http-client
task/r5-tls-error-handling
fix/playstore-redirect-retry
task/t3-repository-contract-tests
task/p2-email-list-pagination
task/p1-fts5-search
fix/playstore-upload-timeout
task/a1-email-detail-notifier
fix/upgrade-workmanager-0.9
fix/android-core-library-desugaring
task/p4-db-indexes
task/r3-html-error-boundary
task/d2-check-coverage
task/a2-email-tile
task/t4-migration-tests
task/t2-widget-tests
task/t1-email-repo-coverage
task/u6-connection-status
task/u4-push-notifications
task/u2-draft-sync
task/u1-list-unsubscribe
task/s2-hostname-validation
task/r6-reliability-fuzz-tests
task/r4-sync-error-banner
task/r2-force-resync
task/r1-undo-history-persistence
No results found.
Labels
Clear labels
NeedSupervisor
State/InProgress
State/Later
State/Planned
automerge
ci-failure
do-not-merge
loop/code
loop/code-ci-pending
loop/code-done
loop/code-in-process
loop/merge
loop/merge-done
loop/merge-in-process
loop/plan
loop/plan-done
loop/plan-in-process
Issue escalated to a human supervisor; agentloop will skip it until cleared.
Eligible for automatic merge by CI
Issue opened by agentloop to track a failing CI workflow; used for deduplication.
Plan PR — review only, do not merge.
Add to run the built-in "code" prompt; override at prompts/code.md.
Prompt "code" finished; waiting for the PR's CI to pass before advancing.
Prompt "code" finished successfully.
Agent for the "code" prompt is currently running on this issue.
Managed by agentloop
Managed by agentloop
Managed by agentloop
Add to run the built-in "plan" prompt; override at prompts/plan.md.
Prompt "plan" finished successfully.
Agent for the "plan" prompt is currently running on this issue.
No labels
loop/code-done
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: guettli/sharedinbox#414
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ensure code is not run as root
Goal
Ensure that developer commands, runner scripts, and test suites are not executed as the
rootuser, particularly when interacting with host-level binaries or wrappers.Action Items
rootuser.rm -finstead of blindly overwriting them via redirection.I have everything I need. Here is the implementation plan:
Implementation Plan for Issue #414: Ensure code is not run as root
Audit findings
Taskfile.ymlnor any shell script currently rejects execution as root.root@localhostSSH found —scripts/setup_dagger_remote.shSSHes asdagger@$DAGGER_ENGINE_HOST;deploy.shuses the configurable$SSH_USER;DEVELOPMENT.mdalready recommendsssh $DEV_USER@localhost. No changes needed for SSH user policy.scripts/setup_dagger_remote.sh:53usesecho "$DAGGER_SSH_KEY" > ~/.ssh/dagger_key, which silently clobbers an existing symlink's target rather than replacing the file entry. A precedingrm -fis the fix./root/.ssh/inci/main.go) — this is expected and isolated to Dagger container layers, not host execution.Changes
1.
Taskfile.yml— add non-root precondition to_preflight_preflightis the shared dependency for all local task commands (analyze,test,test-widget,format,build-linux,check-fast, etc.). Add one entry to itspreconditions:block:This is the minimal, centrally-enforced gate. Dagger-only tasks (
test-backend,integration-ui,sync-reliability,check-dagger) do not pass through_preflight; they run in containers where root is acceptable, so no change is needed there.2. Add non-root guard to directly-invocable scripts
The following scripts can be invoked directly (via CI entrypoints or manually), bypassing Taskfile:
stalwart-dev/test.shstalwart-dev/integration_ui_test.shstalwart-dev/integration_android_test.shscripts/setup_dagger_remote.shdeploy.shInsert the following line immediately after
set -euo pipefail(orset -Eeuo pipefail) in each:Scripts invoked only via Taskfile (
scripts/run_unit_tests.sh,scripts/run_widget_tests.sh, etc.) are already covered by the_preflightgate and do not need their own guard.3.
scripts/setup_dagger_remote.sh:53— safe SSH key writeReplace:
with:
This ensures an existing stale file or symlink is removed before the new key is written, preventing silent clobbering.
No schema or Dart code changes
These are all shell/YAML changes. No
dart run build_runnerrun is needed.Done. Here's a summary of what was implemented:
What changed
Issue #414 — Ensure code is not run as root
Three categories of changes, 8 lines total:
1.
Taskfile.yml—_preflightpreconditionAdded a
[ "$(id -u)" != "0" ]check as the first precondition in_preflight. Since virtually every localtaskcommand (task check,task test,task analyze,task build-linux, etc.) depends on_preflight, this is a single central gate that blocks root execution for all local task work.2. Root guard in five directly-invocable scripts
Scripts that CI or developers can run outside of
tasknow each include the same one-liner guard immediately afterset -e:deploy.shscripts/setup_dagger_remote.shstalwart-dev/test.shstalwart-dev/integration_ui_test.shstalwart-dev/integration_android_test.sh3.
scripts/setup_dagger_remote.sh— safe SSH key writeAdded
rm -f ~/.ssh/dagger_keybefore theecho "$DAGGER_SSH_KEY" > ~/.ssh/dagger_keyline, so any existing file or symlink at that path is explicitly removed rather than silently clobbered via shell redirection.Audit result: No
root@localhostSSH patterns found anywhere in the scripts.setup_dagger_remote.shusesdagger@$DAGGER_ENGINE_HOST;deploy.shuses the configurable$SSH_USER;DEVELOPMENT.mdalready correctly recommendsssh $DEV_USER@localhost. No changes needed for SSH user policy.PR: https://codeberg.org/guettli/sharedinbox/pulls/433