Skip to content

feat: Tails+Whonix support (rebased continuation of #634) - #1209

Open
stffinfcti wants to merge 31 commits into
eigenwallet:masterfrom
stffinfcti:bounty/453-tails-whonix
Open

stffinfcti wants to merge 31 commits into
eigenwallet:masterfrom
stffinfcti:bounty/453-tails-whonix

Conversation

@stffinfcti

Copy link
Copy Markdown

What this is

This is a rebase and continuation of #634 by @nabijaczleweli onto current master. The bulk of the code is theirs — this PR exists because #634 has been stalled since January on a rebase request (plus a reported "Failed to initialize Bitcoin wallet / EOF while parsing a value" failure), and I wanted to move it forward for #453.

My delta on top of nabijaczleweli's commits:

  • merge of current master (conflict resolution in swap/cli, monero-sys wallet-open helpers, electrum test configs)
  • fix(monero-rpc-pool): pair_to_socks connected IP-literal targets to a hardcoded port 10 — it now uses the real port, with regression coverage for non-10 IP:port pairs
  • fix(swap-tor): Tails detection also accepts unquoted ID=tails in /etc/os-release
  • fix(monero-rpc-pool): enable tokio-rustls/ring so the standalone binaries build without relying on workspace feature unification
  • Cargo.lock regenerated without the unrelated windows-sys/socket2/proc-macro-crate/windows-core churn
  • docs: tails_whonix.mdx notes that the standalone monero-rpc-pool binaries don't consult TOR_ENVIRONMENT
  • gui: separator between the Tor tooltip and the forced-Tor excuse string

The Revert "security(tauri): enable CSP (#851)" commit in the stack is maintainer-requested (from the #634 review) and is now a no-op — upstream reverted it separately in 8f909f1.

Testing

  • cargo check over all changed crates + unstoppableswap-gui-rs (--all-features --all-targets) — clean, pre-existing warnings only
  • cargo test -p swap-tor -p monero-rpc-pool --lib — pass, including the new non-10 IP:port cases
  • src-gui: tsc --noEmit, eslint, vitest (5/5) clean
  • Not run here: docker e2e suite and real Tails/Whonix hardware — runtime verification was done by nabijaczleweli on feat: Tails+Whonix support #634

AI usage

The rebase, merge resolution, and follow-up fixes were prepared with AI assistance (Devin). Disclosed per the AI policy.

Bounty

Per the issue's "distributed among the contributors" clause, I expect the payout to be split with @nabijaczleweli, who wrote the original implementation and did the manual Tails/Whonix testing — flagging for @binarybaron to coordinate the split.

Bounty payout: @stffinfcti (to be split with @nabijaczleweli)
XMR payout address: 4AAuZiKFKLE8HWSUzMkjqHiNRG1n1ZF47cPdQM9K9rNPZZHxRdtXNTRNeNEUoMY86wTbBqbJwhpWecFyT4bzMwH31dDWjcG

Closes #453

nabijaczleweli and others added 30 commits January 14, 2026 20:21
asb::network::transport::new() would use DNS(Tor or TCP),
which will resolve DNS queries over plaintext first,
before calling them over Tor

Cf. cli::transport::new() which correctly does Tor or DNS(TCP)

Fix the former to do the latter, delegating domain resolution over Tor as well
…user about listening on TCP/Onion if the environment doesn't support it (TUI questionnaire)
Bypassing Tor on TorBackend::Socks breaks everything,
because /all/ traffic needs to go through the proxy
(normal connect() is broken on Tails)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Union ElectrumBalancerConfig socks5 field with upstream
min_parallel_responses; regenerate Cargo.lock for the new
swap-tor workspace member; pass TorBackend::None to the swarm
builders in the test harness.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Documents that the GUI detects Tails/Whonix automatically,
forces routing through the system Tor daemon, and disables
hidden-service (maker) support there. Covers Tails Persistent
Storage for the AppImage and wallet data directory.

Updates eigenwallet#453

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…lver

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
cargo clippy --workspace --all-targets (deny-by-default never_loop) failed
on three master-side loops that return on their first iteration. Apply the
clippy suggestion (if let instead of loop) which preserves behavior.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- pair_to_socks: use the passed port for Ipv4/Ipv6 TargetAddr::Ip instead
  of a hardcoded 10; extend the unit test with non-10 IP:port cases
- Cargo.toml: enable tokio-rustls/ring so the standalone binaries compile
  outside workspace feature unification
- swap-tor: accept unquoted ID=tails in /etc/os-release
- Cargo.lock: drop unrelated resolver churn (windows-sys, socket2,
  proc-macro-crate, windows-core edge bumps)
- docs: note standalone monero-rpc-pool binaries ignore TOR_ENVIRONMENT
- gui: separate torForced excuse from the Tor tooltip text

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

This branch has not been deployed

No deployments
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.789 XMR] Tails/Whonix Support

2 participants