sabydesktop
The package downloads prebuilt .deb files from the official vendor domain update.saby.ru, which is plausibly the project's own release infrastructure; despite the static analyzer flag for a non-standard host, the source is verifiable and checksummed, and the build process only extracts and reorganizes the official binaries without executing remote code.
Triggered rules
llm_review
The static rules flagged this MEDIUM, but an AI model (qwen/qwen3-235b-a22b-2507) reviewed the full PKGBUILD and judged it LOW (confidence 95%): The package downloads prebuilt .deb files from the official vendor domain update.saby.ru, which is plausibly the project's own release infrastructure; despite the static analyzer flag for a non-standard host, the source is verifiable and checksummed, and the build process only extracts and reorganizes the official binaries without executing remote code.
1 higher static finding superseded - not the current verdict (shown for transparency)
source_untrusted_domain
One or more source=() URLs point to a host outside the trusted allowlist (github.com, gitlab.com, codeberg.org, pypi.org, …).
-
PKGBUILD:30
source=("${_saby_deb}::https://update.saby.ru/SabyDesktop/${pkgver}/linux/deb_repo/saby.deb"
PKGBUILD
1 offending line(s) highlighted# Maintainer: leoneii comdir@infonix.info
# Версии всех трёх продуктов зафиксированы (НЕ "master") - обновляются вручную
# локальным скриптом check-update.sh (не входит в AUR-репозиторий), который
# проверяет апстрим через лёгкие JSON-манифесты update.saby.ru/rules/<Продукт>.json
# и сам вызывает updpkgsums для пересчёта чек-сумм. Здесь, в PKGBUILD,
# никакой сетевой логики во время сборки нет - только фиксированные версии.
name=SabyDesktop
pkgname=sabydesktop
url="https://saby.ru/"
pkgver=26.4200.583
pkgrel=1
pkgdesc="SabyDesktop- приложения от Сбис, включая сбис-плагин, предоставляет доступ к дополнительным инструментам и сервисам saby, например использованию электронной подписи"
arch=('x86_64')
license=('Custom')
# Версии вспомогательных продуктов - могут отличаться от pkgver самого
# SabyDesktop. Обновляются вместе с pkgver в check-update.sh.
_ver_nmh="26.4200.157"
_ver_center="26.4200.190"
# Локальные имена файлов включают версию - иначе при обновлении версии
# новый .deb рискует не перезаписать (или не отличаться от) старого кэша
# с тем же фиксированным именем.
_saby_deb="saby-${pkgver}.deb"
_nmh_deb="nmh-transport-${_ver_nmh}.deb"
_center_deb="sabycenter-${_ver_center}.deb"
source=("${_saby_deb}::https://update.saby.ru/SabyDesktop/${pkgver}/linux/deb_repo/saby.deb"
"${_nmh_deb}::https://update.saby.ru/NmhTransport/${_ver_nmh}/linux/deb_repo/nmh-transport.deb"
"${_center_deb}::https://update.saby.ru/SabyCenter/${_ver_center}/linux/deb_repo/sabycenter.deb")
sha256sums=('c5144d103af9cd5afeac99ac0dfc376f862bc384452507f45a9a8003b7a8e2df'
'8c3395b391551d1b29a3b0ac6ca0e3c4718b77f562c4a6c48c326799378dd5c2'
'0a2f7cf4dae85b67c34570e797073ea63f57de5e9606ca3831fc9ad1118c1691')
depends=(
'glibc'
'gcc-libs'
'util-linux-libs'
)
build() {
echo "Skiping build....."
}
package() {
# Копируем необходимые файлы в каталог пакета
echo "Extracting the data.tar.xz..."
# Перебираем известные .deb файлы (явные переменные, а не basename(source[]) -
# т.к. локальное имя файла теперь отличается от хвоста URL из-за версии в имени)
local deb_files=("${_saby_deb}" "${_nmh_deb}" "${_center_deb}")
for deb_name in "${deb_files[@]}"; do
msg2 "Распаковка пакета: ${deb_name}"
# Извлекаем внутренний архив и СРАЗУ распаковываем его содержимое в $pkgdir
# bsdtar умеет читать поток из stdout через '-'
bsdtar -O -xf "${srcdir}/${deb_name}" data.tar.xz | bsdtar -xf - -C "${pkgdir}" 2>/dev/null || \
bsdtar -O -xf "${srcdir}/${deb_name}" data.tar.gz | bsdtar -xf - -C "${pkgdir}" 2>/dev/null || \
bsdtar -O -xf "${srcdir}/${deb_name}" data.tar.zst | bsdtar -xf - -C "${pkgdir}"
done
# 2. Описание папок для переноса (в формате "откуда:куда")
local paths_to_move=(
"opt/Tensor/Saby/temp_saby:opt/Tensor/Saby"
"opt/Tensor/Saby Center/temp_sabycenter:opt/Tensor/Saby Center"
"opt/nmh-transport/temp_nmh:opt/nmh-transport"
)
# 3. Перенос содержимого в цикле
for pair in "${paths_to_move[@]}"; do
local src_rel="${pair%%:*}"
local dst_rel="${pair#*:}"
local src_dir="${pkgdir}/${src_rel}"
local dst_dir="${pkgdir}/${dst_rel}"
msg2 "Перенос файлов из ${src_rel##*/} в основную директорию..."
if [ -d "${src_dir}" ]; then
mkdir -p "${dst_dir}"
cp -ra "${src_dir}/." "${dst_dir}/"
rm -rf "${src_dir}"
else
warning "Директория ${src_rel} не найдена в этой сессии сборки. Пропускаем."
fi
done
# 4. Иконка: .deb уже кладёт её по фиксированному пути (не зависит от версии) —
# /opt/Tensor/Saby/icons/, поэтому копировать/искать версию не нужно.
if [ ! -f "${pkgdir}/opt/Tensor/Saby/icons/default_dark.png" ]; then
warning "Иконка default_dark.png не найдена по ожидаемому пути — .desktop будет без своей иконки."
fi
# 5. Помечаем версию как "проверенную" — маркер, который .deb обычно создаёт
# в postinst-скрипте (integrity.checked). Без него бинарник saby
# отказывается запускаться, тихо завершаясь с кодом 1.
_verdir=$(find "${pkgdir}/opt/Tensor/Saby" -maxdepth 1 -type d -regextype posix-extended \
-regex '.*/[0-9]+\.[0-9]+\.[0-9]+' 2>/dev/null | sort -V | tail -n1)
if [ -n "${_verdir}" ]; then
touch "${_verdir}/integrity.checked"
else
warning "Версионная директория не найдена — integrity.checked не создан, saby может не запуститься."
fi
# 6. Создаём .desktop-файл (ярлык в меню приложений) — запускаем saby напрямую,
# без обёртки: бинарник сам находит свою версию и LD_LIBRARY_PATH не требуется.
install -Dm644 /dev/stdin "${pkgdir}/usr/share/applications/${pkgname}.desktop" <<EOF
[Desktop Entry]
Name=SabyDesktop
Comment=${pkgdesc}
Exec=/opt/Tensor/Saby/saby
Icon=/opt/Tensor/Saby/icons/default_dark.png
Terminal=false
Type=Application
Categories=Office;Network;
EOF
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-09-17 00:27:14 | Low | 2 |
| 2026-09-16 00:03:17 | Low | 2 |
| 2026-09-15 00:25:31 | Low | 2 |
| 2026-09-14 00:27:57 | Low | 2 |
| 2026-09-13 00:19:54 | Low | 2 |
| 2026-09-12 00:25:17 | Low | 2 |
| 2026-09-11 00:19:22 | Low | 2 |
| 2026-09-10 00:22:44 | Low | 2 |
| 2026-09-09 00:04:09 | Low | 2 |
| 2026-09-08 00:18:08 | Low | 2 |
| 2026-09-07 00:30:15 | Low | 2 |
| 2026-09-06 00:17:06 | Low | 2 |
| 2026-09-05 00:16:27 | Low | 2 |
| 2026-09-04 00:03:13 | Low | 2 |
| 2026-09-03 00:15:47 | Low | 2 |
| 2026-09-02 00:02:31 | Low | 2 |
| 2026-09-01 00:11:19 | Low | 2 |
| 2026-08-31 00:19:57 | Low | 2 |
| 2026-08-30 00:04:14 | Low | 2 |
| 2026-08-29 00:29:17 | Low | 2 |