moga-neon-cursor-theme
The package downloads cursor theme ZIP files from gnome-look.org, a plausible project host, and extracts them into the icon directory; these are non-executable data files, so even if the source were compromised, the worst case is theme corruption, not code execution.
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 cursor theme ZIP files from gnome-look.org, a plausible project host, and extracts them into the icon directory; these are non-executable data files, so even if the source were compromised, the worst case is theme corruption, not code execution.
1 higher static finding superseded - not the current verdict (shown for transparency)
external_download_not_in_source
curl/wget fetches a URL on a non-allowlisted host that is not part of source=(), so it is not checksum-verified by makepkg.
-
PKGBUILD:27
active_files=$(curl -Lsf "https://www.gnome-look.org/p/${_pkgid}/loadFiles" | \
PKGBUILD
1 offending line(s) highlighted# Maintainer: Gaou Piou <i.am.piou@gmail.com>
pkgname=moga-neon-cursor-theme
pkgver=2026.05.11.063410
pkgrel=1
_pkgid=2302110
pkgdesc="Neon cursor theme with multiple color variants (Blue, Cyan, Green, Magenta, Orange, Purple, Red, Rose, Sandy, Sky, Water, Yellow, Butter, Olieve)"
arch=('any')
url="https://www.gnome-look.org/p/${_pkgid}"
license=('GPL-3.0-or-later')
depends=()
makedepends=('curl' 'jq' 'perl' 'unzip')
options=('!strip' '!docs' '!debug')
install=moga-neon-cursor-theme.install
source=()
sha256sums=()
pkgver() {
local json timestamp
json=$(curl -sL "https://www.gnome-look.org/p/${_pkgid}/loadFiles")
timestamp=$(echo "$json" | jq -r '[.files[]] | sort_by(.updated_timestamp) | last | .updated_timestamp')
date -d"$timestamp" +%Y.%m.%d.%H%M%S
}
prepare() {
local active_files sorted_files download_url filename
active_files=$(curl -Lsf "https://www.gnome-look.org/p/${_pkgid}/loadFiles" | \
jq -r '.files[] | select(.active == "1")')
sorted_files=$(echo "$active_files" | jq -s 'sort_by(.updated_timestamp)')
while IFS= read -r file; do
download_url=$(echo "$file" | perl -pe 's/\%(\w\w)/chr hex $1/ge')
filename=$(basename "$download_url")
if [[ -f "$filename" ]]; then
echo "$filename already downloaded"
continue
fi
echo "downloading $filename"
if ! curl -Lsf "$download_url" -o "$filename"; then
echo "failed to download $filename, retrying in 7 minutes..."
sleep 420
curl -Lf "$download_url" -o "$filename"
fi
sleep 10
done < <(echo "$sorted_files" | jq -r '.[].url')
}
build() {
for f in *.zip; do
[[ -f "$f" ]] || continue
unzip -o "$f"
done
rm -f ./*.zip
}
package() {
install -dm755 "$pkgdir/usr/share/icons"
find "$srcdir" -mindepth 2 -maxdepth 2 -type d \
-exec cp -dr --no-preserve=ownership {} "$pkgdir/usr/share/icons/" \;
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 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 |
| 2026-10-14 00:06:47 | Low | 2 |
| 2026-10-13 00:23:45 | Low | 2 |