pupu-git

LOW
maintainer zxp19821005 0 votes scanned 2026-09-17 00:27:14.276658
View on AUR
Why flagged

The pip install is part of building the project from its own source (including a local git submodule 'unchain'), using pinned requirements; it does not execute untrusted remote code or install arbitrary external packages.

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 pip install is part of building the project from its own source (including a local git submodule 'unchain'), using pinned requirements; it does not execute untrusted remote code or install arbitrary external packages.

1 higher static finding superseded - not the current verdict (shown for transparency)
Medium pip install of an external package pip_install_external

`pip install <package>` fetches an unpinned package from PyPI at build time, outside source=() and makepkg's checksums.

  • PKGBUILD:118 python -m pip install --upgrade pip
  • PKGBUILD:119 python -m pip install -r unchain_runtime/server/requirements.txt -e ../unchain pyinstaller

PKGBUILD

2 offending line(s) highlighted
1# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
2pkgname=pupu-git
3_pkgname=PuPu
4pkgver=0.1.10.r2.gb664b9f
5_electronversion=40
6_nodeversion=22
7pkgrel=1
8pkgdesc="A simple and easy to use UI for the Ollama.(Use system-wide electron)"
9arch=('any')
10url="https://github.com/haoxiang-xu/PuPu"
11license=('MIT')
12provides=("${pkgname%-git}=${pkgver%.r*}")
13conflicts=("${pkgname%-git}")
14depends=(
15 "electron${_electronversion}"
16 'nodejs'
17 'uv'
18 'python-urllib3'
19 'python-typing_extensions'
20 'python-legacy-cgi'
21 'python-packaging'
22 'python-attrs'
23 'python-filelock'
24 'python-keyring'
25 'python-pip'
26 'python-cryptography'
27 'libxcrypt-compat'
28 'python-requests'
29)
30makedepends=(
31 'npm'
32 'nvm'
33 'git'
34 'curl'
35 'gendesk'
36 'jq'
37)
38source=(
39 "${pkgname//-/.}::git+${url}.git"
40 "unchain::git+https://github.com/haoxiang-xu/unchain.git"
41 "${pkgname%-git}.sh"
42)
43sha256sums=('SKIP'
44 'SKIP'
45 'a774c2f54fbbeeaac3cefc0f7250796d30c86d27f0fd40b7eaf9c0fdb021623d')
46pkgver() {
47 cd "${srcdir}/${pkgname//-/.}"
48 set -o pipefail
49 git describe --long --tags --abbrev=7 | sed 's/\([^-]*-g\)/r\1/;s/-/./g;s/v//g' ||
50 printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short=7 HEAD)"
51}
52_ensure_local_nvm() {
53 local NVM_DIR="${srcdir}/.nvm"
54 source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
55 nvm install "${_nodeversion}"
56 nvm use "${_nodeversion}"
57}
58_set_build_env() {
59 export ELECTRON_DIST="/usr/lib/electron${_electronversion}"
60 export ELECTRON_SKIP_BINARY_DOWNLOAD=1
61 export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/v//g')"
62 export HOME="${srcdir}/.electron-gyp"
63 export NPM_CONFIG_CACHE="${srcdir}/.npm_cache"
64 export NPM_CONFIG_MAXSOCKETS=32
65 if [[ "$(curl -s ipinfo.io/country)" == *"CN"* ]]; then
66 {
67 export NPM_CONFIG_REGISTRY="https://registry.npmmirror.com"
68 export NODEJS_ORG_MIRROR="https://npmmirror.com/mirrors/node"
69 export ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"
70 export ELECTRON_BUILDER_BINARIES_MIRROR="https://npmmirror.com/mirrors/electron-builder-binaries/"
71 }
72 find ./ -type f -name "package-lock.json" -exec sed -i "s/registry.npmjs.org/registry.npmmirror.com/g" {} +
73 fi
74}
75_get_app_dir() {
76 find "${srcdir}" -type f -name "resources.pak" -exec dirname {} + | head -n 1
77}
78_get_electron_version() {
79 _elec_ver=$(find "${srcdir}" -maxdepth 5 -name "package.json" ! -path "*/node_modules/*" \
80 -exec grep -l '"electron"' {} + | xargs -I{} jq -r '(.devDependencies.electron // .dependencies.electron) // empty' {} 2>/dev/null | head -1)
81 [[ -z "${_elec_ver}" ]] && return 1
82 echo -e "The electron version is: \033[1;31m${_elec_ver%%.*}\033[0m"
83}
84prepare() {
85 cd "${srcdir}/${pkgname//-/.}"
86 _get_electron_version
87 sed -e "
88 s/@electronversion@/${_electronversion}/g
89 s/@appname@/${pkgname%-git}/g
90 s/@runname@/app.asar/g
91 s/@cfgdirname@/${pkgname%-git}/g
92 " -i "${srcdir}/${pkgname%-git}.sh"
93 gendesk -q -f -n \
94 --pkgname="${pkgname%-git}" \
95 --pkgdesc="${pkgdesc}" \
96 --categories="Utility" \
97 --name="${_pkgname}" \
98 --exec="${pkgname%-git} %U"
99 _set_build_env
100 _ensure_local_nvm
101 sed -i "s/sys.version_info\[:2\] == (3, 12)/sys.version_info[0] == 3 and sys.version_info[1] >= 12/g" unchain_runtime/scripts/build_unchain_server.sh
102 sed -i "s/sys.version_info\[:2\] == (3, 12)/sys.version_info[0] == 3 and sys.version_info[1] >= 12/g" scripts/init_python312_venv.sh
103 find src -type f -exec sed -i "s/process.resourcesPath/\'\/usr\/lib\/${pkgname%-git}\'/g" {} +
104 sed -i "s/\"electron\": \"[^\"]*\"/\"electron\": \"${SYSTEM_ELECTRON_VERSION}\"/g" package.json
105 # Fix broken progress package (lib directory is empty)
106 sed -i 's/"overrides": {/"overrides": {\n "progress": "2.0.3",/' package.json
107 NODE_ENV=development npm install --legacy-peer-deps
108}
109build() {
110 cd "${srcdir}/${pkgname//-/.}"
111 _set_build_env
112 _ensure_local_nvm
113 export PUPU_BUILD_VERSION="$(node -p "require('./package.json').version")"
114 export UNCHAIN_SOURCE_PATH="${srcdir}/unchain"
115 rm -rf "${srcdir}/.venv"
116 python3.12 -m venv "${srcdir}/.venv"
117 source "${srcdir}/.venv/bin/activate"
118 python -m pip install --upgrade pip
119 python -m pip install -r unchain_runtime/server/requirements.txt -e ../unchain pyinstaller
120 export UNCHAIN_BUILD_VENV="${srcdir}/.venv"
121 export UNCHAIN_BUILD_SKIP_INSTALL=1
122 NODE_ENV=production npm run build:unchain:linux
123 NODE_ENV=production npm run build:web
124 NODE_ENV=production npm exec -c "electron-builder --linux dir -c.electronDist=${ELECTRON_DIST}"
125}
126
127package() {
128 install -Dm755 "${srcdir}/${pkgname%-git}.sh" "${pkgdir}/usr/bin/${pkgname%-git}"
129 install -Dm755 -d "${pkgdir}/usr/lib/${pkgname%-git}"
130 local _app_dir=$(_get_app_dir)
131 cp -a "${_app_dir}/resources/"* "${pkgdir}/usr/lib/${pkgname%-git}/"
132 _icon_sizes=(192 512)
133 for _icons in "${_icon_sizes[@]}";do
134 install -Dm644 "${srcdir}/${pkgname//-/.}/public/logo${_icons}.png" \
135 "${pkgdir}/usr/share/icons/hicolor/${_icons}x${_icons}/apps/${pkgname%-git}.png"
136 done
137 install -Dm644 "${srcdir}/${pkgname//-/.}/${pkgname%-git}.desktop" -t "${pkgdir}/usr/share/applications"
138 install -Dm644 "${srcdir}/${pkgname//-/.}/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}"
139}
140

