diff options
| author | Christophe Besson <cbesson@gmail.com> | 2026-09-04 16:08:06 +0200 |
|---|---|---|
| committer | Christophe Besson <cbesson@gmail.com> | 2026-09-04 16:08:06 +0200 |
| commit | a4aabd1d33770d6199a8cb7bc87f639668617bc9 (patch) | |
| tree | f1c280790ae4791b587c879b2922567a44290a54 /packaging | |
| parent | 7ff675fdc0866ca40bdb703bc95c0cc60e3edd87 (diff) | |
| download | meshbay-a4aabd1d33770d6199a8cb7bc87f639668617bc9.tar.gz | |
fix(packaging): re-running setup no longer re-prompts for firewall access
Every run of customInstall showed the "Allow MeshBay through Windows
Firewall?" question and, on Yes, a fresh UAC prompt -- an upgrade or repair
install would ask again even with all four rules already in place.
customInstall now checks first: firewall.ps1 check, unelevated
(Get-NetFirewallRule needs no admin, only New/Remove do), exits 0 if every
rule already exists. Only a nonzero result reaches the MessageBox and the
elevated add. A second run of setup on an already-configured machine now
asks nothing.
Verified unelevated: check exits 1 and logs which rules are missing on a
machine with none of them (the fresh-install case); electron-builder
compiles the nsExec::Exec / Pop $0 / ${If} wiring. Node suite 837 pass /
25 skip.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Diffstat (limited to 'packaging')
| -rw-r--r-- | packaging/win/README.md | 8 | ||||
| -rw-r--r-- | packaging/win/firewall.ps1 | 22 |
2 files changed, 24 insertions, 6 deletions
diff --git a/packaging/win/README.md b/packaging/win/README.md index 5130e60..01c8d1a 100644 --- a/packaging/win/README.md +++ b/packaging/win/README.md @@ -109,8 +109,12 @@ Linux packaging solves with a broad `1024-65535/udp` range since those two are fixed and known — matching `packaging/firewall/*/meshbay-cast.xml` exactly. -Say yes and every prompt you'd otherwise hit mid-use — connecting, or the -first cast — is gone. Say no, or the UAC prompt is dismissed, and Windows +Setup checks first, **unelevated** (`firewall.ps1 check` — reading rules needs +no admin, only creating them does), so running the installer again — an +upgrade, a repair install — asks nothing and never pops UAC a second time once +the rules are in place. Say yes the first time and every prompt you'd +otherwise hit mid-use — connecting, or the first cast — is gone. Say no, or +the UAC prompt is dismissed, and Windows falls back to its own **"Allow access"** dialog the first time each program/port combination is used — tick **both Private and Public** then (a libvirt/VM adapter, and sometimes a plain Ethernet one, registers as Public; a diff --git a/packaging/win/firewall.ps1 b/packaging/win/firewall.ps1 index bf1b32b..9b3687a 100644 --- a/packaging/win/firewall.ps1 +++ b/packaging/win/firewall.ps1 @@ -29,20 +29,23 @@ Shipped as an extraResource at <install>\resources\firewall.ps1, so it locates the two executables from its own path and takes no arguments - beyond the action. Runs elevated and windowless, so it leaves a trace at - %TEMP%\meshbay-firewall.log. + beyond the action. add/remove run elevated and windowless, leaving a + trace at %TEMP%\meshbay-firewall.log; check is a plain read (no admin + needed -- Get-NetFirewallRule does not require it, only New/Remove do) + that the installer runs first, unelevated, so re-running setup with the + rules already in place skips the prompt and the UAC entirely. .PARAMETER Action add (default) create/replace the rules remove delete them + check exit 0 if all rules already exist, 1 otherwise -- no admin needed #> [CmdletBinding()] param( - [ValidateSet("add", "remove")] + [ValidateSet("add", "remove", "check")] [string]$Action = "add" ) -$ErrorActionPreference = "Stop" $log = Join-Path $env:TEMP "meshbay-firewall.log" "[{0}] {1}" -f (Get-Date -Format s), $Action | Add-Content $log @@ -63,6 +66,17 @@ $rules = @( @{ Name = "MeshBay Cast Discovery"; Path = $client; Protocol = "UDP"; LocalPort = "5353" } ) +if ($Action -eq "check") { + $missing = $rules | Where-Object { -not (Get-NetFirewallRule -DisplayName $_.Name -ErrorAction SilentlyContinue) } + if ($missing) { + " check: missing $(($missing | ForEach-Object { $_.Name }) -join ', ')" | Add-Content $log + exit 1 + } + " check: all rules present" | Add-Content $log + exit 0 +} + +$ErrorActionPreference = "Stop" try { foreach ($r in $rules) { # Idempotent: clear any existing rule of this name first. |