NoSignal-OS/os updates/wifi-password-retry/patch-network-connection.sh
28allday 19fd794b6b NoSignal — fully-offline Arch → Hyprland desktop installer
Single-script builder (nosignal.sh) that turns a stock Arch Linux ISO into a
fully-offline installer for a themed Hyprland + caelestia (Quickshell) desktop:
matching SDDM greeter, Btrfs/Limine bootable snapshots, chwd-style GPU
detection, and a curated "os updates" layer (keybind cheatsheet, settings
panels, system polish, on-box management skill). See README.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 11:03:10 +01:00

42 lines
3.1 KiB
Bash
Executable file

#!/bin/sh
# patch-network-connection.sh — fix the Wi-Fi saved-profile password trap.
# Runs as root (via sudo from the installer, or via the pacman hook after
# every caelestia-shell upgrade, which reverts NetworkConnection.qml).
# Idempotent.
#
# Symptom: enter a wrong Wi-Fi password once and the shell saves the NM
# profile with the bad PSK; every later click on that network silently
# reuses it and the password dialog never reopens.
#
# Cause: in utils/NetworkConnection.qml connectToNetwork(), the
# hasSavedProfile branch calls Nmcli.connectToNetwork(..., null) — a null
# callback and no password-dialog path, so an auth failure is swallowed.
#
# Fix: pass a real callback; when the activation comes back needsPassword,
# forget the (bad) saved profile and reopen the password dialog — same
# cleanup + dialog logic the no-saved-profile branch already uses.
#
# TARGET is overridable for testing the regex against a copy.
set -eu
TARGET=${TARGET:-/etc/xdg/quickshell/caelestia/utils/NetworkConnection.qml}
[ -f "$TARGET" ] || { echo "caelestia-shell not found at $TARGET — nothing to patch"; exit 0; }
if grep -q 'nosignal wifi-password-retry' "$TARGET"; then
echo ":: NetworkConnection.qml already patched"
exit 0
fi
cp -n "$TARGET" "$TARGET.pre-nosignal"
perl -0pi -e 's/if \(hasSavedProfile\) \{\s*\n\s*Nmcli\.connectToNetwork\(network\.ssid, "", network\.bssid, null\);\s*\n(\s*)\} else \{/if (hasSavedProfile) {\n \/\/ >>> nosignal wifi-password-retry >>>\n \/\/ A saved profile can hold a wrong password. Stock code passed\n \/\/ a null callback here, so a failed activation never re-prompted.\n \/\/ On auth failure: forget the bad profile and reopen the dialog.\n Nmcli.connectToNetwork(network.ssid, "", network.bssid, result => {\n if (result \&\& result.needsPassword) {\n if (Nmcli.pendingConnection) {\n Nmcli.connectionCheckTimer.stop();\n Nmcli.immediateCheckTimer.stop();\n Nmcli.immediateCheckTimer.checkCount = 0;\n Nmcli.pendingConnection = null;\n }\n Nmcli.forgetNetwork(network.ssid);\n if (session \&\& session.network) {\n session.network.showPasswordDialog = true;\n session.network.pendingNetwork = network;\n } else if (onPasswordNeeded) {\n onPasswordNeeded(network);\n }\n }\n });\n \/\/ <<< nosignal wifi-password-retry <<<\n$1} else {/' "$TARGET"
if grep -q 'nosignal wifi-password-retry' "$TARGET"; then
echo ":: patched $TARGET (Wi-Fi wrong-password recovery)"
else
echo "WARNING: patch did not apply — upstream NetworkConnection.qml changed shape." >&2
echo " Stock behaviour kept (wrong saved password still cannot be changed" >&2
echo " from the UI); update the regex in $(basename "$0") for the new" >&2
echo " caelestia-shell version." >&2
fi