Анонс issuebot

F-Droid — это робот, который испытывает жгучую страсть к свободному программному обеспечению с открытым исходным кодом (FOSS). И теперь у F-Droid есть новый помощник: issuebot! Он начинал свою жизнь, как наскоро сварганенный скрипт, запущенный на трекере проблем RFP, где он делал кое-какие автоматизированные проверки информации, поступающей вместе с запросами на «опакечивание» ПО. Как часть проекта отслеживания трекеров мы поговорили с сопровождающими и участниками fdroiddata и RFP о том, как issuebot мог бы им помочь. Одна из основных целей была в том, чтобы позволить людям, которые ни коим образом, ни по форме, ни по сути, не являются разработчиками F-Droid, вносить свой вклад, делая обзоры на приложения. Этого возможно достичь, сделав так, чтобы issuebot, как и многие другие технологические процессы сборки и инструменты рецензирования, запускался автоматически. Затем issuebot выдавал бы эту информацию в виде сообщения в нитке проблемы (issue) на RFP или запроса слияния (merge request) на fdroiddata. Мы устроили мозговой штурм и размышляли о разных способах, как это можно оформить, но в итоге решили, что лучше всего будет интегрировать issuebot в существующий рабочий процесс, при котором участники F-Droid и члены сообщества работают над рецензированием приложений вместе, а именно в проектах на GitLab. Есть также множество других способов использовать эту информацию, которые мы сейчас даже не можем себе вообразить (а ведь вся она уже собрана в одном месте), так что у issuebot есть также и JSON API.

Сегодня issuebot — это полностью законченный автомат, который, получая URL на исходный код, собирает приложение в APK, сканирует исходный код и APK на наличие проблем и отправляет отчёт о них на gitlab.com. Это уже сделало человеческий труд более эффективным, говоря о рецензировании запросов на добавление приложений в F-Droid и предоставление обратной связи для тех, кто эти запросы делает.

Сообщения о проблемах RFP

Любой может подать «запрос на опакечивание» (request for packaging, RFP) или запрос на слияние для приложения в F-Droid. Навыки необходимые для этого знакомы практически любому интернет-пользователю: создание аккаунта и взаимодействие с формой для отправки сообщения. Это означает, что не все пользователи трекера проблем RFP в достаточной мере технически грамотны (по крайней мере таковых там больше, чем на большинстве трекеров ошибок). Учитывая то, что issuebot относительно прост, основная цель должна быть в том, чтобы помочь рецензентам общаться с людьми, подающими запросы. Технически грамотные участники без труда смогут следовать указаниям в сообщениях issuebot‘а, а остальным смогут помочь их более подкованные товарищи, указывая на конкретные проблемы, согласно информации в отчёте. Если пользователя не преминет указать ссылку на репозиторий с исходным кодом или APK файл с приложением Android, то тогда issuebot сможет сформировать полезный обзор самостоятельно. Он также выдаёт значительный объём информации, который делает работу рецензента намного проще. С RFP есть определённые проблемы: запрошенные приложения могут содержать широкий ряд технических подходов и код может быть написан специфическим образом. Быть знакомым со всеми возможными нюансами ни один рецензент не может, так что важно, чтобы у него была возможность быстро искать и выбирать запросы, которые он сможет достаточно быстро и компетентно отрецензировать. Есть достаточно широкий круг проблем, которые issuebot может отследить самостоятельно, так что мы сделали набор цветных меток, которые он сможет присваивать различным запросам. На основе этих меток рецензенты смогут быстро выбирать запросы, входящие в их круг компетенций и основанные на платформах, с которой они хорошо знакомы, например Flutter. Они также могут увидеть, есть ли у представленного приложения очевидные проблемы, которые скорей всего делают эти приложения непригодными для включения в F-Droid, например зависимость от проприетарных библиотек или известных сервисов, отслеживающих местоположение.

метки из RFP, сделанные issuebot

Метки проблем на GitLab также являются простым способом отслеживать те проблемы, которые находит сам issuebot. Он запускается по расписанию и проверяет все новые запросы, выдавая свой отчёт непосредственно под сообщением о проблеме или запросом на слияние. Как только issuebot завершает отправку своего отчёта, он также добавит метку fdroid-bot к этому сообщению о проблеме. Эта метка нужна самому issuebot‘у, чтобы он игнорировал эту запись при последующих запусках. Чтобы issuebot обработал какой-либо запрос повторно, просто удалите эту метку (fdroid-bot) — во время следующего запуска issuebot снова просмотрит его целиком с самого начала.

Запросы на слияние fdroiddata

В случае запросов на слияние для приложений, мы больше сфокусированы на людях, которые делают, рецензируют и одобряют эти запросы на слияние. Так что мы предполагаем, что у всех них есть базовое понимание того, как работать с GitLab, Git, и как собираются Android-приложения. В этом случае issuebot формирует свой отчёт на основе изменений, которые были внесены в код в запросе на слияние. Зачастую, когда предлагается добавить новое приложение в fdroiddata, в него должны быть внесены некоторые изменения, чтобы оно собиралось корректно и соответствовало стандартам F-Droid. В этом случае технический отчёт issuebot‘а предназначен непосредственно для того, кто пытается добавить это приложение. Другие участники F-Droid также регулярно просматривают эти запросы на слияние и могут предоставлять свою помощь и обратную связь (что и ожидается при подобном рабочем процессе).

