summaryrefslogtreecommitdiffstats
path: root/recon/autowifi/usr/lib/autowifi/lib/wps
blob: 5e9bbda79814eba00151d97c3175015975b39d81 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/bin/sh
has_wps(){
    # the-wpa_supplicant-encryption-string
    echo "$1" | grep  -q "\[WPS\]"
}
try_wps_pin(){
    # 
    # ESSID MAC CHANNEL ENC WPA WPA2 PIN
    #set -ef
    ESSID="$1"
    MAC="$2"
    CHANNEL="$3"

    # TODO  refactor to use all the encryption
    # the wpa_supplicant encryption string
    ENC="$4"

    PIN="$5"

    [ "$ENC" == "[ESS]" ] && return 2
    WPA_CONF=/tmp/wpa_trywps.conf
    WPA_LOG=/tmp/wpa_trywps.log
    rm $WPA_LOG
    #mkfifo $WPA_LOG
    killall wpa_supplicant 2>/dev/null && sleep 1
	
    cat > $WPA_CONF <<EOF 
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1
EOF
    wpa_supplicant -Dwext -iwlan0 -c $WPA_CONF -f $WPA_LOG 2>&1 &
    WPA_PID=$!
    sleep 2
    if !(sudo wpa_cli wps_reg $MAC $PIN  | grep -q OK) ;then
        echo "wpa_cli wps_reg failed, bailing out!"
        return 1
    fi

            # association failed
            #    exit 1 ;;
    # TODO probably not posix compatible...
    timeout(){
      ( timeout=10;
        while [ $timeout -gt 0 ]; do 
            sleep 1;
            kill -0 $$ 2> /dev/null || exit 0; 
            : $((timeout--));
        done ;
        echo "TIMEOUT REACHED" ; 
        kill $$)&
       exec $@
    }

    if (  timeout tail -f $WPA_LOG & echo "TAILPID: $!") | while read line ; do
        bye(){
            printf "%s:" "$2" >&2
            kill $WPA_PID
            kill -HUP $TAILPID
            exit $1
        }
        # DEBUG
        #echo $line >&2
        case "$line" in
            TAILPID:*)IFS=" " set -- $line; TAILPID=$2;;
            *"WPS-FAIL msg=10 config_error=18"*) bye 1 "wrong pin";; 
            *"CTRL-EVENT-EAP-FAILURE EAP authentication failed"*) bye 1 "rate limiting";; 
            #*"Association request to the driver failed") bye 1 "wps not available";;       
            #*CTRL-EVENT-DISCONNECTED*):;;
            *"CTRL-EVENT-DISCONNECTED bssid="*"reason=3 locally_generated=1"*)bye 1 "authentication failed, wps deactivated?";;
            "TIMEOUT REACHED")bye 1 "timeout reached";;
            *CTRL-EVENT-TERMINATING*) bye 1 "wpa_supplicant died";;
            *CTRL-EVENT-CONNECTED*) bye 0 "yay connected";; 
        esac
    done ; then
        #echo "Connected!"
        sed -n 's/[ \t]*psk="\(.*\)"$/\1/p' "$WPA_CONF"
        return 0
    else
        #echo "failed!"
        return 1
    fi

}