onionspray-git
The source is a Git repository from the official Tor Project GitLab instance, which is a legitimate and trusted host for the project, despite not being on the analyzer's whitelist; the package builds from source and installs scripts and data without executing remote code or introducing unverifiable binaries.
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 source is a Git repository from the official Tor Project GitLab instance, which is a legitimate and trusted host for the project, despite not being on the analyzer's whitelist; the package builds from source and installs scripts and data without executing remote code or introducing unverifiable binaries.
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:21
source=("git+https://gitlab.torproject.org/tpo/onion-services/onionspray.git#branch=main")
PKGBUILD
1 offending line(s) highlighted# Maintainer: Nihal Kumar <2tv8xupqg at mozmail dot com>
# https://github.com/nihalxkumar/PKGBUILDs/tree/main/onionspray-git
pkgname=onionspray-git
pkgver=1.8.2.r0.g217f430
pkgrel=1
pkgdesc="A tool to setup Onion Services for existing websites."
arch=('any')
url="https://gitlab.torproject.org/tpo/onion-services/onionspray"
license=('GPL-3.0-or-later')
depends=('perl' 'bash' 'tor' 'openbsd-netcat' 'rsync' 'openssl')
makedepends=('git')
optdepends=(
'onionbalance: for load balancing onion services'
'python: for validate-onion-key helper script'
'ruby: for onion-csr helper script'
'mkcert: for generating local CA certificates for TLS'
)
provides=('onionspray')
conflicts=('onionspray')
source=("git+https://gitlab.torproject.org/tpo/onion-services/onionspray.git#branch=main")
sha256sums=('SKIP')
pkgver() {
cd "${pkgname%-git}"
git describe --long --tags --match 'v[0-9]*' | sed 's/^v//; s/\([^-]*-g\)/r\1/; s/-/./g'
}
prepare() {
cd "${pkgname%-git}"
# Prevent failure when non-root users run onionspray commands
sed -i 's/chmod 700 \$secrets_dir || exit 1/chmod 700 \$secrets_dir 2>\/dev\/null || true/' onionspray
# Initialize git submodules
git submodule sync --recursive
git submodule update --init --recursive
}
build() {
cd "${pkgname%-git}"
# No compilation needed, this is a Perl/Bash tool
true
}
package() {
cd "${pkgname%-git}"
# Install to /opt/onionspray since it expects to be in a directory structure
install -dm755 "$pkgdir/opt/onionspray"
# Copy entire directory structure
cp -r --preserve=mode . "$pkgdir/opt/onionspray/" 2>/dev/null || true
# Ensure all scripts have execute permissions
find "$pkgdir/opt/onionspray" -name "*.sh" -exec chmod 755 {} \;
find "$pkgdir/opt/onionspray" -name "*.pl" -exec chmod 755 {} \;
find "$pkgdir/opt/onionspray/vendors" -type f -exec chmod 755 {} \;
# Create necessary directories with proper permissions
install -dm700 "$pkgdir/opt/onionspray/secrets"
install -dm700 "$pkgdir/opt/onionspray/projects"
install -dm755 "$pkgdir/opt/onionspray/onionbalance"
# Create wrapper script in /usr/bin
install -dm755 "$pkgdir/usr/bin"
cat >"$pkgdir/usr/bin/onionspray" <<'EOF'
#!/bin/sh
exec /opt/onionspray/onionspray "$@"
EOF
chmod 755 "$pkgdir/usr/bin/onionspray"
# Install documentation
install -dm755 "$pkgdir/usr/share/doc/$pkgname"
install -Dm644 README.md "$pkgdir/usr/share/doc/$pkgname/" 2>/dev/null || true
install -Dm644 ChangeLog.md "$pkgdir/usr/share/doc/$pkgname/" 2>/dev/null || true
# Install license
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-11-03 00:01:00 | Low | 2 |
| 2026-11-02 00:26:00 | Low | 2 |
| 2026-11-01 00:21:48 | Low | 2 |
| 2026-10-31 00:07:41 | Low | 2 |
| 2026-10-30 00:29:30 | Low | 2 |
| 2026-10-29 00:13:55 | Low | 2 |
| 2026-10-28 00:06:54 | Low | 2 |
| 2026-10-27 00:23:28 | Low | 2 |
| 2026-10-26 00:12:40 | Low | 2 |
| 2026-10-25 00:20:48 | Low | 2 |
| 2026-10-24 00:14:55 | Low | 2 |
| 2026-10-23 00:02:19 | Low | 2 |
| 2026-10-22 00:13:10 | Low | 2 |
| 2026-10-21 00:12:50 | Low | 2 |
| 2026-10-20 00:10:31 | Low | 2 |
| 2026-10-19 00:03:55 | Low | 2 |
| 2026-10-18 00:06:55 | Low | 2 |
| 2026-10-17 00:21:55 | Low | 2 |
| 2026-10-16 00:12:47 | Low | 2 |
| 2026-10-15 00:28:05 | Low | 2 |