cloudreve-client
The PKGBUILD fetches and installs '@tauri-apps/cli@2' from npm at build time (line 46) rather than declaring it as a makedepend or vendoring it, meaning an npm registry compromise or version-range substitution could inject arbitrary code into the build process; combined with few votes and a recently uploaded personal-fork package, this represents a modest but real supply-chain risk beyond normal source building.
Triggered rules
npm_install_external
Runs `npm/yarn/pnpm install <package>` for a package not in source=(), pulling unpinned, unreviewed code at build time. Severity downgraded: the package declares/looks like a Node.js consumer, where build-time installs are expected.
-
PKGBUILD:46
npm install --no-audit --no-fund --prefix . '@tauri-apps/cli@2'
zero_votes_recent
Uploaded within the last 14 days with 2 or fewer community votes — little peer review so far.
llm_review
An AI model (anthropic/claude-sonnet-4.6) reviewed this and agrees it is MEDIUM (confidence 60%): The PKGBUILD fetches and installs '@tauri-apps/cli@2' from npm at build time (line 46) rather than declaring it as a makedepend or vendoring it, meaning an npm registry compromise or version-range substitution could inject arbitrary code into the build process; combined with few votes and a recently uploaded personal-fork package, this represents a modest but real supply-chain risk beyond normal source building.
PKGBUILD
1 offending line(s) highlighted# Maintainer: Loong <xiaoyueban@nmgjg.com.cn>
pkgname=cloudreve-client
pkgver=0.3.0
pkgrel=1
pkgdesc="Desktop sync client for Cloudreve (Linux/macOS fork of the official Windows client)"
arch=('x86_64')
url="https://github.com/cedev-1/cloudreve-client"
license=('MIT')
depends=('webkit2gtk-4.1' 'gtk3' 'libayatana-appindicator' 'hicolor-icon-theme' 'sqlite')
makedepends=('cargo' 'nodejs' 'npm' 'pkgconf')
# Mixed Rust/C/C++ (bundled C deps): GCC LTO breaks rustc's lld link (Arch wiki)
options=('!lto')
source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz"
'fix-wayland-positioner.patch')
sha256sums=('352325d6f9a1f21b73611fd3463ae16d74fd45d26824f4cb14686e5bb015189f'
'058885c8daeca4573a74be69c89fb3bcba63c374116609d676f11314cb67805b')
prepare() {
cd "$pkgname-$pkgver"
# Unbundle libsqlite3-sys: link the system sqlite (Arch wiki)
export LIBSQLITE3_SYS_USE_PKG_CONFIG=1
# Upstream build scripts assume yarn; use npm instead
sed -i 's/yarn run/npm run/g' src-tauri/tauri.conf.json
# Wayland tray crash fix merged upstream as #9 (ships in the next release)
patch -Np1 -i "$srcdir/fix-wayland-positioner.patch"
# Root package.json so `npm run build` resolves wherever the tauri CLI
# runs the beforeBuildCommand from
cat > package.json <<'EOF'
{
"name": "cloudreve-client-root",
"private": true,
"scripts": {
"build": "npm --prefix ui run build",
"dev": "npm --prefix ui run dev"
}
}
EOF
# Network phase: frontend deps, tauri CLI, and all cargo crates
npm --prefix ui install --no-audit --no-fund
npm install --no-audit --no-fund --prefix . '@tauri-apps/cli@2'
cargo fetch --locked --manifest-path src-tauri/Cargo.toml
}
build() {
cd "$pkgname-$pkgver"
export LIBSQLITE3_SYS_USE_PKG_CONFIG=1
# Everything is pre-fetched in prepare(); keep the build offline
export CARGO_NET_OFFLINE=true
./node_modules/.bin/tauri build --no-bundle
}
package() {
cd "$pkgname-$pkgver"
install -Dm755 target/release/cloudreve-desktop \
"$pkgdir/usr/bin/cloudreve-desktop"
for size in 32x32 64x64 128x128; do
install -Dm644 "src-tauri/icons/$size.png" \
"$pkgdir/usr/share/icons/hicolor/$size/apps/cloudreve-desktop.png"
done
install -Dm644 src-tauri/icons/128x128@2x.png \
"$pkgdir/usr/share/icons/hicolor/256x256/apps/cloudreve-desktop.png"
install -Dm644 /dev/stdin "$pkgdir/usr/share/applications/cloudreve-desktop.desktop" <<'EOF'
[Desktop Entry]
Type=Application
Name=Cloudreve
GenericName=Cloud Sync Client
Comment=Sync folders with a Cloudreve server
Exec=cloudreve-desktop
Icon=cloudreve-desktop
Terminal=false
Categories=Network;FileTransfer;
EOF
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-10-17 00:21:55 | Medium | 3 |
| 2026-10-16 00:12:47 | Medium | 3 |
| 2026-10-15 00:28:05 | Medium | 3 |
| 2026-10-14 00:06:47 | Medium | 3 |
| 2026-10-13 00:23:45 | Medium | 3 |
| 2026-10-12 01:13:21 | Medium | 3 |
| 2026-10-12 01:11:47 | Medium | 2 |