Утилита dontallow для macOS сама отклоняет запрос о локальной сети

На Show HN представлен проект dontallow, небольшой агент launchd для macOS, который автоматически нажимает «Don't Allow» (не разрешать) в системном окне «Allow "Google Chrome" to find devices on local networks?». По описанию в README, он делает это каждый раз и в течение доли секунды, не потребляет процессор в простое и переживает перезагрузки. Код, два коротких файла на Swift без зависимостей, лицензия MIT.
Проблема, по README, в следующем. macOS (Sequoia и новее) показывает этот запрос при первом обращении приложения к локальной сети. Решение должно запоминаться, но у многих приложений не запоминается, и окно возвращается при каждом запуске, нередко для программ, которыми пользователь даже не пользуется. Причины перечислены такие: браузеры на Chromium (Chrome, Brave, Edge, Island, Arc) при запуске копируют собственный пакет приложения в случайную временную папку, чтобы подпись кода пережила обновление на месте; macOS привязывает решение к этому случайному пути, поэтому следующий запуск выглядит как новое приложение, а в настройках приватности копятся дубликаты строк «Google Chrome.app», которые ни на что не указывают. Приложения с версионными путями установки (вида .../versions/1.2.3/) получают новую строку при каждом обновлении. Кроме того, macOS «пришпиливает» окно к тому приложению, которое считает ответственным, поэтому запросы появляются и для программ, которые не запущены. Штатного способа почистить список нет, политики MDM для предварительного запрета этого разрешения тоже нет, а tccutil reset его не охватывает.
Установка: brew install johncassil/tap/dontallow или make && make install, затем dontallow install. Команда создаёт пользовательский агент launchd, запускает его и открывает раздел «Универсальный доступ» (Accessibility) в настройках; это разрешение нужно, чтобы агент мог нажимать кнопку. Если разрешения нет, подсказку повторит dontallow status.
Если приложению разрешение нужно по делу (в README называют поиск Chromecast и AirPlay в браузерах и медиаплеерах, сетевые игры по LAN, утилиты для принтеров и сканеров), есть три способа: поставить агент на паузу (например, dontallow pause 10m) и самому нажать Allow; добавить имя приложения в файл ~/.config/dontallow/allowlist (по одному на строку, подстрока без учёта регистра), тогда его запросы не трогаются; либо переключить тумблер в «Конфиденциальность и безопасность» > «Локальная сеть». Отклонённый запрос записывается как запрет, и его можно отменить там же. Параметр ~/.config/dontallow/grace задаёт паузу в секундах перед нажатием, чтобы успеть нажать Allow самому (по умолчанию 0,25). Каждое срабатывание сопровождается уведомлением с именем приложения и командой паузы; его можно отключить в настройках.
Как это устроено: окно запроса принадлежит системному процессу UserNotificationCenter. Агент подписывается на создание окон в этом процессе через Accessibility, читает текст диалога, убеждается, что это запрос о локальной сети, проверяет паузу и список исключений и выполняет действие «нажать» на кнопке Don't Allow. Если нажатие отклонено, он имитирует щелчок в месте кнопки. По заверению README, инструмент не изменяет системные файлы, не отключает защиту и никогда не выбирает Allow.
Для парка машин README предлагает собрать утилиту один раз, подписать Developer ID и раздать бинарник вместе с профилем PPPC, выдающим Accessibility: локальную сеть через MDM предустановить нельзя, а Accessibility, можно. Нюанс обновлений: macOS привязывает разрешение Accessibility к подписи бинарника, а каждая сборка (в том числе brew upgrade) даёт новую подпись, поэтому после обновления иногда нужно удалить строку dontallow в настройках и добавить заново; агент переподключится сам в течение десяти секунд. Будущий релиз с подписью Developer ID уберёт этот шаг.
Ограничения: собрать можно на macOS 13 и новее (хватает Command Line Tools, Xcode не нужен), но сам запрос существует только на macOS 15 Sequoia и новее. Проверено пока только на Intel с macOS 26.6. Работает только с англоязычной macOS, сопоставление идёт по тексту диалога и названию кнопки «Don't Allow»; локализация запланирована. Модульные тесты покрывают только чистую логику; сквозной путь (настоящий запрос и настоящее нажатие) проверяется вручную на Mac с выданным доступом.
Ключевые факты
- dontallow, агент launchd для macOS с лицензией MIT: через Accessibility сам нажимает «Don't Allow» в запросе о поиске устройств в локальных сетях, по описанию, за долю секунды.
- Запрос возвращается при каждом запуске, потому что macOS привязывает решение к пути приложения: Chromium-браузеры запускаются из случайной временной папки, версионные пути дают новую строку при каждом обновлении.
- Для нужных приложений есть три выхода: dontallow pause (например, 10m), файл allowlist с именами приложений или переключатель в настройках «Локальная сеть»; задержку перед нажатием задаёт файл grace (по умолчанию 0,25 с).
- После обновления (в том числе brew upgrade) разрешение Accessibility, возможно, придётся выдать заново, потому что оно привязано к подписи бинарника.
- Проверено пока только на Intel с macOS 26.6; работает только с англоязычной macOS.
Почему это важно
Повторяющийся запрос «Allow ... to find devices on local networks?» раздражает пользователей macOS Sequoia и новее, а штатных средств это исправить, по README, нет: список разрешений нельзя почистить, MDM не умеет заранее запрещать это разрешение, tccutil reset его не охватывает. dontallow закрывает этот пробел маленьким агентом на двух Swift-файлах без зависимостей. Заодно README объясняет причину повторов: решение привязано к пути приложения, а Chromium-браузеры запускаются из случайной временной папки.
Кому это важно
Пользователям macOS 15 Sequoia и новее, у которых запрос появляется при каждом запуске браузера или других программ, особенно тем, кто не пользуется поиском Chromecast, AirPlay, сетевыми играми или сетевыми принтерами. Также администраторам парка Mac: README описывает сценарий с подписью Developer ID и профилем PPPC для выдачи Accessibility. Тем, кому доступ к локальной сети приложениям нужен постоянно, агент полезен меньше, придётся вести список исключений.
Как это применить
Установка: brew install johncassil/tap/dontallow (или make && make install), затем dontallow install, команда запустит агент и откроет настройки Accessibility, где нужно выдать доступ. Если приложению доступ нужен, поставьте агент на паузу командой вроде dontallow pause 10m и нажмите Allow сами, либо добавьте имя приложения в ~/.config/dontallow/allowlist, либо включите переключатель в «Конфиденциальность и безопасность» > «Локальная сеть». После обновления выполните dontallow status: если доступ пропал, удалите строку dontallow в Accessibility и добавьте снова. Проект распространяется по лицензии MIT.
Можно ли доверять
Заявления о поведении инструмента взяты из README самого проекта; независимых замеров или отзывов в материале нет, как и цифр задержки сверх описания «доля секунды». Имя автора или сопровождающего в тексте не названо. Код открыт (MIT), он небольшой, два файла на Swift, так что проверить его самостоятельно реально. Проверено пока только на Intel с macOS 26.6; авторы просят отчёты о других версиях. Сквозная проверка выполняется вручную, автотесты покрывают лишь чистую логику.
Риски и подводные камни
Инструменту нужен доступ Accessibility, это широкое разрешение, поэтому перед выдачей стоит убедиться в происхождении сборки. README утверждает, что агент не меняет системные файлы, не отключает защиту и никогда не выбирает Allow. Отклонённый запрос записывается как запрет: если приложению сеть нужна (Chromecast, AirPlay, сетевые игры, принтеры), без паузы или списка исключений функция может не заработать, пока запрет не снят в настройках. После каждого обновления бинарника придётся заново выдавать Accessibility, пока нет релиза с подписью Developer ID. Работает только на англоязычной macOS, потому что сопоставление идёт по тексту диалога и названию кнопки.
«Он никогда не изменяет системные файлы, никогда не отключает защиту и никогда не выбирает Allow.»
— README проекта dontallow