]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - html/cgi-bin/captive/index.cgi
captive: Get MAC address of a device without calling arp
[people/pmueller/ipfire-2.x.git] / html / cgi-bin / captive / index.cgi
index d0b28f7a961390adb92f440a55bb7c5f3bdc9b42..bcaf8561af3275ccecf5e757b8453af207bf0d13 100755 (executable)
@@ -23,6 +23,8 @@ use strict;
 use CGI ':standard';
 use URI::Escape;
 use HTML::Entities();
+use HTML::Template;
+
 # enable only the following on debugging purpose
 #use warnings;
 #use CGI::Carp 'fatalsToBrowser';
@@ -41,6 +43,7 @@ my $settingsfile="${General::swroot}/captive/settings";
 my $redir=0;
 my $errormessage;
 my $url=param('redirect');
+
 #Create /var/ipfire/captive/clients if not exist
 unless (-f $clients){ system("touch $clients"); }
 
@@ -50,34 +53,27 @@ unless (-f $clients){ system("touch $clients"); }
 #Read settings
 &General::readhash("$settingsfile", \%settings) if(-f $settingsfile);
 
-#Actions
-if ($cgiparams{'ACTION'} eq "$Lang::tr{'gpl i accept these terms and conditions'}"){
-       my $key = &General::findhasharraykey(\%clientshash);
-       my($sec,$min,$hour) = gmtime(time);
-       my $hour1=$hour+$settings{'TIME'};
-       $min="0".$min if ($min < 10);
-       $hour="0".$hour if ($hour < 10);
-       $hour1="0".$hour1 if ($hour1 < 10);
-
+# Actions
+if ($cgiparams{'ACTION'} eq "SUBMIT") {
        #Get Clients IP-Address
        my $ip_address = $ENV{X_FORWARDED_FOR} || $ENV{REMOTE_ADDR} ||"";
 
-       #Ask arp to give the corresponding MAC-Address
-       my $mac_address = qx(arp -a|grep $ip_address|cut -d ' ' -f 4);
-       $mac_address =~ s/\n+\z//;
+       # Retrieve the MAC address from the ARP table
+       my $mac_address = &Network::get_hardware_address($ip_address);
 
        &General::readhasharray("$clients", \%clientshash);
+       my $key = &General::findhasharraykey(\%clientshash);
 
        if (!$errormessage){
-               foreach my $i (0 .. 6) { $clientshash{$key}[$i] = "";}
-               $clientshash{$key}[0] = $mac_address;
-               $clientshash{$key}[1] = $ip_address;
-               $clientshash{$key}[2] = $hour.":".$min;
-               $clientshash{$key}[3] = $hour1.":".$min;
-               $clientshash{$key}[4] = $Lang::tr{'Captive auth_lic'};
-               $clientshash{$key}[5] = $settings{'TIME'};
-               $clientshash{$key}[6] = time();
-       
+               foreach my $i (0 .. 5) { $clientshash{$key}[$i] = "";}
+
+               $clientshash{$key}[0] = $mac_address;                   #mac address of actual client
+               $clientshash{$key}[1] = $ip_address;                    #ip address of actual client
+               $clientshash{$key}[2] = time();                                 #actual time in unix seconds (timestamp of first conenction)
+               $clientshash{$key}[3] = $settings{'EXPIRE'};    #Expire time in seconds (1day, 1 week ....)
+               $clientshash{$key}[4] = $Lang::tr{'Captive auth_lic'};  #Type of license (license or voucher)
+               $clientshash{$key}[5] = '';
+
                &General::writehasharray("$clients", \%clientshash);
                system("/usr/local/bin/captivectrl");
                &General::log("Captive", "Internet Access granted via license-agreement for $ip_address until $clientshash{$key}[3]");
@@ -85,51 +81,46 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'gpl i accept these terms and conditions'
        }       
 }
 
-if ($cgiparams{'ACTION'} eq "$Lang::tr{'Captive activate'}"){
+if ($cgiparams{'ACTION'} eq "SUBMIT") {
        my $ip_address;
-       my $mac_address;
-
+       my $granted=0;
        #Convert voucherinput to uppercase
        $cgiparams{'VOUCHER'} = uc $cgiparams{'VOUCHER'};
        #Get Clients IP-Address
        $ip_address = $ENV{X_FORWARDED_FOR} || $ENV{REMOTE_ADDR} ||"";
        #Ask arp to give the corresponding MAC-Address
-       $mac_address = qx(arp -a|grep $ip_address|cut -d ' ' -f 4);
-       $mac_address =~ s/\n+\z//;
+       my $mac_address = &Network::get_hardware_address($ip_address);
        #Check if voucher is valid and write client to clients file, delete voucher from voucherout
        &General::readhasharray("$voucherout", \%voucherhash);
        &General::readhasharray("$clients", \%clientshash);
        foreach my $key (keys %voucherhash) {
                if($voucherhash{$key}[1] eq $cgiparams{'VOUCHER'}){
                        #Voucher valid, write to clients, then delete from voucherout
-                       my ($sec,$min,$hour)=gmtime(time());
-                       my $hour1;
-                       $min="0".$min if ($min < 10);
-                       $hour="0".$hour if ($hour < 10);
-                       $hour1=$hour+$voucherhash{$key}[2];
-                       $hour1="0".$hour1 if ($hour1 < 10);
                        my $key1 = &General::findhasharraykey(\%clientshash);
-                       foreach my $i (0 .. 7) { $clientshash{$key1}[$i] = "";}
+                       foreach my $i (0 .. 5) { $clientshash{$key1}[$i] = "";}
+
                        $clientshash{$key1}[0] = $mac_address;
                        $clientshash{$key1}[1] = $ip_address;
-                       $clientshash{$key1}[2] = $hour.":".$min;
-                       $clientshash{$key1}[3] = $hour1.":".$min;
+                       $clientshash{$key1}[2] = time();
+                       $clientshash{$key1}[3] = $voucherhash{$key}[2];
                        $clientshash{$key1}[4] = $cgiparams{'VOUCHER'};
-                       $clientshash{$key1}[5] = $voucherhash{$key}[2];
-                       $clientshash{$key1}[6] = time();
-                       $clientshash{$key1}[7] = $voucherhash{$key}[4];
-       
+                       $clientshash{$key1}[5] = HTML::Entities::decode_entities($voucherhash{$key}[3]);
+
                        &General::writehasharray("$clients", \%clientshash);
-                       $clientshash{$key1}[7]=HTML::Entities::decode_entities($clientshash{$key1}[7]);
                        &General::log("Captive", "Internet Access granted via voucher no. $clientshash{$key1}[4] for $ip_address until $clientshash{$key}[3] Remark: $clientshash{$key1}[7]");
 
                        delete $voucherhash{$key};
                        &General::writehasharray("$voucherout", \%voucherhash);
+                       $granted=1;
                        last;
                }
        }
-       system("/usr/local/bin/captivectrl");
-       $redir=1;
+       if($granted==1){
+               system("/usr/local/bin/captivectrl");
+               $redir=1;
+       }else{
+               $errormessage="$Lang::tr{'Captive invalid_voucher'}";
+       }
 }
 
 if($redir == 1){
@@ -139,111 +130,40 @@ if($redir == 1){
        print "\n";
        exit 0;
 }
-       
 
 #Open HTML Page, load header and css
-&head();
-&error();
-&start();
+my $tmpl = HTML::Template->new(
+       filename => "/srv/web/ipfire/html/captive/template.html",
+       die_on_bad_params => 0
+);
 
-#Functions
+$tmpl->param(REDIRECT_URL => $url);
 
-sub start(){
-       if ($settings{'AUTH'} eq 'VOUCHER'){
-               &voucher();
-       }else{
-               &agb();
-       }
+# Voucher
+if ($settings{'AUTH'} eq "VOUCHER") {
+       $tmpl->param(VOUCHER  => 1);
 }
 
-sub error(){
-       if ($errormessage){
-               print "<div id='title'><br>$errormessage<br></diV>";
-       }
-}
+$tmpl->param(TITLE => $settings{'TITLE'});
+$tmpl->param(ERROR => $errormessage);
 
-sub head(){
-print<<END
-Content-type: text/html\n\n
-<html> 
-       <head>
-               <meta charset="utf-8">
-               <title>$settings{'TITLE'}</title>
-               <link href="../assets/captive.css" type="text/css" rel="stylesheet">
-       </head>
-END
-;
-}
-sub agb(){
-print<<END
-       <body>
-       <center>
-               <div class="title">
-                       <h1>$settings{'TITLE'}
-               </div>
-               <br>
-               <div class="agb">
-               <textarea style="width:100%;" rows='40'>
-END
-;
-&getagb();
-print<<END
-               </textarea>
-                       <center>
-                               <form method='post' action='$ENV{'SCRIPT_NAME'}'>
-                                       <br><input type='hidden' name='redirect' value ='$url'><input type='submit' name='ACTION' value="$Lang::tr{'gpl i accept these terms and conditions'}"/>
-                               </form>
-                       </center>
-               </div>
-       </center>
-       </body>
-       </html>
-END
-;
-}
+$tmpl->param(TAC => &gettac());
 
-sub voucher(){
-       print<<END
-       <body>
-       <center>
-               <div class="title">
-                       <h1>LOGIN</h1>
-               </div>
-               <br>
-               <div class="login">
-END
-;
-
-print<<END
-               <form method='post' action='$ENV{'SCRIPT_NAME'}'>
-                       <center>
-                               <table>
-                                       <tr>
-                                               <td>
-                                                       <b>$Lang::tr{'Captive voucher'}</b>&nbsp<input type='text' maxlength="8" size='10' style="font-size: 24px;font-weight: bold;" name='VOUCHER'>
-                                               </td>
-                                               <td>
-                                                       <input type='submit' name='ACTION' value="$Lang::tr{'Captive activate'}"/>
-                                               </td>
-                                       </tr>
-                               </table>
-               </form>
-               </div>
-               <br>
-               <div class="agb">
-                       <textarea style="width:100%;" rows='40'>
-END
-;
-&getagb();
-print<<END
-                       </textarea>
-                       <br><br>
-               </div>
-       </body>
-       </html>
-END
-;
-}
+# Some translated strings
+$tmpl->param(L_ACTIVATE        => $Lang::tr{'Captive ACTIVATE'});
+$tmpl->param(L_GAIN_ACCESS     => $Lang::tr{'Captive GAIN ACCESS'});
+$tmpl->param(L_HEADING_TAC     => $Lang::tr{'Captive heading tac'});
+$tmpl->param(L_HEADING_VOUCHER => $Lang::tr{'Captive heading voucher'});
+$tmpl->param(L_AGREE_TAC       => $Lang::tr{'Captive agree tac'});
+
+# Print header
+print "Pragma: no-cache\n";
+print "Cache-control: no-cache\n";
+print "Connection: close\n";
+print "Content-type: text/html\n\n";
+
+# Print rendered template
+print $tmpl->output();
 
 sub getcgihash {
        my ($hash, $params) = @_;
@@ -277,11 +197,20 @@ sub getcgihash {
        return;
 }
 
-sub getagb(){
-       open( my $handle, "<:utf8", "/var/ipfire/captive/agb.txt" ) or die("$!");
-               while(<$handle>){
-                       $_ = HTML::Entities::decode_entities($_);
-                       print $_;
-               }
-       close( $handle );
+sub gettac() {
+       my @tac = ();
+
+       open(my $handle, "<:utf8", "/var/ipfire/captive/agb.txt" ) or die("$!");
+       while(<$handle>) {
+               $_ = HTML::Entities::decode_entities($_);
+               push(@tac, $_);
+       }
+       close($handle);
+
+       my $tac = join("\n", @tac);
+
+       # Format paragraphs
+       $tac =~ s/\n\n/<\/p>\n<p>/g;
+
+       return $tac;
 }