Changes since previous scan

--- PKGBUILD @ 2026-09-09 00:04
+++ PKGBUILD @ 2026-09-17 00:27
@@ -1,9 +1,9 @@
# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
pkgname=pupu-git
_pkgname=PuPu
-pkgver=0.1.8.r0.g327097b
+pkgver=0.1.10.r2.gb664b9f
_electronversion=40
-_nodeversion=20
+_nodeversion=22
pkgrel=1
pkgdesc="A simple and easy to use UI for the Ollama.(Use system-wide electron)"
arch=('any')
@@ -13,13 +13,19 @@
conflicts=("${pkgname%-git}")
depends=(
"electron${_electronversion}"
- 'ollama'
- 'python'
- 'python-numpy'
- 'python-flask'
- 'python-httpx'
- 'python-werkzeug'
- 'python-openai'
+ 'nodejs'
+ 'uv'
+ 'python-urllib3'
+ 'python-typing_extensions'
+ 'python-legacy-cgi'
+ 'python-packaging'
+ 'python-attrs'
+ 'python-filelock'
+ 'python-keyring'
+ 'python-pip'
+ 'python-cryptography'
+ 'libxcrypt-compat'
+ 'python-requests'
)
makedepends=(
'npm'
@@ -28,7 +34,6 @@
'curl'
'gendesk'
'jq'
- 'python312'
)
source=(
"${pkgname//-/.}::git+${url}.git"
@@ -97,7 +102,9 @@
sed -i "s/sys.version_info\[:2\] == (3, 12)/sys.version_info[0] == 3 and sys.version_info[1] >= 12/g" scripts/init_python312_venv.sh
find src -type f -exec sed -i "s/process.resourcesPath/\'\/usr\/lib\/${pkgname%-git}\'/g" {} +
sed -i "s/\"electron\": \"[^\"]*\"/\"electron\": \"${SYSTEM_ELECTRON_VERSION}\"/g" package.json
- NODE_ENV=development npm install
+ # Fix broken progress package (lib directory is empty)
+ sed -i 's/"overrides": {/"overrides": {\n "progress": "2.0.3",/' package.json
+ NODE_ENV=development npm install --legacy-peer-deps
}
build() {
cd "${srcdir}/${pkgname//-/.}"

Scan history

Scanned at (UTC)SeverityRules
2026-09-17 00:27:14 Low 2
2026-09-16 00:03:17 Low 2
2026-09-15 00:25:31 Low 2
2026-09-14 00:27:57 Low 2
2026-09-13 00:19:54 Low 2
2026-09-12 00:25:17 Low 2
2026-09-11 00:19:22 Low 2
2026-09-10 00:22:44 Low 2
2026-09-09 05:18:57 Medium 1
2026-09-09 00:04:09 Low 2
2026-09-08 00:18:08 Low 2
2026-09-07 00:30:15 Low 2
2026-09-06 00:17:06 Low 2
2026-09-05 00:16:27 Low 2
2026-09-04 00:03:13 Low 2
2026-09-03 00:15:47 Low 2
2026-09-02 00:02:31 Low 2
2026-09-01 00:11:19 Low 2
2026-08-31 00:19:57 Low 2
2026-08-30 00:04:14 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