diff --git a/image-recipe/_archived/build-auto-installer-iso.sh b/image-recipe/_archived/build-auto-installer-iso.sh index 83b03941..c03c62a4 100755 --- a/image-recipe/_archived/build-auto-installer-iso.sh +++ b/image-recipe/_archived/build-auto-installer-iso.sh @@ -573,7 +573,7 @@ RUN mkdir -p /etc/polkit-1/rules.d && \ # already-deployed nodes over OTA (idempotent no-op here once applied). RUN set -eu; \ apt-get update; \ - apt-get install -y --no-install-recommends kdump-tools kexec-tools rasdaemon; \ + apt-get install -y --no-install-recommends kdump-tools kexec-tools makedumpfile rasdaemon; \ apt-get clean; rm -rf /var/lib/apt/lists/*; \ CONF=/etc/default/kdump-tools; \ sed -i 's|^#\?USE_KDUMP=.*|USE_KDUMP="1"|' "$CONF"; \ diff --git a/neode-ui/src/views/settings/AccountInfoSection.vue b/neode-ui/src/views/settings/AccountInfoSection.vue index e27637ed..12430aee 100644 --- a/neode-ui/src/views/settings/AccountInfoSection.vue +++ b/neode-ui/src/views/settings/AccountInfoSection.vue @@ -459,100 +459,6 @@ init()

The Receive window now tells you when the money is on its way. Previously it showed a QR code and left you to check elsewhere whether anything happened. Now, the moment the sender's transaction is broadcast, the QR gives way to a clock: the amount, the transaction ID (tap to copy), and a note that the funds arrive on their own — with a single Done button. If you keep the window open, the clock becomes a green check at the first confirmation. Verified live on a real node: payment detected within seconds of broadcast.

- -
-
- v1.2.0-alpha.9 - Mar 18, 2026 -
-
-
-

Security Hardening Complete

-

All 12 pentest findings fixed. CSRF tokens now survive restarts. Password hashing upgraded to Argon2id. Bitcoin RPC gets a unique random password on every install. Federation messages require ed25519 signatures.

-
-
-

7 Bugs Squashed

-

Random logouts fixed (P0). Uninstall dialog is now a proper full-screen modal with an "Uninstalling..." overlay. App cards no longer flicker between Start/Launch during container scans. ElectrumX index estimate corrected.

-
-
-

Bitcoin Sync on Dashboard

-

Homepage System card now shows Bitcoin Core sync progress, block height, and green/orange status indicator when Bitcoin is running.

-
-
-
- -
-
- v1.2.0-alpha.8 - Mar 18, 2026 -
-
-
-

Pentest Remediation (9/12)

-

Fixed 9 of 12 security findings: session auth on LND connect info, DEV_MODE removed from production, ed25519 signature verification on node messages, path traversal protection, NIP-07 origin validation, AIUI session checks, strict onion validation.

-
-
-

UI Polish Batch

-

Fedimint renamed to "Fedimint Guardian". Tab-launch icons. Marketplace sorts installed apps to end. Mesh mobile layout fixed. On-Chain first in receive modals. Federation shows names instead of DIDs. Cleaner iframe error screens.

-
-
-
- -
-
- v1.2.0-alpha.7 - Mar 18, 2026 -
-
-
-

Marketplace & Credentials

-

29 containers running rootless. Marketplace app aliases working. Credential injection for inter-container authentication.

-
-
-
- -
-
- v1.2.0-alpha.4-6 - Mar 18, 2026 -
-
-
-

Rootless Podman Migration

-

Migrated all containers from root to rootless Podman. UID namespace mapping, volume ownership fixes, sysctl tuning. Bitcoin RPC verified, all web services confirmed healthy. 29 containers up and running.

-
-
-
- -
-
- v1.2.0-alpha.2-3 - Mar 18, 2026 -
-
-
-

Systemd Hardening Restored

-

Full systemd security sandbox restored now that containers run rootless. NoNewPrivileges, restricted namespaces, and system call filtering re-enabled. Session persistence and boot sequence fixes.

-
-
-
- -
-
- v1.2.0-alpha.1 - Mar 18, 2026 -
-
-
-

Mesh Radio & Container Stability

-

LoRa mesh radio auto-detects USB port changes with a new Connect button. Fixed container crash loops — all apps start cleanly and stay stable. Apps starting up show progress instead of re-appearing in the store. Tor routing enabled by default for Bitcoin and Lightning.

-
-
-

Off-Grid Bitcoin

-

Receive Bitcoin block headers over mesh radio. Dead man's switch broadcasts location to trusted contacts if you go silent. GPS sharing is opt-in only.

