Commit Graph
26 Commits
Author SHA1 Message Date
ian-at-strix 23db767cc1 Allow a held-back package once from the app, releasing the waiting download (#37)
* Hold a held-back download open so allowing it lets it through

* Allow a held-back package once from the app, releasing the waiting download
2026-10-23 10:55:03 -04:00
ian-at-strix 37a56fb7d2 Show the Windows service's blocks from the tray (#63)
The service answers the tray's requests on a named pipe, as the macOS extension answers the app's messages. The tray asks for blocks every two seconds, pops each new one up and lists the last ten in its menu.
2026-10-23 10:52:09 -04:00
ian-at-strix 4fd3021760 Create the Windows data folder with its ACL instead of setting it after (#55) 2026-10-22 18:25:28 -04:00
ian-at-strixandIan Graham Martinez e0b723a732 Keep a Windows manager tied to the firewall that runs it (#5)
On Windows the console sends Ctrl+C to both processes. The firewall
exited at once with 0xC000013A, handing the prompt back while a .cmd
shim's cmd.exe still asked "Terminate batch job (Y/N)?". It now ignores
Ctrl+C and Ctrl+Break while the manager runs and exits with its code.

A killed firewall also left the manager and its children running. The
firewall now joins a kill-on-close job before spawning, so whatever is
left dies with it.

An argument with a line break, which Rust refuses to pass to a batch
file, now says so instead of "batch file arguments are invalid".

Co-authored-by: Ian Graham Martinez <[email protected]>
2026-10-22 17:42:27 -04:00
ian-at-strix fc02226cd6 Build the machine-wide binaries only with the machine-wide feature (#67) 2026-10-22 17:38:23 -04:00
ian-at-strix da750007fc Show screening status in the Windows notification area (#14)
* Show screening status in the Windows notification area

firewall-tray.exe shows a tray icon: whether the service is screening,
paused or not running, with Pause/Resume and Open log. The MSI
starts it at every sign-in and closes it before replacing or removing it.

The icon is the Strix logo, white on a dark taskbar and black on a light
one like the macOS template image, and dimmed when not screening.
tray.png is assets/logo-transparent.png scaled and padded to 32x32:
sips -Z 32 logo-transparent.png --out a.png && sips -p 32 32 a.png --out tray.png

* Open the folder of dated service logs from the tray
2026-10-22 16:28:08 -04:00
ian-at-strix d9de2a8a94 Install machine-wide screening on Windows with an MSI (#11)
The MSI installs both binaries, registers and starts the service with a
DACL that lets interactive users start, stop and pause it, restarts it on
failure, and sets NODE_EXTRA_CA_CERTS and UV_SYSTEM_CERTS. Removing it runs
`firewall-service.exe uninstall` once the service is deleted, which clears
the hosts entries and removes the CA, its TPM key and the data folder but
the config.
2026-10-22 16:28:08 -04:00
ian-at-strix bdcc2e93dc Move the macOS uninstall out of the CLI into its own binary (#56) 2026-10-22 15:19:16 -04:00
ian-at-strixandIan Graham Martinez 9e457c4d69 Screen redirected registry traffic in a Windows service (#10)
* Screen redirected registry traffic in a Windows service

Each registry host gets its own loopback address, where a LocalSystem
service serves mitm_service, connecting upstream through a resolver that
ignores the hosts file. It trusts its CA machine-wide and serves the empty
CRL that schannel needs.

The service writes the hosts-file block once it listens. Pausing it removes
the block and continuing rewrites it; a stop, crash or shutdown leaves it,
so a restart fails closed and picks up a changed host list.

* Explain the data folder ACL and the root store arguments

* Use schannel for the root store

* Free the parsed security descriptor on drop instead of through a closure

* Rotate the service log daily with tracing-appender

---------

Co-authored-by: Ian Graham Martinez <[email protected]>
2026-10-22 14:49:36 -04:00
ian-at-strixandIan Graham Martinez 7cafa16cc4 Hold the CA key in the TPM on Windows (#9)
* Hold the CA key in the TPM on Windows

A non-exportable machine key in the TPM, or in software where there is
none, signs as the Secure Enclave key does on macOS.

* Require the TPM for the Windows CA key

A failure to open the TPM fell back to a software key, which minted a new CA
and kept it for good. Fail instead, as macOS does without a Secure Enclave.

* Use the windows crate for the TPM key

---------

Co-authored-by: Ian Graham Martinez <[email protected]>
2026-10-22 10:53:51 -04:00
ian-at-strix ba690a22e2 Block versions published under a minimum age (#17)
* Block versions published under a minimum age

* Trim comments and tidy the age filter
2026-10-21 11:09:32 -04:00
ian-at-strix b2e036f7c6 Run any command after firewall verbatim, -- included (#6)
bpaf always consumes `--`, so `firewall cargo run -- --release` handed
--release to cargo and our --config flags to the program. The CLI is now clap
with one trailing COMMAND argument, which keeps `--`.

Every manager's environment is set on every run, and cargo's and gem's flags
are added when the command is cargo or gem, so `firewall sh -c '…'` is
screened too. Since every command now gets HTTPS_PROXY, HTTPS to hosts that
aren't registries is tunnelled; registry hosts are still refused.
2026-10-12 16:55:27 -04:00
Ian ef8e45a453 cargo-dist releases 2026-09-24 16:09:48 -04:00
Ian 0351ab3672 Various minor QoL changes (message text changes), main.rs & build.sh tidied-up, etc. 2026-09-24 15:09:22 -04:00
Ian 7aac325275 Regenerated Cargo.lock 2026-09-24 14:48:30 -04:00
Ian 1b65803e2e Use which-rs to find packages (needed for npm and other non-.exes) 2026-09-24 13:17:27 -04:00
Ian 54427314d8 Apache 2 license 2026-09-24 13:14:47 -04:00
Ian 0f8479b5e8 Opt-out Telemetry 2026-09-23 19:08:10 -04:00
Ian 651e7289d2 Security Keychain -> Secure Enclave (Mac OS) 2026-09-23 15:43:41 -04:00
Ian d0c7a437c5 Bring back versioning support (TODO: minor complications with preleases) 2026-09-23 12:30:05 -04:00
Ian ef3607c45a ClientHello peeking (intercept all traffic) 2026-09-23 10:29:21 -04:00
Ian 76d52f6817 MITM Service + configability + refactors. Most of the way to MacOS on-device 2026-09-22 13:48:36 -04:00
Ian 4bcb3b5115 Fetch denylist on demand (requires GH token until repo is public) + architecture for caching/configurability 2026-09-21 12:53:18 -04:00
Ian 39839250f5 Refactor + offload escaping to more reliable third-party crates 2026-09-18 17:23:49 -04:00
Ian 5f141c729d log-levelled tracing 2026-09-18 15:41:24 -04:00
Ian 22e6e83240 Initial prototype: core functionality + aliasing, but not configurable 2026-09-18 09:33:40 -04:00