#!/usr/bin/env bash # Scarica, ricompila, confronta. Un comando, nessuna decisione da prendere. # # verify-apk [versione] (default: 2.3.0) # # Alla fine dice una cosa sola: se l'APK pubblicato viene dal sorgente pubblicato, oppure # quali voci non combaciano. Non ci sono risposte intermedie. set -euo pipefail V="${1:-2.3.0}" BASE=https://lattice-network.it/downloads W=/tmp/verify-$V echo "════ Verifica riproducibile di Lattice Pulse $V ════" rm -rf "$W"; mkdir -p "$W"; cd "$W" echo "──> 1/5 scarico l'APK pubblicato, il sorgente e il manifest" curl -fsSL -O "$BASE/lattice-pulse-$V.apk" 2>/dev/null || curl -fsSL -o "lattice-pulse-$V.apk" "$BASE/lattice-pulse.apk" curl -fsSL -O "$BASE/lattice-pulse-src-$V.tgz" curl -fsSL -O "$BASE/repro-$V.json" echo "──> 2/5 controllo che l'APK scaricato sia quello dichiarato nel manifest" ATTESO="$(python3 -c "import json;print(json.load(open('repro-$V.json'))['apk_sha256'])")" OTTENUTO="$(sha256sum "lattice-pulse-$V.apk" | cut -d' ' -f1)" if [ "$ATTESO" != "$OTTENUTO" ]; then echo " ATTENZIONE: l'APK scaricato NON corrisponde al manifest." echo " atteso: $ATTESO" echo " ottenuto: $OTTENUTO" echo " Fermarsi qui: non ha senso ricompilare per confrontarsi con un file diverso." exit 1 fi echo " ok: $OTTENUTO" echo "──> 3/5 estraggo il sorgente e installo le dipendenze" tar xzf "lattice-pulse-src-$V.tgz" cd "lattice-pulse-$V" echo "sdk.dir=$ANDROID_HOME" > android/local.properties # La nostra chiave di firma non è nell'archivio, e non ci sarà. Se ne genera una qualsiasi: # la firma viene esclusa dal confronto, quindi non cambia il risultato. keytool -genkeypair -keystore android/app/debug.keystore -storepass android \ -keypass android -alias androiddebugkey -keyalg RSA -keysize 2048 \ -validity 10000 -dname "CN=Verificatore,O=Nessuno,C=IT" >/dev/null 2>&1 yarn install --frozen-lockfile --network-timeout 600000 >/dev/null echo "──> 4/5 ricompilo (nucleo Xray da sorgente + APK). Ci vuole un po'." bash tools/repro-build.sh /tmp/ricompilato.apk > /tmp/build.log 2>&1 || { echo " la compilazione è fallita. Ultime righe:"; tail -25 /tmp/build.log; exit 1; } echo "──> 5/5 confronto voce per voce" python3 tools/apkrepro.py check /tmp/ricompilato.apk "$W/repro-$V.json"