-
-
-
diff --git a/scripts/iso-smoke-test.sh b/scripts/iso-smoke-test.sh index 17730b0e..86727bbe 100755 --- a/scripts/iso-smoke-test.sh +++ b/scripts/iso-smoke-test.sh @@ -165,16 +165,35 @@ else sudo rm -rf "$TMPBIN" fi -# ── Frontend payload present ───────────────────────────────────────── -if [ -f "$MNT/archipelago/web-ui/index.html" ]; then +# ── Frontend + companion payload ───────────────────────────────────── +WEB_UI="$MNT/archipelago/web-ui" +if [ -f "$WEB_UI/index.html" ]; then ok "frontend payload (archipelago/web-ui/index.html)" - if [ -f "$MNT/archipelago/web-ui/aiui/index.html" ]; then + if [ -f "$WEB_UI/aiui/index.html" ]; then ok "AIUI included in frontend payload" else - warn "AIUI missing from archipelago/web-ui (verify rootfs copy before shipping)" + bad "AIUI missing from archipelago/web-ui" + fi + + COMPANION_META="$WEB_UI/packages/archipelago-companion.json" + COMPANION_APK="$WEB_UI/packages/archipelago-companion.apk" + if [ -s "$COMPANION_APK" ] && [ "$(jq -r '.versionName // empty' "$COMPANION_META" 2>/dev/null)" = "0.5.28" ] \ + && [ "$(jq -r '.versionCode // empty' "$COMPANION_META" 2>/dev/null)" = "48" ]; then + ok "Companion 0.5.28 (versionCode 48) APK included" + else + bad "Companion 0.5.28 APK/metadata missing or stale" + fi + + SETTINGS_BUNDLE="$(grep -rlF "v$EXPECTED_VERSION" "$WEB_UI/assets" 2>/dev/null | head -1)" + if [ -n "$SETTINGS_BUNDLE" ] \ + && grep -qF 'v1.8.0-alpha' "$SETTINGS_BUNDLE" \ + && ! grep -qE 'v1\.[0-7]\.|v1\.2\.0-alpha' "$SETTINGS_BUNDLE"; then + ok "What's New is v1.8.6-first with a v1.8.0 history floor" + else + bad "What's New payload is missing v1.8 history or still contains pre-v1.8 entries" fi else - warn "no archipelago/web-ui payload on ISO (frontend may live in rootfs.tar only)" + bad "no archipelago/web-ui payload on ISO" fi echo diff --git a/scripts/sync-whats-new.py b/scripts/sync-whats-new.py index 45a1da14..fd2ec04e 100755 --- a/scripts/sync-whats-new.py +++ b/scripts/sync-whats-new.py @@ -73,10 +73,15 @@ def undated_versions(): def ordered_versions(): - """Return modal versions in display order (top to bottom).""" + """Return generated modal versions in display order (top to bottom).""" return re.findall(r"", MODAL.read_text()) +def legacy_blocks(): + """Return old hand-written alpha blocks that predate generated markers.""" + return re.findall(r"", MODAL.read_text()) + + def version_key(version): match = re.match(r"v(\d+)\.(\d+)\.(\d+)", version) return tuple(map(int, match.groups())) @@ -85,7 +90,10 @@ def version_key(version): def sort_modal_blocks(entries): """Re-render current release-note blocks newest-first and remove old history.""" lines = MODAL.read_text().splitlines(keepends=True) - marker = re.compile(r"^\s*\s*$") + # Include the old hand-written `alpha.*` blocks in the replace range so + # normalization can delete them. Previously the checker saw only generated + # vX.Y.Z markers and falsely claimed the v1.8.0 history floor was enforced. + marker = re.compile(r"^\s*\s*$") blocks = [] for start, line in enumerate(lines): @@ -115,7 +123,10 @@ def sort_modal_blocks(entries): raise RuntimeError("unexpected content between What's New release blocks") by_version = {entry["ver"]: entry for entry in entries} - retained = [b for b in blocks if version_key(b[2]) >= MIN_VISIBLE_VERSION] + retained = [ + b for b in blocks + if b[2].startswith("v") and version_key(b[2]) >= MIN_VISIBLE_VERSION + ] sorted_segments = [ render_block(by_version[b[2]]).splitlines(keepends=True) if b[2] in by_version else b[3] @@ -181,6 +192,7 @@ def main(): expected_order = sorted(displayed, key=version_key, reverse=True) out_of_order = displayed != expected_order too_old = [v for v in displayed if version_key(v) < MIN_VISIBLE_VERSION] + too_old.extend(legacy_blocks()) if not missing and not out_of_order and not too_old: changed = False if check else sort_modal_blocks(entries)