mustang
maintainer zxp19821005
· 0 votes
· scanned 2026-08-03 00:08:14.047287
LOW
View on AUR ↗
Why flagged
The flagged pattern involves yarn install commands, but these are for building the project from its own source code cloned from the official GitHub repository, using locked dependencies via yarn.lock; the installs are part of a standard build process, not arbitrary external package injection.
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 95%): The flagged pattern involves yarn install commands, but these are for building the project from its own source code cloned from the official GitHub repository, using locked dependencies via yarn.lock; the installs are part of a standard build process, not arbitrary external package injection.
1 higher static finding superseded - not the current verdict (shown for transparency)
MEDIUM
npm/yarn/pnpm install of an undeclared external package
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:103
NODE_ENV=development yarn add -D semver
PKGBUILD
1 offending line(s) highlighted
1
# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
2
pkgname=mustang
3
_pkgname=Mustang
4
pkgver=0.9.34
5
_electronversion=41
6
_nodever=24
7
pkgrel=1
8
pkgdesc="New full-featured desktop email, chat and video conference client.(Use system-wide electron)"
9
arch=('any')
10
url="https://mustang.im/"
11
_ghurl="https://github.com/mustang-im/mustang"
12
license=('EUPL-1.2')
13
depends=(
14
"electron${_electronversion}"
15
)
16
makedepends=(
17
'npm'
18
'nvm'
19
'curl'
20
'gendesk'
21
'git'
22
'yarn'
23
'jq'
24
)
25
source=("${pkgname}.sh")
26
sha256sums=('a774c2f54fbbeeaac3cefc0f7250796d30c86d27f0fd40b7eaf9c0fdb021623d')
27
_ensure_local_nvm() {
28
local NVM_DIR="${srcdir}/.nvm"
29
source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
30
nvm install "${_nodever}"
31
nvm use "${_nodever}"
32
}
33
_get_app_dir() {
34
find "${srcdir}" -type f -name "resources.pak" -exec dirname {} + | head -n 1
35
}
36
_set_build_env() {
37
export electronDist="/usr/lib/electron${_electronversion}"
38
export ELECTRON_SKIP_BINARY_DOWNLOAD=1
39
export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/v//g')"
40
export HOME="${srcdir}/.electron-gyp"
41
mkdir -p "${srcdir}/.electron-gyp"
42
if [[ "$(curl -s ipinfo.io/country)" == *"CN"* ]]; then
43
{
44
export YARN_REGISTRY="https://registry.npmmirror.com"
45
export ELECTRON_MIRROR="https://registry.npmmirror.com/-/binary/electron/"
46
export ELECTRON_BUILDER_BINARIES_MIRROR="https://registry.npmmirror.com/-/binary/electron-builder-binaries/"
47
export NODEJS_ORG_MIRROR="https://npmmirror.com/mirrors/node"
48
export YARN_CACHE_FOLDER="${srcdir}/.yarn/cache"
49
export YARN_PLUGINS_FOLDER="${srcdir}/.yarn/plugins"
50
export YARN_GLOBAL_FOLDER="${srcdir}/.yarn/global"
51
export YARN_USE_HARDLINKS=true
52
# export YARN_BUILD_FROM_SOURCE=true
53
export YARN_LINK_WORKSPACE_PACKAGES=true
54
export YARN_FETCH_RETRIES=3
55
export YARN_FETCH_RETRY_TIMEOUT=10000
56
export YARN_NETWORK_CONCURRENCY=32
57
}
58
find ./ -type f -name "yarn.lock" -exec sed -i "s/registry.yarnpkg.com/registry.npmmirror.com/g" {} +
59
fi
60
}
61
_get_electron_version() {
62
_elec_ver=$(find "${srcdir}" -maxdepth 5 -name "package.json" ! -path "*/node_modules/*" \
63
-exec grep -l '"electron"' {} + | xargs -I{} jq -r '(.devDependencies.electron // .dependencies.electron) // empty' {} 2>/dev/null | head -1)
64
[[ -z "${_elec_ver}" ]] && return 1
65
echo -e "The electron version is: \033[1;31m${_elec_ver%%.*}\033[0m"
66
}
67
prepare() {
68
cd "${srcdir}"
69
if [[ ! -d "${srcdir}/${pkgname}-${pkgver}" ]]; then
70
git clone \
71
--depth 1 \
72
--branch "v${pkgver}" \
73
"${_ghurl}" \
74
"${pkgname}-${pkgver}"
75
fi
76
cd "${srcdir}/${pkgname}-${pkgver}"
77
_get_electron_version
78
sed -i -e "
79
s/@electronversion@/${_electronversion}/g
80
s/@appname@/${pkgname}/g
81
s/@runname@/app.asar/g
82
s/@cfgdirname@/${pkgname}/g
83
" "${srcdir}/${pkgname}.sh"
84
gendesk -q -f -n \
85
--pkgname="${pkgname}" \
86
--pkgdesc="${pkgdesc}" \
87
--categories="Network" \
88
--name="${_pkgname}" \
89
--exec="${pkgname} %U"
90
_set_build_env
91
_ensure_local_nvm
92
cd "${srcdir}/${pkgname}-${pkgver}/app/build"
93
sh "${pkgname}-brand.sh"
94
cd "${srcdir}/${pkgname}-${pkgver}/app"
95
NODE_ENV=development yarn install --cache-folder "${srcdir}/.yarn_cache"
96
cd "${srcdir}/${pkgname}-${pkgver}/lib"
97
NODE_ENV=development yarn install --cache-folder "${srcdir}/.yarn_cache"
98
cd "${srcdir}/${pkgname}-${pkgver}/desktop"
99
sed -i "s/\"electron\": \"[^\"]*\"/\"electron\": \"${SYSTEM_ELECTRON_VERSION}\"/g" package.json
100
NODE_ENV=development yarn install --cache-folder "${srcdir}/.yarn_cache"
101
cd "${srcdir}/${pkgname}-${pkgver}/desktop/backend"
102
NODE_ENV=development yarn install --cache-folder "${srcdir}/.yarn_cache"
103
NODE_ENV=development yarn add -D semver
104
}
105
build() {
106
cd "${srcdir}/${pkgname}-${pkgver}/desktop"
107
_set_build_env
108
_ensure_local_nvm
109
NODE_OPTIONS="--max-old-space-size=4096" NODE_ENV=production yarn run build
110
NODE_ENV=production yarn electron-builder --linux dir -c.electronDist="${electronDist}" --config electron-builder.yml
111
local _app_dir=$(_get_app_dir)
112
find "${_app_dir}/resources/app.asar.unpacked" -type d \( -name "darwin-*" -o -name "win32-*" \) -exec rm -rf {} +
113
}
114
package() {
115
install -Dm755 "${srcdir}/${pkgname}.sh" "${pkgdir}/usr/bin/${pkgname}"
116
install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}"
117
local _app_dir=$(_get_app_dir)
118
cp -a "${_app_dir}/resources/"* "${pkgdir}/usr/lib/${pkgname}/"
119
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/desktop/build/icon.png" "${pkgdir}/usr/share/pixmaps/${pkgname}.png"
120
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/${pkgname}.desktop" -t "${pkgdir}/usr/share/applications"
121
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}"
122
}
123
Changes since previous scan
--- PKGBUILD @ 2026-07-20 00:19+++ PKGBUILD @ 2026-08-03 00:08@@ -1,7 +1,7 @@ # Maintainer: zxp19821005 <zxp19821005 at 163 dot com> pkgname=mustang _pkgname=Mustang-pkgver=0.9.33+pkgver=0.9.34 _electronversion=41 _nodever=24 pkgrel=1Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-08-03 00:08:14 | LOW | 2 |
| 2026-08-02 00:16:08 | LOW | 2 |
| 2026-08-01 00:11:18 | LOW | 2 |
| 2026-07-31 00:14:10 | LOW | 2 |
| 2026-07-30 00:17:23 | LOW | 2 |
| 2026-07-29 00:25:53 | LOW | 2 |
| 2026-07-28 00:07:28 | LOW | 2 |
| 2026-07-27 00:24:32 | LOW | 2 |
| 2026-07-26 00:07:32 | LOW | 2 |
| 2026-07-25 00:13:44 | LOW | 2 |
| 2026-07-24 00:02:28 | LOW | 2 |
| 2026-07-23 00:14:47 | LOW | 2 |
| 2026-07-22 00:29:32 | LOW | 2 |
| 2026-07-21 00:24:15 | LOW | 2 |
| 2026-07-20 11:14:00 | MEDIUM | 1 |
| 2026-07-20 00:19:49 | LOW | 2 |
| 2026-07-19 00:17:08 | LOW | 2 |
| 2026-07-18 00:14:48 | LOW | 2 |
| 2026-07-17 01:53:03 | MEDIUM | 1 |
| 2026-07-17 00:06:16 | LOW | 2 |