flyenv-git

LOW
maintainer zxp19821005 0 votes scanned 2026-11-02 00:26:00.633185
View on AUR
Why flagged

The npx execution in the build step is part of the project's own build process, using locally installed and verified dependencies, not an untrusted remote code execution.

Triggered rules

Low AI review downgraded a static finding 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 90%): The npx execution in the build step is part of the project's own build process, using locally installed and verified dependencies, not an untrusted remote code execution.

1 higher static finding superseded - not the current verdict (shown for transparency)
Medium npx/bunx/deno executes a remote package remote_code_tool

`npx`/`bunx`/`pnpm dlx`/`deno run <url>` downloads AND runs a remote package at build time — the moral equivalent of piping a download into a shell. Severity downgraded: Node.js consumer context.

  • PKGBUILD:212 npx esbuild --platform=node --bundle --packages=external --inject:scripts/shim-dynamic-require.mjs --format=esm scripts/app-builder.ts --outfile=electron/app-builder.mjs

PKGBUILD

1 offending line(s) highlighted
1# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
2pkgname=flyenv-git
3_pkgname=FlyEnv
4pkgver=4.20.2.r14.g71288ac
5_electronversion=39
6_nodeversion=24
7pkgrel=1
8pkgdesc="A modern alternative to XAMPP, MAMP, Laragon and Laravel Herd, with runtimes, databases, web servers, local sites, HTTPS, AI coding tools and MCP."
9arch=(
10 'aarch64'
11 'x86_64'
12)
13url="https://www.flyenv.com/"
14_ghurl="https://github.com/xpf0000/FlyEnv"
15license=('BSD-3-Clause')
16depends=(
17 "electron${_electronversion}"
18 '7zip'
19)
20makedepends=(
21 'git'
22 'yarn'
23 'gendesk'
24 'nvm'
25 'go'
26 'jq'
27)
28optdepends=(
29 'ollala'
30 'apache'
31 'caddy'
32 'consul'
33 'nginx'
34 'tomcat10'
35 'bun'
36 'deno'
37 'erlang'
38 'go'
39 'jdk-openjdk'
40 'nodejs'
41 'perl'
42 'php'
43 'python'
44 'ruby'
45 'rust'
46 'mariadb'
47 'mysql'
48 'mongodb'
49 'postgresql'
50 'etcd'
51 'memcached'
52 'rabbitmq'
53 'redis'
54 'mailpit'
55 'dnsmasq'
56 'bind'
57 'pure-ftpd'
58 'minio'
59)
60source=(
61 "${pkgname//-/.}::git+${_ghurl}.git"
62 "${pkgname%-git}.js"
63 "${pkgname%-git}.sh"
64)
65sha256sums=('SKIP'
66 '562897be8a17076176f8d985c0d7bc1c685f2e7c9b3a932339ce015963243627'
67 '0f4675ddc96a032accf82723c7b6b66007bafd18aa8d919b61e983a68fd25328')
68_get_project_dir() {
69 local d
70 while IFS= read -r d; do
71 find "$d" -name "package.json" ! -path "*/node_modules/*" 2>/dev/null | grep -q . && { echo "$d"; return; }
72 done < <(find "${srcdir}" -maxdepth 1 -mindepth 1 -type d ! -name '.*')
73}
74pkgver() {
75 cd "$(_get_project_dir)"
76 set -o pipefail
77 git describe --long --tags --abbrev=7 | sed 's/\([^-]*-g\)/r\1/;s/-/./g;s/v//g' ||
78 printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short=7 HEAD)"
79}
80_ensure_local_nvm() {
81 local NVM_DIR="${srcdir}/.nvm"
82 source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
83 nvm install "${_nodeversion}"
84 nvm use "${_nodeversion}"
85}
86_get_app_dir() {
87 find "${srcdir}" -type f -name "resources.pak" ! -path "*/node_modules/*" -printf '%h\n' 2>/dev/null \
88 | while read -r d; do [[ -d "${d}/resources" ]] && { echo "$d"; return 0; }; done
89}
90_get_electron_version() {
91 _elec_ver=$(find "$(_get_project_dir)" -name "package.json" ! -path "*/node_modules/*" -print \
92 | xargs -I{} jq -r '(.devDependencies.electron // .dependencies.electron) // empty' {} 2>/dev/null \
93 | grep -oE '[0-9]+' | head -1)
94 [[ -z "${_elec_ver}" ]] && return 1
95 (( _elec_ver == _electronversion )) && c=32 || c=31
96 echo -e "Electron version: \033[1;${c}m${_elec_ver}$([[ $c -eq 31 ]] && echo " (expected ${_electronversion})")\033[0m"
97}
98_set_build_env() {
99 export HOME="${srcdir}/.home"
100 export GOPATH="${HOME}/go"
101 export GOCACHE="${HOME}/go-build"
102 export GOENV="${HOME}/go/env"
103 export XDG_CONFIG_HOME="${HOME}/.config"
104 export XDG_CACHE_HOME="${HOME}/.cache"
105 export CGO_CPPFLAGS="${CPPFLAGS}"
106 export CGO_CFLAGS="${CFLAGS}"
107 export CGO_CXXFLAGS="${CXXFLAGS}"
108 export CGO_LDFLAGS="${LDFLAGS}"
109 export GOFLAGS="-buildmode=pie -trimpath -ldflags=-linkmode=external -mod=readonly -modcacherw"
110 export GOTOOLCHAIN=local
111 export GOWORK=off
112 export ELECTRON_DIST="/usr/lib/electron${_electronversion}"
113 export ELECTRON_OVERRIDE_DIST_PATH="${ELECTRON_DIST}"
114 export ELECTRON_SKIP_BINARY_DOWNLOAD=1
115 export ELECTRON_BUILDER_OFFLINE=true
116 export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/^v//')"
117 export XDG_CACHE_HOME="${HOME}/.cache"
118 export XDG_CONFIG_HOME="${HOME}/.config"
119 export XDG_DATA_HOME="${HOME}/.local/share"
120 export YARN_CACHE_FOLDER="${HOME}/.yarn/cache"
121 export YARN_NETWORK_CONCURRENCY=32
122 mkdir -p "${HOME}" "${GOCACHE}" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" "$(dirname "${GOENV}")"
123 : > "${GOENV}"
124 export COREPACK_NPM_REGISTRY="${COREPACK_NPM_REGISTRY:-${NPM_CONFIG_REGISTRY:-https://registry.npmjs.org}}"
125 export COREPACK_HOME="${HOME}/.corepack"
126 export npm_config_registry="${NPM_CONFIG_REGISTRY:-https://registry.npmjs.org}"
127 local _yarnver _yarnmajor=0
128 _yarnver="$(node -p "require('./package.json').packageManager?.split('@')[1]?.split('-')[0] || ''" 2>/dev/null)"
129 _yarnmajor="${_yarnver%%.*}"
130 _yarnmajor="${_yarnmajor:-0}"
131 if [[ "${_yarnmajor}" -ge 2 ]] 2>/dev/null || [[ -f .yarnrc.yml ]]; then
132 export XDG_STATE_HOME="${HOME}/.local/state"
133 export YARN_ENABLE_GLOBAL_CACHE=false
134 export YARN_ENABLE_MIRROR=false
135 export YARN_GLOBAL_FOLDER="${HOME}/.yarn/berry"
136 export YARN_NODE_LINKER=node-modules
137 export YARN_NM_MODE=hardlinks-local
138 export YARN_ENABLE_TELEMETRY=false
139 export YARN_ENABLE_SCRIPTS=true
140 export YARN_HTTP_TIMEOUT=600000
141 export YARN_HTTP_RETRY=5
142 export YARN_NPM_REGISTRY_SERVER="${YARN_NPM_REGISTRY_SERVER:-${NPM_CONFIG_REGISTRY:-https://registry.yarnpkg.com}}"
143 mkdir -p "${HOME}" "${YARN_CACHE_FOLDER}" "${YARN_GLOBAL_FOLDER}" "${COREPACK_HOME}"
144 else
145 export YARN_GLOBAL_FOLDER="${HOME}/.yarn/global"
146 export YARN_LINK_FOLDER="${HOME}/.yarn/link"
147 export YARN_TEMP_FOLDER="${HOME}/.yarn/tmp"
148 export YARN_NETWORK_TIMEOUT=600000
149 export YARN_CHILD_CONCURRENCY="$(nproc)"
150 export YARN_FROZEN_LOCKFILE=true
151 export YARN_IGNORE_ENGINES=true
152 export YARN_PRODUCTION=false
153 mkdir -p "${HOME}" "${YARN_CACHE_FOLDER}" "${YARN_GLOBAL_FOLDER}" "${YARN_LINK_FOLDER}" "${YARN_TEMP_FOLDER}" "${COREPACK_HOME}"
154 fi
155 local _reg="${NPM_CONFIG_REGISTRY:-https://registry.yarnpkg.com}"
156 _reg="${_reg%/}"
157 if [[ -f .yarnrc ]]; then
158 sed -i "s|^registry .*|registry \"${_reg}\"|" .yarnrc
159 fi
160 if [[ -f yarn.lock ]] && grep -q 'resolved "https://registry.yarnpkg.com' yarn.lock; then
161 sed -i "s|https://registry.yarnpkg.com/|${_reg}/|g" yarn.lock
162 fi
163}
164prepare() {
165 cd "$(_get_project_dir)"
166 _get_electron_version
167 sed -i -e "
168 s/@electronversion@/${_electronversion}/
169 s/@appname@/${pkgname%-git}/
170 " "${srcdir}/${pkgname%-git}.sh" "${srcdir}/${pkgname%-git}.js"
171 gendesk -q -f -n \
172 --pkgname="${pkgname%-git}" \
173 --pkgdesc="${pkgdesc}" \
174 --categories="Development" \
175 --name="${_pkgname}" \
176 --exec="${pkgname%-git} %U"
177 _ensure_local_nvm
178 _set_build_env
179 sed -i "s/'deb'/'dir'/;s/'rpm'/'dir'/" configs/electron-builder.ts
180 jq --arg ver "${SYSTEM_ELECTRON_VERSION}" '.devDependencies.electron = $ver' package.json > package.json.tmp && mv package.json.tmp package.json
181 sed -i -e "
182 s/target: 'deb'/target: 'dir'/g
183 s/target: 'rpm'/target: 'dir'/g
184 " configs/electron-builder.linux.ts
185 # Add electronDist to use system electron39
186 sed -i "/electronVersion: '39.8.10',/a\\ electronDist: '${ELECTRON_DIST}'," configs/electron-builder.linux.ts
187 export NODE_ENV=development
188 yarn install
189 # Init notarize.ts File
190 if [ -f build/notarize.ts ];then
191 rm -rf build/notarize.ts
192 fi
193 mkdir -p build
194 {
195 echo 'export default async function notarizing() {'
196 echo ' return;'
197 echo '}'
198 } >> build/notarize.ts
199 # Build Go helper
200 cd "$(_get_project_dir)/src/helper-go"
201 sed -i "s/CGO_ENABLED=0/CGO_ENABLED=1/g" build-os.sh
202 chmod +x ./build-os.sh
203 bash ./build-os.sh
204}
205build() {
206 cd "$(_get_project_dir)"
207 _ensure_local_nvm
208 _set_build_env
209 export NODE_ENV=production
210 yarn run clean:dev
211 yarn run clean
212 npx esbuild --platform=node --bundle --packages=external --inject:scripts/shim-dynamic-require.mjs --format=esm scripts/app-builder.ts --outfile=electron/app-builder.mjs
213 node electron/app-builder.mjs
214 local _arch7z=$([[ "${CARCH}" == "aarch64" ]] && echo arm64 || echo x64)
215 local _archrem=$([[ "${CARCH}" == "aarch64" ]] && echo x64 || echo arm64)
216 rm -rf "$(_get_app_dir)/resources/app.asar.unpacked/node_modules/7zip-bin/"{linux/{arm,ia32,"${_archrem}"},mac}
217 ln -sf "/usr/bin/7za" "$(_get_app_dir)/resources/app.asar.unpacked/node_modules/7zip-bin/linux/${_arch7z}/7za"
218 rm -rf "$(_get_app_dir)/resources/default_app.asar"
219}
220package() {
221 install -Dm755 "${srcdir}/${pkgname%-git}.sh" "${pkgdir}/usr/bin/${pkgname%-git}"
222 install -Dm644 "${srcdir}/${pkgname%-git}.js" -t "${pkgdir}/usr/lib/${pkgname%-git}"
223 cp -a "$(_get_app_dir)/resources/." "${pkgdir}/usr/lib/${pkgname%-git}/"
224 _icon_sizes=(16x16 32x32 128x128 256x256 512x512)
225 for _icons in "${_icon_sizes[@]}";do
226 install -Dm644 "$(_get_project_dir)/build/icons/${_icons}.png" \
227 "${pkgdir}/usr/share/icons/hicolor/${_icons}/apps/${pkgname%-git}.png"
228 done
229 install -Dm644 "$(_get_project_dir)/${pkgname%-git}.desktop" -t "${pkgdir}/usr/share/applications"
230 install -Dm644 "$(_get_project_dir)/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}"
231}
232

