###
 # @Author: 武丹 wudan@kylinos.cn
 # @Date: 2023-03-22 18:33:09
 # @LastEditors: 武丹 wudan@kylinos.cn
 # @LastEditTime: 2023-03-22 18:35:48
 # @FilePath: /network-manager/debian/90-open_captive_portal
 # @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
### 
#!/bin/sh -e
# Script to dispatch NetworkManager events
#
# Runs shows a login webpage on walled garden networks.
# See NetworkManager(8) for further documentation of the dispatcher events.

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
URL="www.kylinos.cn/"

if [ -x "/usr/bin/logger" ]; then
    logger="/usr/bin/logger -s -t captive-portal"
else
    logger=":"
fi

wait_for_process() {
    PNAME=$1
    while [ -z "$(/usr/bin/pgrep $PNAME)" ]; do
        sleep 3;
    done
}

#launch the browser, but on boot we need to wait that nm-applet starts
start_browser() {
    local user="$1"
    local display="$2"

    export DISPLAY="$display"
    export GTK_IM_MODULE=fcitx
   # wait_for_process nm-applet
   wait_for_process kylin-nm

    export XAUTHORITY="/home/$user/.Xauthority"

    $logger "Running browser as '$user' with display '$display' to login in captive portal"
    sudo -u "$user" --preserve-env=DISPLAY,XAUTHORITY -H xdg-open https://www.kylinos.cn/ 2>&1 > /dev/null
}

# Run the right scripts
case "$2" in
    connectivity-change)
    $logger -p user.debug "dispatcher script triggered on connectivity change: $CONNECTIVITY_STATE"
    if [ "$CONNECTIVITY_STATE" = "PORTAL" ] ; then
        echo "访问URL并获取HTTP状态码"
        response=$(curl -s -o /dev/null -w "%{http_code}" $URL)
        if [ $response -eq 200 ]; then
            echo "该网址可以被正常访问"
        elif [ $response -eq 302 ] || [ $response -eq 307 ] ; then
        # 检测到重定向，需要进行认证
            echo "该网址需要进行重定向认证"
            # Match last column of who's output with ' :[at least one digit] '
                who | awk '$NF ~ /\(:[0-9]+\)/ { print $1 " " substr($NF, 2, length($NF)-2) };' | \
                while read user display; do
                    start_browser $user $display || $logger -p user.err "Failed for user: '$user' display: '$display'"
                done
        else
            echo "无法访问该网址，HTTP状态码为$response"
        fi
    fi
    ;;
    *)
    # In a down phase
    exit 0
    ;;
esac
