escrcpy
LOW
maintainer zxp19821005
0 votes
scanned 2026-10-17 00:21:55.226236
Why flagged
The package installs pnpm from a version specified in the project's package.json, which is a normal part of building the project; this is a standard Node.js workflow and does not introduce untrusted external code execution.
Triggered rules
Low
AI review of an ambiguous pattern
llm_review
The static rules found a suspicious pattern they could not resolve, so an AI model (qwen/qwen3-235b-a22b-2507) reviewed it and judged it LOW (confidence 95%): The package installs pnpm from a version specified in the project's package.json, which is a normal part of building the project; this is a standard Node.js workflow and does not introduce untrusted external code execution.
-
PKGBUILD:83
npm install -g "pnpm@${_pnpmver}" --prefix "${HOME}/.pnpm" \
PKGBUILD
1 offending line(s) highlighted
1
# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
2
pkgname=escrcpy
3
pkgver=3.3.1
4
_electronversion=42
5
_nodeversion=24
6
pkgrel=1
7
pkgdesc="Display and control your Android device graphically with scrcpy.使用图形化的 Scrcpy 显示和控制您的 Android 设备"
8
arch=(
9
'aarch64'
10
'x86_64'
11
)
12
url="https://escrcpy.viarotel.eu.org/"
13
_ghurl="https://github.com/viarotel-org/escrcpy"
14
license=('MIT')
15
conflicts=("${pkgname}")
16
depends=(
17
"electron${_electronversion}"
18
'gnirehtet'
19
'scrcpy'
20
'android-tools'
21
)
22
makedepends=(
23
'gendesk'
24
'npm'
25
'nvm'
26
'pnpm'
27
'git'
28
'jq'
29
)
30
source=(
31
"${pkgname}-${pkgver}::git+${_ghurl}#tag=v${pkgver}"
32
"${pkgname}.sh"
33
)
34
sha256sums=('f529232a6f082b95a6da7adade3996e262015796ac934fef08255f1e8231cac4'
35
'cebedc3391cbab6d43f37fbf3a87ddaad16597cb5ea487a4d55b1f478d810082')
36
_ensure_local_nvm() {
37
local NVM_DIR="${srcdir}/.nvm"
38
source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
39
nvm install "${_nodeversion}"
40
nvm use "${_nodeversion}"
41
}
42
_get_project_dir() {
43
local d
44
while IFS= read -r d; do
45
find "$d" -name "package.json" ! -path "*/node_modules/*" 2>/dev/null | grep -q . && { echo "$d"; return; }
46
done < <(find "${srcdir}" -maxdepth 1 -mindepth 1 -type d ! -name '.*')
47
}
48
_get_app_dir() {
49
find "${srcdir}" -type f -name "resources.pak" -print 2>/dev/null | while read f; do [ -d "${f%/*}/resources" ] && echo "${f%/*}" && break; done
50
}
51
_set_build_env() {
52
export ELECTRON_DIST="/usr/lib/electron${_electronversion}"
53
export ELECTRON_OVERRIDE_DIST_PATH="${ELECTRON_DIST}"
54
export ELECTRON_SKIP_BINARY_DOWNLOAD=1
55
export ELECTRON_BUILDER_OFFLINE=true
56
export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/^v//')"
57
export HOME="${srcdir}/.home"
58
export XDG_CACHE_HOME="${HOME}/.cache"
59
export XDG_CONFIG_HOME="${HOME}/.config"
60
export XDG_DATA_HOME="${HOME}/.local/share"
61
export XDG_STATE_HOME="${HOME}/.local/state"
62
export PNPM_HOME="${HOME}/.pnpm/bin"
63
export pnpm_config_cache_dir="${HOME}/.pnpm_cache"
64
export pnpm_config_store_dir="${HOME}/.pnpm_store"
65
export pnpm_config_global_dir="${HOME}/.pnpm/global"
66
export pnpm_config_state_dir="${HOME}/.pnpm/state"
67
export pnpm_config_node_linker=hoisted
68
export pnpm_config_minimum_release_age=0
69
export pnpm_config_update_notifier=false
70
export COREPACK_NPM_REGISTRY="${COREPACK_NPM_REGISTRY:-${NPM_CONFIG_REGISTRY:-https://registry.npmjs.org}}"
71
export COREPACK_HOME="${HOME}/.corepack"
72
mkdir -p "${HOME}" "${PNPM_HOME}" "${pnpm_config_cache_dir}" "${pnpm_config_store_dir}" "${pnpm_config_global_dir}" "${pnpm_config_state_dir}" "${COREPACK_HOME}"
73
export PATH="${PNPM_HOME}:${PATH}"
74
local _pnpmver=""
75
local _pkgjson="$(_get_project_dir)/package.json"
76
if [ -f "${_pkgjson}" ]; then
77
_pnpmver="$(grep -o '"packageManager"[^,]*' "${_pkgjson}" 2>/dev/null | grep -oE 'pnpm@[^"+]+' | head -n1 | sed 's/^pnpm@//')"
78
if [ -z "${_pnpmver}" ]; then
79
_pnpmver="$(grep -oE '"pnpm"[[:space:]]*:[[:space:]]*"[^"]+"' "${_pkgjson}" 2>/dev/null | grep -oE '[0-9][0-9.]*' | head -n1)"
80
fi
81
fi
82
if [ -n "${_pnpmver}" ]; then
83
npm install -g "pnpm@${_pnpmver}" --prefix "${HOME}/.pnpm" \
84
--registry "${COREPACK_NPM_REGISTRY}"
85
fi
86
}
87
_get_electron_version() {
88
_elec_ver=$(find "$(_get_project_dir)" -name "package.json" ! -path "*/node_modules/*" -print \
89
| xargs -I{} jq -r '(.devDependencies.electron // .dependencies.electron) // empty' {} 2>/dev/null \
90
| grep -oE '[0-9]+' | head -1)
91
[[ -z "${_elec_ver}" ]] && return 1
92
(( _elec_ver == _electronversion )) && c=32 || c=31
93
echo -e "Electron version: \033[1;${c}m${_elec_ver}$([[ $c -eq 31 ]] && echo " (expected ${_electronversion})")\033[0m"
94
}
95
prepare() {
96
cd "$(_get_project_dir)"
97
_get_electron_version
98
sed -i -e "
99
s/@electronversion@/${_electronversion}/g
100
s/@appname@/${pkgname}/g
101
s/@runname@/app.asar/g
102
" "${srcdir}/${pkgname}.sh"
103
gendesk -q -f -n \
104
--pkgname="${pkgname}" \
105
--pkgdesc="${pkgdesc}" \
106
--categories="Utility" \
107
--name="${pkgname}" \
108
--exec="${pkgname} %U"
109
_ensure_local_nvm
110
_set_build_env
111
find desktop/{electron,src} -type f -exec sed -i "s/process.resourcesPath/\"\/usr\/lib\/${pkgname}\"/g" {} \;
112
jq --arg ver "${SYSTEM_ELECTRON_VERSION}" '.devDependencies.electron = $ver' package.json > package.json.tmp && mv package.json.tmp package.json
113
ln -sf "/usr/share/scrcpy/scrcpy-server" desktop/electron/resources/extra/common/scrcpy/scrcpy-server
114
ln -sf "/usr/share/scrcpy/scrcpy-server" desktop/electron/resources/extra/common/wscrcpy/scrcpy-server
115
case "${CARCH}" in
116
aarch64) _arch="linux-arm64" ;;
117
x86_64) _arch="linux-x64" ;;
118
esac
119
_extra="desktop/electron/resources/extra/${_arch}"
120
ln -sf "/usr/bin/adb" "${_extra}/scrcpy/adb"
121
ln -sf "/usr/bin/fastboot" "${_extra}/scrcpy/fastboot"
122
ln -sf "/usr/bin/scrcpy" "${_extra}/scrcpy/scrcpy"
123
ln -sf "/usr/share/scrcpy/scrcpy-server" "${_extra}/scrcpy/scrcpy-server"
124
[[ "${CARCH}" == "x86_64" ]] && ln -sf "/usr/bin/gnirehtet" "${_extra}/gnirehtet/gnirehtet"
125
[[ "${CARCH}" == "aarch64" ]] && ln -sf "/usr/bin/adb" "${_extra}/scrcpy/scrcpy"
126
export NODE_ENV=development
127
pnpm install
128
}
129
build() {
130
cd "$(_get_project_dir)"
131
_ensure_local_nvm
132
_set_build_env
133
export NODE_ENV=production
134
for pkg in packages/*; do
135
[[ -d "${pkg}" ]] && (cd "${pkg}" && pnpm build)
136
done
137
cd desktop
138
pnpm build
139
pnpm -c exec "electron-builder --linux dir -c.electronDist=${ELECTRON_DIST} --config electron-builder.config.js"
140
}
141
package() {
142
install -Dm755 "${srcdir}/${pkgname}.sh" "${pkgdir}/usr/bin/${pkgname}"
143
install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}"
144
local _app_dir="$(_get_app_dir)"
145
rm -rf "${_app_dir}/resources/default_app.asar"
146
cp -a "${_app_dir}/resources/." "${pkgdir}/usr/lib/${pkgname}/"
147
install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}/lib"
148
ln -sf "/usr/lib/${pkgname}/app.asar.unpacked/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3" \
149
"${pkgdir}/usr/lib/${pkgname}/lib/libvips-cpp.so.8.17.3"
150
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/${pkgname}.desktop" -t "${pkgdir}/usr/share/applications"
151
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/desktop/electron/resources/build/logo.png" "${pkgdir}/usr/share/pixmaps/${pkgname}.png"
152
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}"
153
}
Changes since previous scan
--- PKGBUILD @ 2026-09-01 11:47+++ PKGBUILD @ 2026-10-17 00:21@@ -1,10 +1,10 @@ # Maintainer: zxp19821005 <zxp19821005 at 163 dot com> pkgname=escrcpy-pkgver=3.2.0+pkgver=3.3.1 _electronversion=42 _nodeversion=24 pkgrel=1-pkgdesc="📱Graphical Scrcpy to display and control Android devices powered by Electron(Use system-wide electron).使用图形化的 Scrcpy 显示和控制您的 Android 设备,由 Electron 驱动。"+pkgdesc="Display and control your Android device graphically with scrcpy.使用图形化的 Scrcpy 显示和控制您的 Android 设备" arch=( 'aarch64' 'x86_64'@@ -23,7 +23,6 @@ 'gendesk' 'npm' 'nvm'- 'curl' 'pnpm' 'git' 'jq'@@ -32,57 +31,74 @@ "${pkgname}-${pkgver}::git+${_ghurl}#tag=v${pkgver}" "${pkgname}.sh" )-sha256sums=('94f9003a577b7f055996de012e6797aa3ef72f11207379800b4fb0c667259b1e'- 'a774c2f54fbbeeaac3cefc0f7250796d30c86d27f0fd40b7eaf9c0fdb021623d')+sha256sums=('f529232a6f082b95a6da7adade3996e262015796ac934fef08255f1e8231cac4'+ 'cebedc3391cbab6d43f37fbf3a87ddaad16597cb5ea487a4d55b1f478d810082') _ensure_local_nvm() { local NVM_DIR="${srcdir}/.nvm" source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]] nvm install "${_nodeversion}" nvm use "${_nodeversion}" }+_get_project_dir() {+ local d+ while IFS= read -r d; do+ find "$d" -name "package.json" ! -path "*/node_modules/*" 2>/dev/null | grep -q . && { echo "$d"; return; }+ done < <(find "${srcdir}" -maxdepth 1 -mindepth 1 -type d ! -name '.*')+} _get_app_dir() {- find "${srcdir}" -type f -name "resources.pak" -exec dirname {} + | head -n 1+ find "${srcdir}" -type f -name "resources.pak" -print 2>/dev/null | while read f; do [ -d "${f%/*}/resources" ] && echo "${f%/*}" && break; done } _set_build_env() {- export ELECTRON_DIST="/usr/lib/electron${_electronversion}"- export ELECTRON_SKIP_BINARY_DOWNLOAD=1- export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/v//g')"- export HOME="${srcdir}/.electron-gyp"- {- export PNPM_LINK_WORKSPACE_PACKAGES=true- export PNPM_FETCH_RETRY_MAXTIMEOUT=10000- export PNPM_CACHE_DIR="${srcdir}/.pnpm_cache"- export PNPM_STORE_DIR="${srcdir}/.pnpm_store"- export PNPM_VIRTUAL_STORE_DIR="${srcdir}/.pnpm_store"- export PNPM_SHAMEFULLY_HOIST=true- export PNPM_VIRTUAL_STORE_DIR_MAX_LENGTH=80- export PNPM_NODE_LINKER=hoisted- export PNPM_NETWORK_CONCURRENCY=32- }- if [[ "$(curl -s ipinfo.io/country)" == *"CN"* ]]; then- {- export pnpm_config_registry="https://registry.npmmirror.com"- export npm_config_registry="https://registry.npmmirror.com"- export NPM_CONFIG_ELECTRON_MIRROR="https://registry.npmmirror.com/-/binary/electron/"- export NPM_CONFIG_ELECTRON_BUILDER_BINARIES_MIRROR="https://registry.npmmirror.com/-/binary/electron-builder-binaries/"- export NODEJS_ORG_MIRROR="https://npmmirror.com/mirrors/node"- }- fi+ export ELECTRON_DIST="/usr/lib/electron${_electronversion}"+ export ELECTRON_OVERRIDE_DIST_PATH="${ELECTRON_DIST}"+ export ELECTRON_SKIP_BINARY_DOWNLOAD=1+ export ELECTRON_BUILDER_OFFLINE=true+ export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/^v//')"+ export HOME="${srcdir}/.home"+ export XDG_CACHE_HOME="${HOME}/.cache"+ export XDG_CONFIG_HOME="${HOME}/.config"+ export XDG_DATA_HOME="${HOME}/.local/share"+ export XDG_STATE_HOME="${HOME}/.local/state"+ export PNPM_HOME="${HOME}/.pnpm/bin"+ export pnpm_config_cache_dir="${HOME}/.pnpm_cache"+ export pnpm_config_store_dir="${HOME}/.pnpm_store"+ export pnpm_config_global_dir="${HOME}/.pnpm/global"+ export pnpm_config_state_dir="${HOME}/.pnpm/state"+ export pnpm_config_node_linker=hoisted+ export pnpm_config_minimum_release_age=0+ export pnpm_config_update_notifier=false+ export COREPACK_NPM_REGISTRY="${COREPACK_NPM_REGISTRY:-${NPM_CONFIG_REGISTRY:-https://registry.npmjs.org}}"+ export COREPACK_HOME="${HOME}/.corepack"+ mkdir -p "${HOME}" "${PNPM_HOME}" "${pnpm_config_cache_dir}" "${pnpm_config_store_dir}" "${pnpm_config_global_dir}" "${pnpm_config_state_dir}" "${COREPACK_HOME}"+ export PATH="${PNPM_HOME}:${PATH}"+ local _pnpmver=""+ local _pkgjson="$(_get_project_dir)/package.json"+ if [ -f "${_pkgjson}" ]; then+ _pnpmver="$(grep -o '"packageManager"[^,]*' "${_pkgjson}" 2>/dev/null | grep -oE 'pnpm@[^"+]+' | head -n1 | sed 's/^pnpm@//')"+ if [ -z "${_pnpmver}" ]; then+ _pnpmver="$(grep -oE '"pnpm"[[:space:]]*:[[:space:]]*"[^"]+"' "${_pkgjson}" 2>/dev/null | grep -oE '[0-9][0-9.]*' | head -n1)"+ fi+ fi+ if [ -n "${_pnpmver}" ]; then+ npm install -g "pnpm@${_pnpmver}" --prefix "${HOME}/.pnpm" \+ --registry "${COREPACK_NPM_REGISTRY}"+ fi } _get_electron_version() {- _elec_ver=$(find "${srcdir}" -maxdepth 5 -name "package.json" ! -path "*/node_modules/*" \- -exec grep -l '"electron"' {} + | xargs -I{} jq -r '(.devDependencies.electron // .dependencies.electron) // empty' {} 2>/dev/null | head -1)- [[ -z "${_elec_ver}" ]] && return 1- echo -e "The electron version is: \033[1;31m${_elec_ver%%.*}\033[0m"+ _elec_ver=$(find "$(_get_project_dir)" -name "package.json" ! -path "*/node_modules/*" -print \+ | xargs -I{} jq -r '(.devDependencies.electron // .dependencies.electron) // empty' {} 2>/dev/null \+ | grep -oE '[0-9]+' | head -1)+ [[ -z "${_elec_ver}" ]] && return 1+ (( _elec_ver == _electronversion )) && c=32 || c=31+ echo -e "Electron version: \033[1;${c}m${_elec_ver}$([[ $c -eq 31 ]] && echo " (expected ${_electronversion})")\033[0m" } prepare() {- cd "${srcdir}/${pkgname}-${pkgver}"+ cd "$(_get_project_dir)" _get_electron_version sed -i -e " s/@electronversion@/${_electronversion}/g s/@appname@/${pkgname}/g s/@runname@/app.asar/g- s/@cfgdirname@/${_pkgname}/g " "${srcdir}/${pkgname}.sh" gendesk -q -f -n \ --pkgname="${pkgname}" \@@ -90,56 +106,48 @@ --categories="Utility" \ --name="${pkgname}" \ --exec="${pkgname} %U"+ _ensure_local_nvm _set_build_env- _ensure_local_nvm find desktop/{electron,src} -type f -exec sed -i "s/process.resourcesPath/\"\/usr\/lib\/${pkgname}\"/g" {} \;- sed -i "s/\"electron\": \"[^\"]*\"/\"electron\": \"${SYSTEM_ELECTRON_VERSION}\"/g" desktop/package.json- sed -i "s|\"build:electron\": \"electron-builder --config=./electron-builder.config.js --publish=never\"|\"build:electron\": \"electron-builder --config=electron-builder.config.js --linux dir -c.electronDist ${ELECTRON_DIST}\"|" desktop/package.json+ jq --arg ver "${SYSTEM_ELECTRON_VERSION}" '.devDependencies.electron = $ver' package.json > package.json.tmp && mv package.json.tmp package.json ln -sf "/usr/share/scrcpy/scrcpy-server" desktop/electron/resources/extra/common/scrcpy/scrcpy-server ln -sf "/usr/share/scrcpy/scrcpy-server" desktop/electron/resources/extra/common/wscrcpy/scrcpy-server case "${CARCH}" in- aarch64)- ln -sf "/usr/bin/adb" desktop/electron/resources/extra/linux-arm64/scrcpy/adb- ln -sf "/usr/bin/fastboot" desktop/electron/resources/extra/linux-arm64/scrcpy/fastboot- ln -sf "/usr/bin/scrcpy" desktop/electron/resources/extra/linux-arm64/scrcpy/scrcpy- ln -sf "/usr/bin/adb" desktop/electron/resources/extra/linux-arm64/scrcpy/scrcpy- ln -sf "/usr/share/scrcpy/scrcpy-server" desktop/electron/resources/extra/linux-arm64/scrcpy/scrcpy-server- ;;- x86_64)- ln -sf "/usr/bin/adb" desktop/electron/resources/extra/linux-x64/scrcpy/adb- ln -sf "/usr/bin/fastboot" desktop/electron/resources/extra/linux-x64/scrcpy/fastboot- ln -sf "/usr/bin/gnirehtet" desktop/electron/resources/extra/linux-x64/gnirehtet/gnirehtet- ln -sf "/usr/bin/scrcpy" desktop/electron/resources/extra/linux-x64/scrcpy/scrcpy- ln -sf "/usr/share/scrcpy/scrcpy-server" desktop/electron/resources/extra/linux-x64/scrcpy/scrcpy-server- ;;+ aarch64) _arch="linux-arm64" ;;+ x86_64) _arch="linux-x64" ;; esac- NODE_ENV=development pnpm install+ _extra="desktop/electron/resources/extra/${_arch}"+ ln -sf "/usr/bin/adb" "${_extra}/scrcpy/adb"+ ln -sf "/usr/bin/fastboot" "${_extra}/scrcpy/fastboot"+ ln -sf "/usr/bin/scrcpy" "${_extra}/scrcpy/scrcpy"+ ln -sf "/usr/share/scrcpy/scrcpy-server" "${_extra}/scrcpy/scrcpy-server"+ [[ "${CARCH}" == "x86_64" ]] && ln -sf "/usr/bin/gnirehtet" "${_extra}/gnirehtet/gnirehtet"+ [[ "${CARCH}" == "aarch64" ]] && ln -sf "/usr/bin/adb" "${_extra}/scrcpy/scrcpy"+ export NODE_ENV=development+ pnpm install } build() {- cd "${srcdir}/${pkgname}-${pkgver}"+ cd "$(_get_project_dir)"+ _ensure_local_nvm _set_build_env- _ensure_local_nvm- NODE_ENV=production pnpm turbo build:electron -- --linux dir+ export NODE_ENV=production+ for pkg in packages/*; do+ [[ -d "${pkg}" ]] && (cd "${pkg}" && pnpm build)+ done+ cd desktop+ pnpm build+ pnpm -c exec "electron-builder --linux dir -c.electronDist=${ELECTRON_DIST} --config electron-builder.config.js" } package() { install -Dm755 "${srcdir}/${pkgname}.sh" "${pkgdir}/usr/bin/${pkgname}" install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}"- case "${CARCH}" in- aarch64)- _os_aarch="linux-arm64-unpacked"- ;;- x86_64)- _os_aarch="linux-unpacked"- ;;- esac- local _app_dir=$(_get_app_dir)- cp -a "${_app_dir}/resources/"* "${pkgdir}/usr/lib/${pkgname}/"+ local _app_dir="$(_get_app_dir)"+ rm -rf "${_app_dir}/resources/default_app.asar"+ cp -a "${_app_dir}/resources/." "${pkgdir}/usr/lib/${pkgname}/" install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}/lib" ln -sf "/usr/lib/${pkgname}/app.asar.unpacked/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3" \ "${pkgdir}/usr/lib/${pkgname}/lib/libvips-cpp.so.8.17.3"- rm -rf "${pkgdir}/usr/lib/${pkgname}/default_app.asar" install -Dm644 "${srcdir}/${pkgname}-${pkgver}/${pkgname}.desktop" -t "${pkgdir}/usr/share/applications" install -Dm644 "${srcdir}/${pkgname}-${pkgver}/desktop/electron/resources/build/logo.png" "${pkgdir}/usr/share/pixmaps/${pkgname}.png" install -Dm644 "${srcdir}/${pkgname}-${pkgver}/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}" }-Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-10-17 00:21:55 | Low | 1 |
| 2026-10-16 00:12:47 | Low | 1 |
| 2026-10-15 00:28:05 | Low | 1 |
| 2026-10-14 00:06:47 | Low | 1 |
| 2026-10-13 00:23:45 | Low | 1 |
| 2026-10-12 00:18:51 | Low | 1 |
| 2026-10-11 00:26:05 | Low | 1 |
| 2026-10-10 06:13:18 | Low | 1 |
| 2026-09-01 11:47:58 | Clean | 0 |
| 2026-08-27 05:31:50 | Clean | 0 |
| 2026-06-18 16:11:54 | Clean | 0 |