Этот запрос на слияние, который добавляет новое приложение для газеты taz — хороший пример того, как этот процесс должен выглядеть со стороны пользователя. Он был добавлен в состоянии «В процессе работы» (Work In Progress) ещё до того как issuebot начал просматривать запросы на слияние. Сначала он получил несколько рецензий и отзывов от участников F-Droid. Затем человек, сделавший запрос, вносил в него изменения несколько раз, и issuebot (после своего запуска) делал свой отчёт каждый раз, когда запрос обновлялся.

issuebot рецензирует запрос на слияние

К сожалению, на данный момент для запросов на слияние использовать метки аналогичных тем, что используются в сообщениях проблемах RFP, нельзя. Технические ограничения, наложенные API GitLab, затрудняют добавление оных: это требует привилегий «Разработчика» (Developer), что позволило бы вносить изменения в код с аккаунта issuebot‘а. Но, дабы не расширять возможное поле атаки с этого аккаунта, такие привилегии предоставлять ему не целесообразно.

JSON API

В добавок к HTML-отчётам issuebot также предоставляет JSON API, так что любое web-приложение сможет использовать эти данные для своих целей. Кроме того, его можно совмещать с другими нашими API для разработчиков, как например API статуса buildserver. В API две точки входа:

Вот ответ от точки входа «ID приложения», который показывает выдачу issuebot‘а для одного конкретного приложения. Всего отчёта два, самый новый отображается первым. В новой версии выводится результат для большего колличества модулей (они были добавлены уже после первого запуска).

  "at.roteskreuz.stopcorona": [
    {
      "issueId": 1319,
      "jobId": "925261691",
      "modules": [
        "925261691/1319/active-hostnames.py.json",
        "925261691/1319/check-for-translation-service.py.json",
        "925261691/1319/dependencies-scrape.py.json",
        "925261691/1319/fastlane.py.json",
        "925261691/1319/fdroid-scan-apk.py.json",
        "925261691/1319/fdroid-scanner.py.json",
        "925261691/1319/gradle-productFlavors.py.json",
        "925261691/1319/gradle-wrapper.py.json",
        "925261691/1319/links-to-services.py.json",
        "925261691/1319/sdk.py.json",
        "925261691/1319/suspicious-names.py.json",
      ],
      "successfulBuilds": []
    },
    {
      "issueId": 1319,
      "jobId": "600681223",
      "modules": [
        "600681223/1319/check-for-translation-service.py.json",
        "600681223/1319/dependencies-scrape.py.json",
        "600681223/1319/fastlane.py.json",
        "600681223/1319/fdroid-scan-apk.py.json",
        "600681223/1319/fdroid-scanner.py.json",
        "600681223/1319/gradle-productFlavors.py.json",
        "600681223/1319/gradle-wrapper.py.json"
        "600681223/1319/sdk.py.json",
        "600681223/1319/suspicious-names.py.json",
      ]
    }
  ],

Оконечная запись — это список идентификаторов GitLab CI Job ID тех вещей, которые issuebot нашёл в одном конкретном приложении при одном конкретном запуске. Этот список включает относительные пути к выводу JSON только тех модулей issuebot‘а, которые запускались. Самый простой способ начать работать с API — это скачать весь набор файлов GitLab CI Job: просто перейдите к RFP Pipelines и скачайте самую последнюю версию (ссылка с картинкой в правом столбце).

Дальнейшая работа

Следующий шаг — это связывание большего количества отрывков ключевой информации, чтобы предоставить надёжное и конкретные инструменты отслеживания SDK различных трекеров и имена узлов, с которыми они связаны. Например, база данных «Exodus Privacy» даёт доступ к подписям исходного кода, подписям сетевых сервисов и ID API-ключей. С другой стороны, модули issuebot‘а уже выцарапывают информацию о доменных именах, библиотеках в зависимостях и метаданных из AndroidManifest.xml, которые содержат такие вещи, как ID API-ключей. Всё это даёт много захватывающих возможностей, которые будет не так сложно реализовать.

Одна из идей, которую мы набросали и которая кажется восхитительной, — это создать отдельное web-приложение, с помощью которого можно было бы отправлять запросы на добавление приложений в F-Droid и там же получать рецензии, списки анти-возможностей, сборки, информацию об утечках приватных данных и т.п. У этого есть огромный потенциал в плане уменьшения того объёма технических знаний, который требуется от людей, желающих просто добавить в F-Droid приложения, которые они используют, проведя их через все этапы запросов и рецензирования. Очевидно, что сам по себе это будет довольно большой проект, так что мы отложили его в сторону до лучших времён, хотя и не забыли, сосредоточившись пока на issuebot.

(Эта работа была поддержана фондом NLnet NGI Zero PET.)