upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/scripts/package-windows-tor.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/package-windows-tor.sh')
-rwxr-xr-xscripts/package-windows-tor.sh187
1 files changed, 187 insertions, 0 deletions
diff --git a/scripts/package-windows-tor.sh b/scripts/package-windows-tor.sh
new file mode 100755
index 0000000..c8cca3b
--- /dev/null
+++ b/scripts/package-windows-tor.sh
@@ -0,0 +1,187 @@
1#!/usr/bin/env bash
2set -euo pipefail
3
4ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5VERSION="${VERSION:-$(sed -n 's/^VERSION[[:space:]]*:= *//p' "$ROOT/Makefile" | head -1)}"
6
7TOR_VERSION="${TOR_VERSION:-15.0.19}"
8TOR_ARCHIVE_NAME="tor-expert-bundle-windows-x86_64-${TOR_VERSION}.tar.gz"
9TOR_URL="${TOR_URL:-https://archive.torproject.org/tor-package-archive/torbrowser/${TOR_VERSION}/${TOR_ARCHIVE_NAME}}"
10TOR_SHA256="${TOR_SHA256:-6AC067402C7B4A3DC37887ED3754B3914B67FDC220C966190683E9CCF91ABF0F}"
11TOR_ASC_URL="${TOR_ASC_URL:-${TOR_URL}.asc}"
12TOR_SIGNING_KEY_FINGERPRINT="${TOR_SIGNING_KEY_FINGERPRINT:-EF6E286DDA85EA2A4BA7DE684E2C6E8793298290}"
13TOR_VERIFY_GPG="${TOR_VERIFY_GPG:-auto}"
14
15BUNDLE_DIR="${BUNDLE_DIR:-$ROOT/Bitflash-${VERSION}-windows}"
16OUT_ZIP="${OUT_ZIP:-$ROOT/Bitflash-${VERSION}-windows-with-tor.zip}"
17CACHE_DIR="${CACHE_DIR:-$ROOT/.cache}"
18ARCHIVE="${TOR_ARCHIVE:-$CACHE_DIR/$TOR_ARCHIVE_NAME}"
19ASC_FILE="${TOR_ASC:-$ARCHIVE.asc}"
20
21usage() {
22 cat <<EOF
23Usage: scripts/package-windows-tor.sh
24
25Creates Bitflash-${VERSION}-windows-with-tor.zip from an existing
26Bitflash-${VERSION}-windows/ release directory.
27
28Environment overrides:
29 VERSION Bitflash release version, default read from Makefile
30 TOR_VERSION Tor Expert Bundle version, default ${TOR_VERSION}
31 TOR_URL Download URL, default official Tor archive URL
32 TOR_ASC_URL Signature URL, default TOR_URL.asc
33 TOR_SHA256 Expected archive SHA256
34 TOR_ARCHIVE Use an existing archive instead of downloading
35 TOR_ASC Use an existing detached signature
36 TOR_VERIFY_GPG auto, required, or off; default auto
37 BUNDLE_DIR Existing unpacked Windows release directory
38 OUT_ZIP Output zip path
39EOF
40}
41
42if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then
43 usage
44 exit 0
45fi
46
47need() {
48 command -v "$1" >/dev/null 2>&1 || {
49 echo "missing required command: $1" >&2
50 exit 1
51 }
52}
53
54need sha256sum
55need tar
56need zip
57
58download() {
59 local url="$1"
60 local out="$2"
61 if command -v curl >/dev/null 2>&1; then
62 curl -L --fail --output "$out" "$url"
63 elif command -v wget >/dev/null 2>&1; then
64 wget -O "$out" "$url"
65 else
66 echo "missing required command: curl or wget" >&2
67 exit 1
68 fi
69}
70
71if [ ! -d "$BUNDLE_DIR" ]; then
72 echo "missing Windows release directory: $BUNDLE_DIR" >&2
73 echo "run 'make windows' first, or set BUNDLE_DIR" >&2
74 exit 1
75fi
76if [ ! -f "$BUNDLE_DIR/Bitflash.exe" ]; then
77 echo "missing Bitflash.exe in $BUNDLE_DIR" >&2
78 exit 1
79fi
80BUNDLE_PARENT="$(cd "$(dirname "$BUNDLE_DIR")" && pwd)"
81BUNDLE_NAME="$(basename "$BUNDLE_DIR")"
82OUT_PARENT="$(mkdir -p "$(dirname "$OUT_ZIP")" && cd "$(dirname "$OUT_ZIP")" && pwd)"
83OUT_NAME="$(basename "$OUT_ZIP")"
84OUT_ZIP_ABS="$OUT_PARENT/$OUT_NAME"
85
86mkdir -p "$CACHE_DIR"
87if [ ! -f "$ARCHIVE" ]; then
88 download "$TOR_URL" "$ARCHIVE"
89fi
90
91got="$(sha256sum "$ARCHIVE" | awk '{print tolower($1)}')"
92want="$(printf '%s' "$TOR_SHA256" | tr 'A-F' 'a-f')"
93if [ "$got" != "$want" ]; then
94 echo "Tor archive SHA256 mismatch" >&2
95 echo " expected: $want" >&2
96 echo " got: $got" >&2
97 exit 1
98fi
99
100tmp="$(mktemp -d "${TMPDIR:-/tmp}/bitflash-tor-package.XXXXXX")"
101trap 'rm -rf "$tmp"' EXIT
102
103case "$TOR_VERIFY_GPG" in
104 auto|required|off) ;;
105 *) echo "TOR_VERIFY_GPG must be auto, required, or off" >&2; exit 2 ;;
106esac
107
108if [ "$TOR_VERIFY_GPG" != "off" ]; then
109 if command -v gpg >/dev/null 2>&1; then
110 if [ ! -f "$ASC_FILE" ]; then
111 download "$TOR_ASC_URL" "$ASC_FILE"
112 fi
113 gnupg_home="$tmp/gnupg"
114 mkdir -p "$gnupg_home"
115 chmod 0700 "$gnupg_home"
116 gpg --homedir "$gnupg_home" --batch --auto-key-locate nodefault,wkd,keyserver \
117 --locate-keys torbrowser@torproject.org >/dev/null 2>&1 || {
118 if [ "$TOR_VERIFY_GPG" = "required" ]; then
119 echo "could not import Tor Browser Developers signing key" >&2
120 exit 1
121 fi
122 echo "WARNING: skipped Tor GPG signature verification; signing key import failed" >&2
123 }
124 if gpg --homedir "$gnupg_home" --batch --with-colons --fingerprint "$TOR_SIGNING_KEY_FINGERPRINT" \
125 2>/dev/null | grep -q "^fpr:::::::::${TOR_SIGNING_KEY_FINGERPRINT}:"; then
126 gpg --homedir "$gnupg_home" --batch --verify "$ASC_FILE" "$ARCHIVE" >/dev/null 2>&1 || {
127 echo "Tor archive GPG signature verification failed" >&2
128 exit 1
129 }
130 echo "Tor archive GPG signature verified against ${TOR_SIGNING_KEY_FINGERPRINT}"
131 elif [ "$TOR_VERIFY_GPG" = "required" ]; then
132 echo "Tor signing key fingerprint mismatch" >&2
133 exit 1
134 else
135 echo "WARNING: skipped Tor GPG signature verification; signing key fingerprint was not available" >&2
136 fi
137 elif [ "$TOR_VERIFY_GPG" = "required" ]; then
138 echo "missing required command for TOR_VERIFY_GPG=required: gpg" >&2
139 exit 1
140 else
141 echo "WARNING: gpg not found; relying on pinned SHA256 only" >&2
142 fi
143fi
144
145mkdir -p "$tmp/extract"
146tar -xzf "$ARCHIVE" -C "$tmp/extract"
147
148if [ ! -f "$tmp/extract/tor/tor.exe" ]; then
149 echo "Tor archive did not contain tor/tor.exe" >&2
150 exit 1
151fi
152
153rm -rf "$BUNDLE_DIR/tor"
154mkdir -p "$BUNDLE_DIR/tor"
155cp -R "$tmp/extract/tor/." "$BUNDLE_DIR/tor/"
156if [ -d "$tmp/extract/docs" ]; then
157 mkdir -p "$BUNDLE_DIR/tor/docs"
158 cp -R "$tmp/extract/docs/." "$BUNDLE_DIR/tor/docs/"
159fi
160if [ -d "$tmp/extract/data" ]; then
161 mkdir -p "$BUNDLE_DIR/tor/data-defaults"
162 cp -R "$tmp/extract/data/." "$BUNDLE_DIR/tor/data-defaults/"
163fi
164
165cat > "$BUNDLE_DIR/TOR-EXPERT-BUNDLE.txt" <<EOF
166Bitflash managed Tor bundle
167
168This Windows package includes the Tor Expert Bundle so -managedtor can start
169Tor without requiring a separate Tor install.
170
171Tor Expert Bundle: ${TOR_VERSION}
172Archive URL: ${TOR_URL}
173Archive SHA256: ${TOR_SHA256}
174
175Bitflash uses tor/tor.exe from this package. Runtime state, hidden-service keys,
176and control authentication cookies are written under the user's Bitflash data
177directory, not inside this release directory.
178EOF
179
180rm -f "$OUT_ZIP_ABS"
181(
182 cd "$BUNDLE_PARENT"
183 zip -qr "$OUT_ZIP_ABS" "$BUNDLE_NAME"
184)
185
186echo "Bundled Tor Expert Bundle ${TOR_VERSION}"
187echo "Built: $OUT_ZIP_ABS"