Changes since previous scan

--- PKGBUILD @ 2026-10-26 00:12
+++ PKGBUILD @ 2026-11-02 00:26
@@ -1,7 +1,7 @@
# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
pkgname=flyenv-git
_pkgname=FlyEnv
-pkgver=4.20.1.r2.g4f216d5
+pkgver=4.20.2.r14.g71288ac
_electronversion=39
_nodeversion=24
pkgrel=1
@@ -20,7 +20,6 @@
makedepends=(
'git'
'yarn'
- 'curl'
'gendesk'
'nvm'
'go'
@@ -60,10 +59,12 @@
)
source=(
"${pkgname//-/.}::git+${_ghurl}.git"
+ "${pkgname%-git}.js"
"${pkgname%-git}.sh"
)
sha256sums=('SKIP'
- 'dfcd6603d29c7b8d88e019b517a2e5c1a7b5ab905a0961a8b81adfa508b258b8')
+ '562897be8a17076176f8d985c0d7bc1c685f2e7c9b3a932339ce015963243627'
+ '0f4675ddc96a032accf82723c7b6b66007bafd18aa8d919b61e983a68fd25328')
_get_project_dir() {
local d
while IFS= read -r d; do
@@ -166,7 +167,7 @@
sed -i -e "
s/@electronversion@/${_electronversion}/
s/@appname@/${pkgname%-git}/
- " "${srcdir}/${pkgname%-git}.sh"
+ " "${srcdir}/${pkgname%-git}.sh" "${srcdir}/${pkgname%-git}.js"
gendesk -q -f -n \
--pkgname="${pkgname%-git}" \
--pkgdesc="${pkgdesc}" \
@@ -218,7 +219,7 @@
}
package() {
install -Dm755 "${srcdir}/${pkgname%-git}.sh" "${pkgdir}/usr/bin/${pkgname%-git}"
- install -Dm755 -d "${pkgdir}/usr/lib/${pkgname%-git}"
+ install -Dm644 "${srcdir}/${pkgname%-git}.js" -t "${pkgdir}/usr/lib/${pkgname%-git}"
cp -a "$(_get_app_dir)/resources/." "${pkgdir}/usr/lib/${pkgname%-git}/"
_icon_sizes=(16x16 32x32 128x128 256x256 512x512)
for _icons in "${_icon_sizes[@]}";do
@@ -228,3 +229,4 @@
install -Dm644 "$(_get_project_dir)/${pkgname%-git}.desktop" -t "${pkgdir}/usr/share/applications"
install -Dm644 "$(_get_project_dir)/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}"
}
+

Scan history

Scanned at (UTC)SeverityRules
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 23:46:04 Medium 1
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

Report a package

Reports go to the AURWatch maintainer (one person) and are read by hand. No login required.

0 / 4000
Your suggestion