dontallow: Automatisch weigeren van macOS-prompts voor lokale netwerken

Waarom deze tool bestaat

macOS (Sequoia en later) toont deze prompt de eerste keer dat een applicatie het lokale netwerk benadert. In principe zou deze keuze onthouden moeten worden, maar bij veel apps is dat niet het geval, waardoor de prompt bij elke start terugkeert. Dit gebeurt vaak bij apps die je niet eens actief gebruikt:

  • Chromium-browsers (Chrome, Brave, Edge, Island, Arc): Deze kopiëren bij het opstarten hun eigen app-bundel naar een willekeurige tijdelijke map, zodat de codesignature behouden blijft bij updates op locatie. macOS koppelt de beslissing over het lokale netwerk aan dat willekeurige pad, waardoor elke volgende start wordt gezien als een gloednieuwe app. Hierdoor vullen de privacyinstellingen zich met dubbele rijen van "Google Chrome.app" die naar niets meer verwijzen.
  • Apps met versie-gebaseerde installatiepaden: Elke update (bijvoorbeeld installaties in .../versions/1.2.3/) resulteert in een nieuwe regel in de instellingen.
  • Onjuist toegeschreven prompts: macOS koppelt de dialoog aan de app die het systeem als "verantwoordelijk" beschouwt, waardoor je prompts ziet voor apps die niet eens draaien.

Sommige apps maken legitiem gebruik van deze permissie, zoals browsers en mediaspelers voor Chromecast- en AirPlay-detectie, LAN-multiplayer in games, of printer- en scanner-hulpprogramma's. Als je deze functies gebruikt, kun je voor die specifieke app "Sta toe" kiezen (gebruik dontallow pause 10m terwijl je dit doet), en dit wordt onthouden zolang het pad van de app stabiel is.

Er is geen ondersteunde manier om de lijst op te schonen, geen MDM-payload om de permissie vooraf te weigeren, en tccutil reset dekt dit niet. Daarom is er een kleine agent ontwikkeld die voor jou "nee" antwoordt.

Installatie

Je kunt de tool installeren via Homebrew of handmatig:

brew install johncassil/tap/dontallow
# of:
make && make install

Voer daarna het volgende uit:

dontallow install

dontallow install schrijft een launchd-agent per gebruiker, start deze, opent Systeeminstellingen > Privacy en beveiliging > Toegankelijkheid en print het exacte pad dat moet worden toegevoegd als macOS je hier niet automatisch om vraagt. Toegankelijkheid is de permissie die de tool in staat stelt op de knop te klikken. De tool wacht op de toestemming en bevestigt wanneer de agent actief is. Met dontallow status kunnen de instructies op elk moment opnieuw worden opgevraagd als de toestemming ontbreekt.

Gebruik

CommandoFunctie
dontallow statusToont status van de agent, pauze-status, allowlist en recente weigeringen.
dontallow pause [1h]Laat prompts voor een bepaalde tijd ongemoeid (bijv. 30m, 2h, 1d, forever).
dontallow resumeHervat het automatisch weigeren van prompts.
dontallow rulesDecodeert de Local Network regelstore van het systeem en toont wat elke privacy-rij werkelijk is, inclusief wezen.
dontallow uninstallStopt en verwijdert de agent.
dontallow run --dry-runDraait op de voorgrond, logt wat er zou gebeuren, maar klikt nergens op.

Elke weigering stuurt een notificatie met de naam van de app en het pauze-commando, zodat je niet hoeft te onthouden hoe je de tool tijdelijk uitschakelt. Je kunt deze notificaties dempen in de Systeeminstellingen.

Wanneer een app daadwerkelijk toegang tot het lokale netwerk nodig heeft

Kies een van de volgende drie opties:

  1. Voer dontallow pause 10m uit, start de app en klik zelf op "Sta toe".
  2. Voeg de naam van de app toe aan ~/.config/dontallow/allowlist (één per regel, hoofdletterongevoelig substring). Prompts voor deze apps worden nooit aangeraakt.
  3. Zet de schakelaar om in Systeeminstellingen > Privacy en beveiliging > Lokale netwerk. Een geweigerde prompt registreert een "deny", wat je daar kunt terugdraaien.

Je kunt ~/.config/dontallow/grace instellen op een aantal seconden als je een tijdvenster wilt hebben om zelf op "Sta toe" te klikken voordat de agent dit doet (standaard is dit 0,25 seconden).

Hoe het werkt

De prompt is een venster dat eigendom is van het systeempreces UserNotificationCenter. dontallow registreert een Accessibility-observer voor het maken van vensters in dat proces en gaat in slaapstand tot er een melding komt. De tool leest de tekst van de dialoog, bevestigt dat het een lokale netwerkprompt is (en niet iets anders), controleert de pauze-status en de allowlist, en voert vervolgens de Accessibility-klikactie uit op de knop "Niet toestaan". Als de klik wordt geweigerd, valt de tool terug op een synthetische klik op de locatie van de knop.

De tool wijzigt nooit systeembestanden, schakelt nooit beveiligingen uit en kiest nooit voor "Sta toe".

Beheerde Mac's (Managed Macs)

Lokale netwerkpermissies kunnen niet vooraf worden ingesteld via MDM, maar Toegankelijkheid (Accessibility) wel. Voor een vloot van apparaten: bouw de tool één keer, signeer deze met een Developer ID, verspreid het binary samen met een PPPC-profiel (Privacy Preferences Policy Control) dat Toegankelijkheid verleent aan de code-requirement, en voer dontallow install per gebruiker uit. Hiermee is geen handmatige stap in de instellingen nodig.

Na een update

macOS koppelt de Toegankelijkheids-toestemming aan de codesignature van het binary. Elke build (inclusief brew upgrade) produceert een nieuwe signature. Voer na een update dontallow status uit. Als er staat dat de toestemming ontbreekt: verwijder de regel voor dontallow in de Toegankelijkheidsinstellingen en voeg deze opnieuw toe via het geprinte pad. De agent koppelt zichzelf binnen tien seconden opnieuw aan. Een toekomstige release ondertekend met een Developer ID zal deze stap overbodig maken.

Tests

Voer make test uit om tests te draaien.

Unit tests dekken de pure logica (het parsen van dialoogtekst, duur en pauze-parsing, allowlist-matching, genereren van launchd plists en de Local Network regel-decoder tegen een fixture-archief). Deze worden gebouwd met plain swiftc en vereisen geen Xcode of SwiftPM. De end-to-end route (een echte prompt, een echte klik) kan alleen worden getest op een Mac met verleende Toegankelijkheidsrechten; het handmatige recept hiervoor staat in Tests/INTEGRATION.md.

Compatibiliteit

  • Build-omgeving: Kan worden gebouwd met alleen Apple's Command Line Tools. Xcode is niet vereist.
  • Architectuur: Apple Silicon en Intel (Homebrew compileert native op beide).
  • OS-versie: macOS 13 of later om te bouwen; de prompt zelf bestaat alleen op macOS 15 Sequoia en later.
  • Getest op: Intel, macOS 15.6.
  • Taal: Vooralsnog alleen voor Engelstalige macOS. De matcher kijkt naar de dialoogtekst en de titel van de knop "Don't Allow"; gelokaliseerde strings zijn gepland.

Licentie

MIT