Projects/KPN Hotspots Autologin: Difference between revisions

From Hackerspace Amersfoort
Jump to navigation Jump to search
(Nieuwe pagina aangemaakt met '{{Project |name=KPN Hotspots Autologin |contact=AK47 |info=KPN Hotspots Autologin |status=Productie }} == Introduction == If you are ever in the desperate situation o...')
 
mNo edit summary
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Project
{{Project
|name=KPN Hotspots Autologin
|name=KPN Hotspots Autologin
|start=2012/05/05
|contact=AK47
|contact=AK47
|info=KPN Hotspots Autologin
|info=KPN Hotspots Autologin
|status=Productie
|status=Production
|end=2012-06-05
}}
}}
== Introduction ==
== Introduction ==
Line 13: Line 15:
* A XS4ALL account
* A XS4ALL account
* A box with lot of virtual machines
* A box with lot of virtual machines
* Two (virtual) interfaces on each machine
* Two (virtual) network interfaces on each machine
* NAT on the interface facing the KPN hotspots VLAN
* NAT on the interface facing the KPN hotspots VLAN
* A router with ECMP routing support and ICMP "up" checking (like RouterOS/Routerboard etc)
* A router with ECMP routing support and ICMP "up" checking (like RouterOS/Routerboard etc)
Line 22: Line 24:
Currently the script below has a timeout of 460 minutes, so the script will logout after 460 minutes (20 minutes before time) and then login again.
Currently the script below has a timeout of 460 minutes, so the script will logout after 460 minutes (20 minutes before time) and then login again.


During the login period the script will disable ICMP facing the router so the router knows it shouldn't send any traffic. Whenever the script has verified the "line" is up is will re-enable ICMP.
During the login period the script will disable ICMP facing the router so the router knows it shouldn't send any traffic. Whenever the script has verified the "line" is up it will re-enable ICMP.


== Autologin script ==
== Autologin script ==

Latest revision as of 19:15, 21 April 2013


Project KPN Hotspots Autologin
Name KPN Hotspots Autologin
Start 2012/05/05
End 2012-06-05
Contact AK47
Website
Information KPN Hotspots Autologin
Status Production


Introduction

If you are ever in the desperate situation of needing to build a KPN Hotspots "loadbalancer" for your event, use the script below for inspiration.

What do you need

  • A location with KPN hotspots
  • Preferably a wired connection to the KPN hotspots VLAN (wireless bridge would work as well, but allows only 1 MAC address behind it)
  • A XS4ALL account
  • A box with lot of virtual machines
  • Two (virtual) network interfaces on each machine
  • NAT on the interface facing the KPN hotspots VLAN
  • A router with ECMP routing support and ICMP "up" checking (like RouterOS/Routerboard etc)

Introduction part 2

When you have a XS4ALL account each mailbox counts as a valid "unlimited" KPN Hotspots account. Unlimited means you have an online-time of 8 hours and a bandwidth limit of 2Mbit. After the 8 hours has expired you can login again and have another 8 hours of online-time.

Currently the script below has a timeout of 460 minutes, so the script will logout after 460 minutes (20 minutes before time) and then login again.

During the login period the script will disable ICMP facing the router so the router knows it shouldn't send any traffic. Whenever the script has verified the "line" is up it will re-enable ICMP.

Autologin script

<?php
/**
 * CONFIG
 */
$username = "user@xs4all.nl";       // with @domain.name
$password = "password";
$timeout = 460;         // in minutes
$checkurl = "http://82.197.206.41/hotspotcheck";
$checkvalue = "wooyeah!";
$testno = 4;
$version = "0.11";
$sessionfile = "/root/sessionid";

/**
 * functions
 */
function gettime() {
        return "[" . date("Y-m-d H:i:s") . "] ";
}

function _log($line) {
        echo gettime() . $line . "\n";
}

function toggleICMP($enable = true) {
        if ($enable) {
                _log("enabling ICMP...");
                passthru("iptables -F");
        }
        else {
                _log("disabling ICMP...");
                passthru("iptables -A INPUT -p icmp -j DROP");
        }
}

function getsessionid() {
	global $sessionfile;

        $data = file_get_contents("https://portal.hotspotsvankpn.com/templates/dispatcher.asp?page_id=home_hs_out_nl");

        for ($i = 0; $i < count($http_response_header); $i++) {
                $tmp = explode (" ",$http_response_header[$i]);
                if ($tmp[0] == "Set-Cookie:") {
                        $tmp2 = explode (";",$tmp[1]);
                        $tmp3 = explode ("=", $tmp2[0]);

                        if ($tmp3[0] == "CMSSESSID") {
                                $value = $tmp3[1];
                                break;
                        }
                }
        }

        file_put_contents($sessionfile, $value);

        return $value;
}

function login($username, $password, $sessionid) {
        _log("Logging in...");

        $data = array ('name' => $username, 'pass' => $password, 'page_id' => 1620, 'ws_action' => 'login_user_hotspot', 'voorwaarden' => 'Y');
        $data = http_build_query($data);

        $context_options = array (
                'http' => array (
                    'method' => 'POST',
                    'header'=> "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.1.249.1045 Safari/532.5
\r\n" .
                                "Content-type: application/x-www-form-urlencoded\r\n" .
                                "Content-Length: " . strlen($data) . "\r\n",
                    'content' => $data
                    )
                );

        $context = stream_context_create($context_options);

        $data = file_get_contents("https://portal.hotspotsvankpn.com/templates/dispatcher.asp?page_id=home_hs_out_nl&CMSSESSID=" . $sessionid, false, $context);

}

function logout($sessionid) {
        _log("Logging out...");
        file_get_contents("https://portal.hotspotsvankpn.com/templates/logout2.asp?CMSSESSID=" . $sessionid);
}

function checkup($checkurl, $checkvalue) {
        return (trim(file_get_contents($checkurl)) == $checkvalue);
}

/**
 * init
 */
_log("KPN Hotspots auto-login version {$version}");
toggleICMP(false);
logout(file_get_contents($sessionfile));

$last_login = 0;
$first = true;
$retry = false;
$nosleep = false;
$cnt = 0;

while (true) {
        if ($retry == true || $last_login == 0 || ( ((time() - $last_login) / 60) > $timeout )) {
                if (!$first) {
                        toggleICMP(false);
                        sleep(10);
                        logout($sessionid);
                        sleep(2);
                }
                $sessionid = getsessionid();
                login($username, $password, $sessionid);

                sleep(2);
                if (checkup($checkurl, $checkvalue)) {
                        _log("Line is up!");
                        $last_login = time();
                        toggleICMP(true);
                        $first = false;
                        $retry = false;
                        $nosleep = false;
                }
                else {
                        _log("Hmm. that did not seem to work. Maybe check your username+password and re-run the script? Retrying...");
                        $retry = true;
                        $nosleep = true;
                        sleep(1);
                }
        }

        if (!$nosleep) {

                $good = 0;
                // check if line is still up
                for ($i = 1; $i <= $testno; $i++) {
                        if (checkup($checkurl, $checkvalue)) {
                                $good++;
                        }
                        sleep(1);
                }

                if ($good == 0) {
                        $retry = true;
                        _log("Line seems down, retrying...");
                        toggleICMP(false);
                }
                else {
                        if ($cnt == 0) _log("Ping!");
                        elseif ($cnt > 20) $cnt = 0;
                        $cnt++;
                        sleep(60);
                }
        }
}