diff --git a/99-captive-portal b/99-captive-portal index 9e34f0b..2e22bbc 100755 --- a/99-captive-portal +++ b/99-captive-portal @@ -4,7 +4,7 @@ # NetworkManager Captive Portal Auto-Detector # ============================================================================= # Erstellt von Pascal Bouquet am 16.09.2025 -# Aktualisiert am 17.09.2025 +# Aktualisiert am 18.09.2025 # # Dieses Skript ist freie Software: Es kann frei verwendet, bearbeitet und # verbreitet werden. Es wird keine Garantie für die Funktionsfähigekeit übernommen. @@ -14,9 +14,9 @@ # KONFIGURATION # ============================================================================= LOG_FILE="/var/log/nm-captive.log" -LOG_LEVEL="INFO" # NONE, DEBUG, INFO, WARNING, ERROR +LOG_LEVEL="ERROR" # NONE, DEBUG, INFO, WARNING, ERROR CHECK_INTERVAL=300 # 5 Minuten in Sekunden -MAX_CHECKS=48 # Maximal 4 Stunde lang prüfen (48 * 5min) +MAX_CHECKS=12 # Maximal 1 Stunde lang prüfen (12 * 5min) # Test-URLs für Captive Portal Erkennung TEST_URLS=( @@ -58,6 +58,75 @@ log() { esac } +get_user_environment() { + local user=$1 + local user_id=$(id -u "$user") + + # Finde den Desktop-Prozess und übernehme dessen Environment + local pid=$(pgrep -u "$user" -n plasmashell || pgrep -u "$user" -n gnome-shell || pgrep -u "$user" -n kwin_wayland || echo "") + + if [ -n "$pid" ] && [ -f "/proc/$pid/environ" ]; then + log "DEBUG" "Using environment from process $pid" + # Extrahiere alle benötigten Environment-Variablen + tr '\0' '\n' < "/proc/$pid/environ" | grep -E "(WAYLAND|DISPLAY|XDG|DBUS|USER|HOME|PATH)" + else + # Fallback: Basis-Environment setzen + log "DEBUG" "Using fallback environment" + echo "USER=$user" + echo "HOME=/home/$user" + echo "XDG_RUNTIME_DIR=/run/user/$user_id" + echo "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$user_id/bus" + + # Versuche, den echten Display zu finden + if [ -S "/run/user/$user_id/wayland-0" ]; then + echo "WAYLAND_DISPLAY=wayland-0" + echo "XDG_SESSION_TYPE=wayland" + elif [ -S "/tmp/.X11-unix/X0" ]; then + echo "DISPLAY=:0" + else + echo "DISPLAY=:0" + fi + fi +} + +get_user_session() { + local user="" + local display="" + local session_type="" + + # Finde den aktuellen GUI-Benutzer + user=$(who | grep -E "(tty[0-9]|pts/)" | awk '{print $1}' | head -n1) + log "DEBUG" "who found user: $user" + + if [ -n "$user" ]; then + local user_id=$(id -u "$user") + + # Prüfe auf Wayland + if [ -S "/run/user/$user_id/wayland-0" ]; then + session_type="wayland" + display="wayland-0" + log "DEBUG" "Wayland socket detected" + elif [ -S "/tmp/.X11-unix/X0" ]; then + session_type="x11" + display=":0" + log "DEBUG" "X11 socket detected" + else + # Fallback basierend auf Prozessen + if pgrep -u "$user" kwin_wayland >/dev/null; then + session_type="wayland" + display="wayland-0" + log "DEBUG" "Wayland process detected" + else + session_type="x11" + display=":0" + log "DEBUG" "Assuming X11" + fi + fi + fi + + echo "$user $display $session_type" +} + check_captive_portal() { local captive_detected=false @@ -65,7 +134,6 @@ check_captive_portal() { log "DEBUG" "Testing URL: $url" if [[ "$url" == *"apple.com"* ]]; then - # Apple Check: Erwartet "Success" in der Response local response=$(curl -s -L --connect-timeout 5 "$url") if [ $? -ne 0 ]; then log "DEBUG" "Network error for $url" @@ -78,7 +146,6 @@ check_captive_portal() { fi elif [[ "$url" == *"google"* || "$url" == *"gstatic"* ]]; then - # Google Check: Erwartet HTTP 204 local http_code=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 "$url") if [ $? -ne 0 ]; then log "DEBUG" "Network error for $url" @@ -101,9 +168,45 @@ check_captive_portal() { fi } +start_firefox() { + local user=$1 + local display=$2 + local session_type=$3 + + log "INFO" "Attempting to start Firefox for user: $user, display: $display, type: $session_type" + + # Holle die komplette Environment des Users + local user_env=$(get_user_environment "$user") + log "DEBUG" "User environment: $user_env" + + # Baue den sudo-Befehl mit der kompletten Environment + local env_vars="" + while IFS= read -r line; do + if [ -n "$line" ]; then + env_vars="$env_vars $line" + fi + done <<< "$user_env" + + # Starte Firefox mit der kompletten Environment + log "DEBUG" "Starting Firefox with full user environment" + sudo -u "$user" $env_vars firefox --new-window "http://detectportal.firefox.com/canonical.html" & + + local pid=$! + sleep 1 + if ps -p $pid >/dev/null 2>&1; then + log "INFO" "Firefox successfully started with PID: $pid" + return 0 + else + log "ERROR" "Firefox process died immediately after start" + return 1 + fi +} + start_periodic_checks() { local interface="$1" local user="$2" + local display="$3" + local session_type="$4" local check_count=0 log "INFO" "Starting periodic checks for $interface (every ${CHECK_INTERVAL}s)" @@ -117,13 +220,11 @@ start_periodic_checks() { if ! check_captive_portal; then log "INFO" "Captive portal still active - re-opening browser" - export DISPLAY=:0 - export XAUTHORITY=/home/$user/.Xauthority - - # Starte Firefox mit Firefox's eigenem Portal Detect - sudo -u $user env DISPLAY=:0 XAUTHORITY=/home/$user/.Xauthority \ - firefox --new-window "http://detectportal.firefox.com/canonical.html" & - log "INFO" "Firefox re-started for user $user" + if start_firefox "$user" "$display" "$session_type"; then + log "INFO" "Firefox re-opened successfully" + else + log "ERROR" "Failed to re-open Firefox" + fi else log "INFO" "Captive portal resolved - stopping periodic checks" break @@ -145,23 +246,23 @@ if [[ "$1" == wl* ]] && [ "$2" = "up" ]; then if ! check_captive_portal; then log "INFO" "CAPTIVE PORTAL DETECTED! Opening browser..." - # Finde Benutzer - local_user=$(w -hs | grep ":0" | awk '{print $1}' | head -n1) - if [ -n "$local_user" ]; then - log "INFO" "Found user: $local_user" - - export DISPLAY=:0 - export XAUTHORITY=/home/$local_user/.Xauthority + read user display session_type <<< $(get_user_session) + + if [ -n "$user" ] && [ -n "$display" ]; then + log "INFO" "Found user: $user, display: $display, type: $session_type" # Starte Firefox - sudo -u $local_user env DISPLAY=:0 XAUTHORITY=/home/$local_user/.Xauthority \ - firefox --new-window "http://detectportal.firefox.com/canonical.html" & - log "INFO" "Firefox started for user $local_user" - - # Starte periodische Checks im Hintergrund - start_periodic_checks "$1" "$local_user" & + if start_firefox "$user" "$display" "$session_type"; then + log "INFO" "Firefox successfully launched" + + # STARTE PERIODISCHE CHECKS IM HINTERGRUND + log "INFO" "Starting periodic checks in background..." + start_periodic_checks "$1" "$user" "$display" "$session_type" & + else + log "ERROR" "Failed to start Firefox" + fi else - log "WARNING" "No local user found for GUI access" + log "WARNING" "No local user or display found for GUI access" fi else log "INFO" "No captive portal detected on connection start" @@ -173,4 +274,3 @@ elif [[ "$1" == wl* ]] && [ "$2" = "down" ]]; then fi log "INFO" "=== Completed ===" -