use CGI ':standard';
use URI::Escape;
use HTML::Entities();
+use HTML::Template;
# enable only the following on debugging purpose
#use warnings;
my $voucherout="${General::swroot}/captive/voucher_out";
my $clients="${General::swroot}/captive/clients";
my $settingsfile="${General::swroot}/captive/settings";
-my $redir=0;
my $errormessage;
my $url=param('redirect');
#Read settings
&General::readhash("$settingsfile", \%settings) if(-f $settingsfile);
-#Actions
-if ($cgiparams{'ACTION'} eq "$Lang::tr{'gpl i accept these terms and conditions'}"){
+# Actions
+if ($cgiparams{'ACTION'} eq "SUBMIT") {
+ # Get client IP address
+ my $ip_address = $ENV{X_FORWARDED_FOR} || $ENV{REMOTE_ADDR};
+
+ # 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);
- #Get Clients IP-Address
- my $ip_address = $ENV{X_FORWARDED_FOR} || $ENV{REMOTE_ADDR} ||"";
+ # Create a new client line
+ foreach my $i (0 .. 5) { $clientshash{$key}[$i] = ""; }
- #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//;
+ # MAC address of the client
+ $clientshash{$key}[0] = $mac_address;
- &General::readhasharray("$clients", \%clientshash);
+ # IP address of the client
+ $clientshash{$key}[1] = $ip_address;
- if (!$errormessage){
- foreach my $i (0 .. 5) { $clientshash{$key}[$i] = "";}
+ # Current time
+ $clientshash{$key}[2] = time();
- $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] = '';
+ if ($settings{"AUTH"} eq "VOUCHER") {
+ &General::readhasharray("$voucherout", \%voucherhash);
- &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]");
- $redir=1;
- }
-}
+ # Convert voucher input to uppercase
+ $cgiparams{'VOUCHER'} = uc $cgiparams{'VOUCHER'};
-if ($cgiparams{'ACTION'} eq "$Lang::tr{'Captive activate'}"){
- my $ip_address;
- my $mac_address;
-
- #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//;
- #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 $key1 = &General::findhasharraykey(\%clientshash);
- foreach my $i (0 .. 5) { $clientshash{$key1}[$i] = "";}
-
- $clientshash{$key1}[0] = $mac_address;
- $clientshash{$key1}[1] = $ip_address;
- $clientshash{$key1}[2] = time();
- $clientshash{$key1}[3] = $voucherhash{$key}[2];
- $clientshash{$key1}[4] = $cgiparams{'VOUCHER'};
- $clientshash{$key1}[5] = HTML::Entities::decode_entities($voucherhash{$key}[3]);
-
- &General::writehasharray("$clients", \%clientshash);
- &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);
- last;
+ # Walk through all valid vouchers and find the right one
+ my $found = 0;
+ foreach my $voucher (keys %voucherhash) {
+ if ($voucherhash{$voucher}[1] eq $cgiparams{'VOUCHER'}) {
+ $found = 1;
+
+ # Copy expiry time
+ $clientshash{$key}[3] = $voucherhash{$voucher}[2];
+
+ # Save voucher code
+ $clientshash{$key}[4] = $cgiparams{'VOUCHER'};
+
+ # Copy voucher remark
+ $clientshash{$key}[5] = $voucherhash{$voucher}[3];
+
+ # Delete used voucher
+ delete $voucherhash{$voucher};
+ &General::writehasharray("$voucherout", \%voucherhash);
+
+ last;
+ }
}
- }
- system("/usr/local/bin/captivectrl");
- $redir=1;
-}
-if($redir == 1){
- sleep(4);
- print "Status: 302 Moved Temporarily\n";
- print "Location: $url\n";
- print "Connection: close\n";
- print "\n";
- exit 0;
-}
+ if ($found == 1) {
+ &General::log("Captive", "Internet access granted via voucher ($clientshash{$key}[4]) for $ip_address until $clientshash{$key}[3]");
+ } else {
+ $errormessage = $Lang::tr{"Captive invalid_voucher"};
+ }
+
+ # License
+ } else {
+ # Copy expiry time
+ $clientshash{$key}[3] = $settings{'EXPIRE'};
-#Open HTML Page, load header and css
-&head();
-&error();
-&start();
-
-#Functions
-sub start(){
- if ($settings{'AUTH'} eq 'VOUCHER'){
- &voucher();
- }else{
- &agb();
+ # No voucher code
+ $clientshash{$key}[4] = "LICENSE";
+
+ &General::log("Captive", "Internet access granted via license agreement for $ip_address until $clientshash{$key}[3]");
}
-}
-sub error(){
- if ($errormessage){
- print "<div id='title'><br>$errormessage<br></diV>";
+ # If no errors were found, save configruation and reload
+ if (!$errormessage) {
+ &General::writehasharray("$clients", \%clientshash);
+
+ system("/usr/local/bin/captivectrl");
+
+ # Redirect client to the original URL
+ print "Status: 302 Moved Temporarily\n";
+ print "Location: $url\n";
+ print "Connection: close\n\n";
+ exit 0;
}
}
-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
-;
-}
+my $tmpl = HTML::Template->new(
+ filename => "/srv/web/ipfire/html/captive/template.html",
+ die_on_bad_params => 0
+);
-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(REDIRECT_URL => $url);
-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> <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
-;
+# Voucher
+if ($settings{'AUTH'} eq "VOUCHER") {
+ $tmpl->param(VOUCHER => 1);
}
+$tmpl->param(TITLE => $settings{'TITLE'});
+$tmpl->param(ERROR => $errormessage);
+
+$tmpl->param(TAC => &gettac());
+
+# 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) = @_;
my $cgi = CGI->new ();
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;
}