Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/workflows/linux-appimage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,16 @@ jobs:
python -m pip install --upgrade pip
pip install -r requirements.txt pyinstaller

# Le .qm versionné peut être en retard sur le .ts : on le recompile ici, sinon l'AppImage afficherait en
# français les textes ajoutés depuis. Pas de repli silencieux : sans lrelease, le build échoue.
- name: Compile translations (.ts to .qm)
run: |
pip install pyside6-essentials --quiet
LRELEASE="$(find "$(python -c 'import PySide6, os; print(os.path.dirname(PySide6.__file__))')" -name lrelease -type f | head -n1)"
test -n "$LRELEASE" || { echo "lrelease introuvable dans pyside6-essentials" >&2; exit 1; }
for ts in translations/*.ts; do "$LRELEASE" "$ts" -qm "${ts%.ts}.qm"; done
ls -la translations/*.qm

- name: Download appimagetool (pinned and verified)
run: |
curl -fsSL -o appimagetool \
Expand Down Expand Up @@ -126,6 +136,28 @@ jobs:
# 124 = toujours en cours d'exécution au bout de 15 s = démarrage réussi
test "$rc" = 124

# Le script embarqué, tel que la mise à jour intégrée le lance : installation utilisateur dans un HOME vide,
# avec la somme imposée ; une mauvaise somme doit être refusée.
- name: Bundled install script (user install, checksum enforced)
run: |
H="$(mktemp -d)"
IMG="$PWD/build/appimage/PDF-Equilibrist-x86_64.AppImage"
( cd "$H" && APPIMAGE_EXTRACT_AND_RUN=1 "$IMG" --appimage-extract >/dev/null )
SCRIPT="$H/squashfs-root/usr/share/pdf-equilibrist/install.sh"
test -x "$SCRIPT"
SUM="$(sha256sum "$IMG" | cut -d' ' -f1)"
if env -i HOME="$H" PATH=/usr/bin:/bin bash "$SCRIPT" --file "$IMG" --sha256 "$(printf '%064d' 0)"; then
echo "une mauvaise somme aurait dû être refusée" >&2; exit 1
fi
env -i HOME="$H" PATH=/usr/bin:/bin APPIMAGE_EXTRACT_AND_RUN=1 bash "$SCRIPT" --file "$IMG" --sha256 "$SUM"
test -x "$H/.local/share/pdf-equilibrist/PDF-Equilibrist.AppImage"
test -L "$H/.local/bin/pdf-equilibrist"
test -f "$H/.local/share/applications/pdf-equilibrist.desktop"
test -f "$H/.local/share/icons/hicolor/256x256/apps/pdf-equilibrist.png"
desktop-file-validate "$H/.local/share/applications/pdf-equilibrist.desktop"
env -i HOME="$H" PATH=/usr/bin:/bin bash "$SCRIPT" --uninstall
test ! -e "$H/.local/share/pdf-equilibrist"

- name: Summary
run: |
{
Expand Down
7 changes: 6 additions & 1 deletion docs/5.BUILD.md
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,12 @@ cinq distributions, puis la joint à la release GitHub avec son `.sha256` et `in
(`packaging/appimage/install.sh` : installation sans root dans `~/.local` ou `--system` dans `/usr/local`,
désinstallation avec `--uninstall`). Pour joindre l'AppImage à une release existante : lancer le workflow à la
main avec le champ `tag`. Dans l'application, *Aide › À propos* détecte l'AppImage (variable `APPIMAGE`),
télécharge la nouvelle version à côté de l'actuelle (SHA-256 vérifié) et propose le lien vers `install.sh`.
télécharge la nouvelle version (SHA-256 vérifié) puis propose de l'installer avec le `install.sh` embarqué dans
l'AppImage : pour l'utilisateur seul (sans mot de passe) ou pour tous les utilisateurs (autorisation demandée par
le système via `pkexec` ; l'application ne voit jamais le mot de passe, et la somme SHA-256 est revérifiée en root
sur une copie avant l'installation). Sans `pkexec` (WSL, bureau minimal, serveur), l'application demande le mot de passe dans sa propre fenêtre et le
transmet uniquement à `sudo -S` (jamais en argument, jamais enregistré). Elle propose ensuite de relancer la
nouvelle version.

> **Flatpak : temporairement suspendu.** Aucun développement, packaging ni test Flatpak n'est prévu
> pour l'instant, et l'OCR n'y est pas inclus. Les fichiers existants (`packaging/flatpak/`) sont
Expand Down
6 changes: 5 additions & 1 deletion docs/en/5.BUILD.md
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,11 @@ five distributions, then attaches it to the GitHub release together with its `.s
(`packaging/appimage/install.sh`: rootless install into `~/.local`, or `--system` into `/usr/local`,
removal with `--uninstall`). To attach the AppImage to an existing release, run the workflow by hand
with the `tag` field. In the application, *Help › About* detects the AppImage (`APPIMAGE` variable),
downloads the new version next to the current one (SHA-256 checked) and offers the link to `install.sh`.
downloads the new version (SHA-256 checked) and offers to install it with the `install.sh` bundled in the
AppImage: for the current user only (no password) or for all users (authorisation requested by the system through
`pkexec`; the application never sees the password, and the SHA-256 is checked again as root on a copy before
installing). Without `pkexec` (WSL, minimal desktop, server), the application asks for the password in its own window and
passes it only to `sudo -S` (never as an argument, never stored). It then offers to restart the new version.

> **Flatpak: temporarily suspended.** No Flatpak development, packaging or testing is planned for now,
> and OCR is not included there. The existing files (`packaging/flatpak/`) are kept for a later
Expand Down
7 changes: 5 additions & 2 deletions packaging/appimage/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,11 @@ Avec `APPIMAGETOOL=/chemin/appimagetool`, le script produit aussi
- **glibc** : construire sur le système le plus ancien à couvrir (CI : Ubuntu 22.04 = glibc 2.35).
- **Impression (CUPS), polices d'emoji, Wayland** : dépendent du système hôte, non testés en vrai.
- **Mises à jour** : `update.py` détecte l'AppImage via `APPIMAGE`, cherche l'asset `*x86_64.AppImage` de la
dernière release et le télécharge à côté de l'actuelle sous un nom versionné (SHA-256 vérifié si GitHub le
fournit). L'utilisateur la relance lui-même. Pas de zsync (delta) pour l'instant.
dernière release et la télécharge (SHA-256 vérifié si GitHub le fournit), puis propose de l'installer avec le
`install.sh` embarqué (`usr/share/pdf-equilibrist/install.sh`) : pour l'utilisateur seul, ou pour tous via
`pkexec` (script passé en texte, somme revérifiée en root sur une copie, icône existante conservée), puis de
relancer. Sans `pkexec`, repli sur `sudo -S` avec une demande de mot de passe dans l'application (mot de passe
sur l'entrée de sudo, jamais en argument). Pas de zsync (delta) pour l'instant.
- **Version** : le workflow injecte la version du tag dans `__version__`, comme `release.yml`.
- **Publication** : un tag `v*` construit l'AppImage puis la joint à la release (`gh release upload`, après avoir
attendu que `release.yml` l'ait créée). Rattrapage d'une release existante : Actions › « Linux AppImage » ›
Expand Down
5 changes: 5 additions & 0 deletions packaging/appimage/build_appimage.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ install -m644 "$ROOT/packaging/ppa/debian/pdf-equilibrist-256.png" \
"$APPDIR/usr/share/icons/hicolor/256x256/apps/pdf-equilibrist.png"
ln -sf pdf-equilibrist.png "$APPDIR/.DirIcon"

# Script d'installation embarqué : la mise à jour intégrée le lance depuis l'AppImage en cours d'exécution
# (rien à télécharger ; l'icône est prise dans usr/share/icons, donc sans exécuter de fichier téléchargé).
mkdir -p "$APPDIR/usr/share/pdf-equilibrist"
install -m755 "$HERE/install.sh" "$APPDIR/usr/share/pdf-equilibrist/install.sh"

# AppStream metainfo (AppImageHub, logiciels de gestion d'applications) : version et date injectées
APP_VERSION="$("$PYTHON" -c 'import re,sys; print(re.search(r"__version__ = \"(.*?)\"", open(sys.argv[1], encoding="utf-8").read()).group(1))' "$ROOT/src/pdf_equilibrist/__init__.py")"
mkdir -p "$APPDIR/usr/share/metainfo"
Expand Down
33 changes: 29 additions & 4 deletions packaging/appimage/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,23 @@
# sudo install.sh --system pour tous les utilisateurs → /usr/local
# install.sh --uninstall retire l'installation (ajouter --system si faite avec sudo)
# install.sh --file CHEMIN utilise cette AppImage au lieu de la télécharger
# install.sh --sha256 HEX avec --file : refuse l'installation si la somme SHA-256 ne correspond pas
#
# Sans --file : prend l'AppImage posée à côté du script, sinon télécharge la dernière release GitHub
# (api.github.com / github.com uniquement) et vérifie sa somme SHA-256 avant d'installer.
set -euo pipefail

REPO="Bit-Scripts/PDF-Equilibrist"
ASSET="PDF-Equilibrist-x86_64.AppImage"
MODE=user ; ACTION=install ; FILE=""
MODE=user ; ACTION=install ; FILE="" ; SHA256=""

while [ $# -gt 0 ]; do
case "$1" in
--system) MODE=system ;;
--user) MODE=user ;;
--uninstall) ACTION=uninstall ;;
--file) FILE="${2:?--file demande un chemin}" ; shift ;;
--sha256) SHA256="${2:?--sha256 demande une somme}" ; shift ;;
-h|--help) sed -n '2,11p' "$0" | sed 's/^# \{0,1\}//' ; exit 0 ;;
*) echo "Option inconnue : $1 (voir --help)" >&2 ; exit 2 ;;
esac
Expand Down Expand Up @@ -83,13 +85,36 @@ if [ -z "$FILE" ]; then
fi
[ -f "$FILE" ] || { echo "Fichier introuvable : $FILE" >&2 ; exit 1; }

# Somme imposée (mise à jour intégrée) : en root, on copie d'abord le fichier dans un dossier réservé à root
# puis on vérifie la COPIE, pour qu'un fichier remplacé entre-temps par un autre processus ne soit jamais installé.
if [ -n "$SHA256" ]; then
if [ "$(id -u)" -eq 0 ]; then
cp -L -- "$FILE" "$WORK/checked.AppImage"
FILE="$WORK/checked.AppImage"
fi
actual="$(sha256sum -- "$FILE" | cut -d' ' -f1)"
[ "$actual" = "$SHA256" ] || { echo "Somme SHA-256 incorrecte : installation refusée." >&2 ; exit 1; }
echo "SHA-256 vérifiée."
fi

mkdir -p "$APPDIR" "$PREFIX/bin" "$(dirname "$DESKTOP")" "$(dirname "$ICON")"
install -m755 "$FILE" "$TARGET"
ln -sf "$TARGET" "$BIN"

# Icône : extraite de l'AppImage elle-même (--appimage-extract ne demande pas FUSE)
( cd "$WORK" && "$TARGET" --appimage-extract pdf-equilibrist.png >/dev/null 2>&1 \
&& install -m644 squashfs-root/pdf-equilibrist.png "$ICON" ) || echo "Icône non extraite (le lanceur utilisera l'icône par défaut)."
# Icône. Quand le script est embarqué dans l'AppImage, l'icône est à côté de lui : rien n'est exécuté.
# Sinon elle est extraite de l'AppImage (--appimage-extract, sans FUSE) — mais jamais en root :
# on n'exécute pas avec des droits élevés un fichier qui vient d'être téléchargé.
SELF="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUNDLED_ICON="$SELF/../icons/hicolor/256x256/apps/pdf-equilibrist.png"
if [ -f "$BUNDLED_ICON" ] && [ "$(id -u)" -ne 0 ]; then
install -m644 "$BUNDLED_ICON" "$ICON"
elif [ "$(id -u)" -eq 0 ]; then
# root : on ne lit ni n'exécute rien qui vienne d'un utilisateur ; une icône déjà installée est conservée
[ -f "$ICON" ] || echo "Icône non installée (installation système : icône par défaut)."
else
( cd "$WORK" && "$TARGET" --appimage-extract pdf-equilibrist.png >/dev/null 2>&1 \
&& install -m644 squashfs-root/pdf-equilibrist.png "$ICON" ) || echo "Icône non installée (icône par défaut)."
fi

cat > "$DESKTOP" <<DESK
[Desktop Entry]
Expand Down
Loading
Loading