Annotation of embedaddon/coova-chilli/doc/hotspotlogin.cgi, revision 1.1.1.1

1.1       misho       1: #!/usr/bin/perl
                      2: 
                      3: # chilli - ChilliSpot.org. A Wireless LAN Access Point Controller
                      4: # Copyright (C) 2003, 2004 Mondru AB.
                      5: # Copyright (C) 2006-2008 David Bird <david@coova.com>
                      6: #
                      7: # The contents of this file may be used under the terms of the GNU
                      8: # General Public License Version 2, provided that the above copyright
                      9: # notice and this permission notice is included in all copies or
                     10: # substantial portions of the software.
                     11: 
                     12: # Redirects from ChilliSpot daemon:
                     13: #
                     14: # Redirection when not yet or already authenticated
                     15: #   notyet:  ChilliSpot daemon redirects to login page.
                     16: #   already: ChilliSpot daemon redirects to success status page.
                     17: #
                     18: # Response to login:
                     19: #   already: Attempt to login when already logged in.
                     20: #   failed:  Login failed
                     21: #   success: Login succeded
                     22: #
                     23: # logoff:  Response to a logout
                     24: 
                     25: 
                     26: # Shared secret used to encrypt challenge with. Prevents dictionary attacks.
                     27: # You should change this to your own shared secret.
                     28: $uamsecret = "ht2eb8ej6s4et3rg1ulp";
                     29: 
                     30: # Uncomment the following line if you want to use ordinary user-password
                     31: # for radius authentication. Must be used together with $uamsecret.
                     32: #$userpassword=1;
                     33: 
                     34: # This code is horrible -- it came that way, and remains that way. A
                     35: # real open-source captive portal for coova-chilli should be built -- david
                     36: 
                     37: $loginpath = "/cgi-bin/hotspotlogin.cgi";
                     38: 
                     39: use Digest::MD5  qw(md5 md5_hex md5_base64);
                     40: 
                     41: # Make sure that the form parameters are clean
                     42: $OK_CHARS='-a-zA-Z0-9_.@&=%!';
                     43: $_ = $input = <STDIN>;
                     44: s/[^$OK_CHARS]/_/go;
                     45: $input = $_;
                     46: 
                     47: # Make sure that the get query parameters are clean
                     48: $OK_CHARS='-a-zA-Z0-9_.@&=%!';
                     49: $_ = $query=$ENV{QUERY_STRING};
                     50: s/[^$OK_CHARS]/_/go;
                     51: $query = $_;
                     52: 
                     53: 
                     54: # If she did not use https tell her that it was wrong.
                     55: if (!($ENV{HTTPS} =~ /^on$/)) {
                     56:     print "Content-type: text/html\n\n
                     57: <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">
                     58: <html>
                     59: <head>
                     60:   <title>ChilliSpot Login Failed</title>
                     61:   <meta http-equiv=\"Cache-control\" content=\"no-cache\">
                     62:   <meta http-equiv=\"Pragma\" content=\"no-cache\">
                     63: </head>
                     64: <body bgColor = '#c0d8f4'>
                     65:   <h1 style=\"text-align: center;\">ChilliSpot Login Failed</h1>
                     66:   <center>
                     67:     Login must use encrypted connection.
                     68:   </center>
                     69: </body>
                     70: <!--
                     71: <?xml version=\"1.0\" encoding=\"UTF-8\"?>
                     72: <WISPAccessGatewayParam 
                     73:   xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
                     74:   xsi:noNamespaceSchemaLocation=\"http://www.acmewisp.com/WISPAccessGatewayParam.xsd\">
                     75: <AuthenticationReply>
                     76: <MessageType>120</MessageType>
                     77: <ResponseCode>102</ResponseCode>
                     78: <ReplyMessage>Login must use encrypted connection</ReplyMessage>
                     79: </AuthenticationReply> 
                     80: </WISPAccessGatewayParam>
                     81: -->
                     82: </html>
                     83: ";
                     84:     exit(0);
                     85: }
                     86: 
                     87: 
                     88: #Read form parameters which we care about
                     89: @array = split('&',$input);
                     90: foreach $var ( @array )
                     91: {
                     92:     @array2 = split('=',$var);
                     93:     if ($array2[0] =~ /^username$/i) { $username = $array2[1]; }
                     94:     if ($array2[0] =~ /^password$/i) { $password = $array2[1]; }
                     95:     if ($array2[0] =~ /^challenge$/) { $challenge = $array2[1]; }
                     96:     if ($array2[0] =~ /^button$/) { $button = $array2[1]; }
                     97:     if ($array2[0] =~ /^logout$/) { $logout = $array2[1]; }
                     98:     if ($array2[0] =~ /^prelogin$/) { $prelogin = $array2[1]; }
                     99:     if ($array2[0] =~ /^res$/) { $res = $array2[1]; }
                    100:     if ($array2[0] =~ /^uamip$/) { $uamip = $array2[1]; }
                    101:     if ($array2[0] =~ /^uamport$/) { $uamport = $array2[1]; }
                    102:     if ($array2[0] =~ /^userurl$/)   { $userurl = $array2[1]; }
                    103:     if ($array2[0] =~ /^timeleft$/)  { $timeleft = $array2[1]; }
                    104:     if ($array2[0] =~ /^redirurl$/)  { $redirurl = $array2[1]; }
                    105: }
                    106: 
                    107: #Read query parameters which we care about
                    108: @array = split('&',$query);
                    109: foreach $var ( @array )
                    110: {
                    111:     @array2 = split('=',$var);
                    112:     if ($array2[0] =~ /^username$/i) { $username = $array2[1]; }
                    113:     if ($array2[0] =~ /^password$/i) { $password = $array2[1]; }
                    114:     if ($array2[0] =~ /^res$/)       { $res = $array2[1]; }
                    115:     if ($array2[0] =~ /^challenge$/) { $challenge = $array2[1]; }
                    116:     if ($array2[0] =~ /^uamip$/)     { $uamip = $array2[1]; }
                    117:     if ($array2[0] =~ /^uamport$/)   { $uamport = $array2[1]; }
                    118:     if ($array2[0] =~ /^reply$/)     { $reply = $array2[1]; }
                    119:     if ($array2[0] =~ /^userurl$/)   { $userurl = $array2[1]; }
                    120:     if ($array2[0] =~ /^timeleft$/)  { $timeleft = $array2[1]; }
                    121:     if ($array2[0] =~ /^redirurl$/)  { $redirurl = $array2[1]; }
                    122: }
                    123: 
                    124: 
                    125: $reply =~ s/\+/ /g;
                    126: $reply =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/seg;
                    127: 
                    128: $userurldecode = $userurl;
                    129: $userurldecode =~ s/\+/ /g;
                    130: $userurldecode =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/seg;
                    131: 
                    132: $redirurldecode = $redirurl;
                    133: $redirurldecode =~ s/\+/ /g;
                    134: $redirurldecode =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/seg;
                    135: 
                    136: $password =~ s/\+/ /g;
                    137: $password =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/seg;
                    138: 
                    139: # If attempt to login
                    140: if ($button =~ /^Login$/) {
                    141:     $hexchal  = pack "H32", $challenge;
                    142:     if (defined $uamsecret) {
                    143:        $newchal  = md5($hexchal, $uamsecret);
                    144:     }
                    145:     else {
                    146:        $newchal  = $hexchal;
                    147:     }
                    148:     $response = md5_hex("\0", $password, $newchal);
                    149:     $pappassword = unpack "H32", ($password ^ $newchal);
                    150: #sleep 5;
                    151: print "Content-type: text/html\n\n";
                    152: print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">
                    153: <html>
                    154: <head>
                    155:   <title>ChilliSpot Login</title>
                    156:   <meta http-equiv=\"Cache-control\" content=\"no-cache\">
                    157:   <meta http-equiv=\"Pragma\" content=\"no-cache\">";
                    158:     if ((defined $uamsecret) && defined($userpassword)) {
                    159:        print "  <meta http-equiv=\"refresh\" content=\"0;url=http://$uamip:$uamport/logon?username=$username&password=$pappassword\">";
                    160:     } else {
                    161:        print "  <meta http-equiv=\"refresh\" content=\"0;url=http://$uamip:$uamport/logon?username=$username&response=$response&userurl=$userurl\">";
                    162:     }
                    163: print "</head>
                    164: <body bgColor = '#c0d8f4'>";
                    165:   print "<h1 style=\"text-align: center;\">Logging in to ChilliSpot</h1>";
                    166:   print "
                    167:   <center>
                    168:     Please wait......
                    169:   </center>
                    170: </body>
                    171: <!--
                    172: <?xml version=\"1.0\" encoding=\"UTF-8\"?>
                    173: <WISPAccessGatewayParam 
                    174:   xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
                    175:   xsi:noNamespaceSchemaLocation=\"http://www.acmewisp.com/WISPAccessGatewayParam.xsd\">
                    176: <AuthenticationReply>
                    177: <MessageType>120</MessageType>
                    178: <ResponseCode>201</ResponseCode>
                    179: ";
                    180:     if ((defined $uamsecret) && defined($userpassword)) {
                    181:        print "<LoginResultsURL>http://$uamip:$uamport/logon?username=$username&password=$pappassword</LoginResultsURL>";
                    182:     } else {
                    183:        print "<LoginResultsURL>http://$uamip:$uamport/logon?username=$username&response=$response&userurl=$userurl</LoginResultsURL>";
                    184:     }
                    185: print "</AuthenticationReply> 
                    186: </WISPAccessGatewayParam>
                    187: -->
                    188: </html>
                    189: ";
                    190:     exit(0);
                    191: }
                    192: 
                    193: 
                    194: # Default: It was not a form request
                    195: $result = 0;
                    196: 
                    197: # If login successful
                    198: if ($res =~ /^success$/) { 
                    199:     $result = 1;
                    200: }
                    201: 
                    202: # If login failed 
                    203: if ($res =~ /^failed$/) { 
                    204:     $result = 2;
                    205: }
                    206: 
                    207: # If logout successful
                    208: if ($res =~ /^logoff$/) { 
                    209:     $result = 3;
                    210: }
                    211: 
                    212: # If tried to login while already logged in
                    213: if ($res =~ /^already$/) { 
                    214:     $result = 4;
                    215: }
                    216: 
                    217: # If not logged in yet
                    218: if ($res =~ /^notyet$/) { 
                    219:     $result = 5;
                    220: }
                    221: 
                    222: # If login from smart client
                    223: if ($res =~ /^smartclient$/) { 
                    224:     $result = 6;
                    225: }
                    226: 
                    227: # If requested a logging in pop up window
                    228: if ($res =~ /^popup1$/) { 
                    229:     $result = 11;
                    230: }
                    231: 
                    232: # If requested a success pop up window
                    233: if ($res =~ /^popup2$/) { 
                    234:     $result = 12;
                    235: }
                    236: 
                    237: # If requested a logout pop up window
                    238: if ($res =~ /^popup3$/) { 
                    239:     $result = 13;
                    240: }
                    241: 
                    242: 
                    243: # Otherwise it was not a form request
                    244: # Send out an error message
                    245: if ($result == 0) {
                    246:     print "Content-type: text/html\n\n
                    247: <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">
                    248: <html>
                    249: <head>
                    250:   <title>ChilliSpot Login Failed</title>
                    251:   <meta http-equiv=\"Cache-control\" content=\"no-cache\">
                    252:   <meta http-equiv=\"Pragma\" content=\"no-cache\">
                    253: </head>
                    254: <body bgColor = '#c0d8f4'>
                    255:   <h1 style=\"text-align: center;\">ChilliSpot Login Failed</h1>
                    256:   <center>
                    257:     Login must be performed through ChilliSpot daemon.
                    258:   </center>
                    259: </body>
                    260: </html>
                    261: ";
                    262:     exit(0);
                    263: }
                    264: 
                    265: #Generate the output
                    266: print "Content-type: text/html\n\n
                    267: <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">
                    268: <html>
                    269: <head>
                    270:   <title>ChilliSpot Login</title>
                    271:   <meta http-equiv=\"Cache-control\" content=\"no-cache\">
                    272:   <meta http-equiv=\"Pragma\" content=\"no-cache\">
                    273:   <SCRIPT LANGUAGE=\"JavaScript\">
                    274:     var blur = 0;
                    275:     var starttime = new Date();
                    276:     var startclock = starttime.getTime();
                    277:     var mytimeleft = 0;
                    278: 
                    279:     function doTime() {
                    280:       window.setTimeout( \"doTime()\", 1000 );
                    281:       t = new Date();
                    282:       time = Math.round((t.getTime() - starttime.getTime())/1000);
                    283:       if (mytimeleft) {
                    284:         time = mytimeleft - time;
                    285:         if (time <= 0) {
                    286:           window.location = \"$loginpath?res=popup3&uamip=$uamip&uamport=$uamport\";
                    287:         }
                    288:       }
                    289:       if (time < 0) time = 0;
                    290:       hours = (time - (time % 3600)) / 3600;
                    291:       time = time - (hours * 3600);
                    292:       mins = (time - (time % 60)) / 60;
                    293:       secs = time - (mins * 60);
                    294:       if (hours < 10) hours = \"0\" + hours;
                    295:       if (mins < 10) mins = \"0\" + mins;
                    296:       if (secs < 10) secs = \"0\" + secs;
                    297:       title = \"Online time: \" + hours + \":\" + mins + \":\" + secs;
                    298:       if (mytimeleft) {
                    299:         title = \"Remaining time: \" + hours + \":\" + mins + \":\" + secs;
                    300:       }
                    301:       if(document.all || document.getElementById){
                    302:          document.title = title;
                    303:       }
                    304:       else {   
                    305:         self.status = title;
                    306:       }
                    307:     }
                    308: 
                    309:     function popUp(URL) {
                    310:       if (self.name != \"chillispot_popup\") {
                    311:         chillispot_popup = window.open(URL, 'chillispot_popup', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=375');
                    312:       }
                    313:     }
                    314: 
                    315:     function doOnLoad(result, URL, userurl, redirurl, timeleft) {
                    316:       if (timeleft) {
                    317:         mytimeleft = timeleft;
                    318:       }
                    319:       if ((result == 1) && (self.name == \"chillispot_popup\")) {
                    320:         doTime();
                    321:       }
                    322:       if ((result == 1) && (self.name != \"chillispot_popup\")) {
                    323:         chillispot_popup = window.open(URL, 'chillispot_popup', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=375');
                    324:       }
                    325:       if ((result == 2) || result == 5) {
                    326:         document.form1.UserName.focus()
                    327:       }
                    328:       if ((result == 2) && (self.name != \"chillispot_popup\")) {
                    329:         chillispot_popup = window.open('', 'chillispot_popup', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=400,height=200');
                    330:         chillispot_popup.close();
                    331:       }
                    332:       if ((result == 12) && (self.name == \"chillispot_popup\")) {
                    333:         doTime();
                    334:         if (redirurl) {
                    335:           opener.location = redirurl;
                    336:         }
                    337:         else if (opener.home) {
                    338:           opener.home();
                    339:         }
                    340:         else {
                    341:           opener.location = \"about:home\";
                    342:         }
                    343:         self.focus();
                    344:         blur = 0;
                    345:       }
                    346:       if ((result == 13) && (self.name == \"chillispot_popup\")) {
                    347:         self.focus();
                    348:         blur = 1;
                    349:       }
                    350:     }
                    351: 
                    352:     function doOnBlur(result) {
                    353:       if ((result == 12) && (self.name == \"chillispot_popup\")) {
                    354:         if (blur == 0) {
                    355:           blur = 1;
                    356:           self.focus();
                    357:         }
                    358:       }
                    359:     }
                    360:   </script>
                    361: </head>
                    362: <body onLoad=\"javascript:doOnLoad($result, '$loginpath?res=popup2&uamip=$uamip&uamport=$uamport&userurl=$userurl&redirurl=$redirurl&timeleft=$timeleft','$userurldecode', '$redirurldecode', '$timeleft')\" onBlur = \"javascript:doOnBlur($result)\" bgColor = '#c0d8f4'>";
                    363: 
                    364: 
                    365: #      if (!window.opener) {
                    366: #        document.bgColor = '#c0d8f4';
                    367: #      }
                    368: 
                    369: #print "THE INPUT: $input";
                    370: #foreach $key (sort (keys %ENV)) {
                    371: #      print $key, ' = ', $ENV{$key}, "<br>\n";
                    372: #}
                    373: 
                    374: if ($result == 2) {
                    375:     print "
                    376:   <h1 style=\"text-align: center;\">ChilliSpot Login Failed</h1>";
                    377:     if ($reply) {
                    378:        print "<center> $reply </BR></BR></center>";
                    379:     }
                    380: }
                    381: 
                    382: if ($result == 5) {
                    383:     print "
                    384:   <h1 style=\"text-align: center;\">ChilliSpot Login</h1>";
                    385: }
                    386: 
                    387: if ($result == 2 || $result == 5) {
                    388:   print "
                    389:   <form name=\"form1\" method=\"post\" action=\"$loginpath\">
                    390:   <INPUT TYPE=\"hidden\" NAME=\"challenge\" VALUE=\"$challenge\">
                    391:   <INPUT TYPE=\"hidden\" NAME=\"uamip\" VALUE=\"$uamip\">
                    392:   <INPUT TYPE=\"hidden\" NAME=\"uamport\" VALUE=\"$uamport\">
                    393:   <INPUT TYPE=\"hidden\" NAME=\"userurl\" VALUE=\"$userurl\">
                    394:   <center>
                    395:   <table border=\"0\" cellpadding=\"5\" cellspacing=\"0\" style=\"width: 217px;\">
                    396:     <tbody>
                    397:       <tr>
                    398:         <td align=\"right\">Username:</td>
                    399:         <td><input STYLE=\"font-family: Arial\" type=\"text\" name=\"UserName\" size=\"20\" maxlength=\"128\"></td>
                    400:       </tr>
                    401:       <tr>
                    402:         <td align=\"right\">Password:</td>
                    403:         <td><input STYLE=\"font-family: Arial\" type=\"password\" name=\"Password\" size=\"20\" maxlength=\"128\"></td>
                    404:       </tr>
                    405:       <tr>
                    406:         <td align=\"center\" colspan=\"2\" height=\"23\"><input type=\"submit\" name=\"button\" value=\"Login\" onClick=\"javascript:popUp('$loginpath?res=popup1&uamip=$uamip&uamport=$uamport')\"></td> 
                    407:       </tr>
                    408:     </tbody>
                    409:   </table>
                    410:   </center>
                    411:   </form>
                    412: </body>
                    413: </html>";
                    414: }
                    415: 
                    416: if ($result == 1) {
                    417:   print "
                    418:   <h1 style=\"text-align: center;\">Logged in to ChilliSpot</h1>";
                    419: 
                    420:   if ($reply) { 
                    421:       print "<center> $reply </BR></BR></center>";
                    422:   }
                    423: 
                    424:   print "
                    425:   <center>
                    426:     <a href=\"http://$uamip:$uamport/logoff\">Logout</a>
                    427:   </center>
                    428: </body>
                    429: </html>";
                    430: }
                    431: 
                    432: if (($result == 4) || ($result == 12)) {
                    433:   print "
                    434:   <h1 style=\"text-align: center;\">Logged in to ChilliSpot</h1>
                    435:   <center>
                    436:     <a href=\"http://$uamip:$uamport/logoff\">Logout</a>
                    437:   </center>
                    438: </body>
                    439: </html>";
                    440: }
                    441: 
                    442: 
                    443: if ($result == 11) {
                    444:   print "<h1 style=\"text-align: center;\">Logging in to ChilliSpot</h1>";
                    445:   print "
                    446:   <center>
                    447:     Please wait......
                    448:   </center>
                    449: </body>
                    450: </html>";
                    451: }
                    452: 
                    453: 
                    454: if (($result == 3) || ($result == 13)) {
                    455:     print "
                    456:   <h1 style=\"text-align: center;\">Logged out from ChilliSpot</h1>
                    457:   <center>
                    458:     <a href=\"http://$uamip:$uamport/prelogin\">Login</a>
                    459:   </center>
                    460: </body>
                    461: </html>";
                    462: }
                    463: 
                    464: 
                    465: exit(0);
                    466: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>