#!/usr/bin/perl ############################################################################### # # # IPFire.org - A linux based firewall # # Copyright (C) 2016 Alexander Marx alexander.marx@ipfire.org # # # # This program is free software you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # # # ############################################################################### use strict; use CGI ':standard'; use URI::Escape; use HTML::Entities(); # enable only the following on debugging purpose #use warnings; #use CGI::Carp 'fatalsToBrowser'; require '/var/ipfire/general-functions.pl'; require "${General::swroot}/lang.pl"; #Set Variables my %voucherhash=(); my %clientshash=(); my %cgiparams=(); my %settings=(); 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'); #Create /var/ipfire/captive/clients if not exist unless (-f $clients){ system("touch $clients"); } #Get GUI variables &getcgihash(\%cgiparams); #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); #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//; &General::readhasharray("$clients", \%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(); &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; } } 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 ($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] = "";} $clientshash{$key1}[0] = $mac_address; $clientshash{$key1}[1] = $ip_address; $clientshash{$key1}[2] = $hour.":".$min; $clientshash{$key1}[3] = $hour1.":".$min; $clientshash{$key1}[4] = $cgiparams{'VOUCHER'}; $clientshash{$key1}[5] = $voucherhash{$key}[2]; $clientshash{$key1}[6] = time(); $clientshash{$key1}[7] = $voucherhash{$key}[4]; &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); last; } } system("/usr/local/bin/captivectrl"); $redir=1; } if($redir == 1){ print "Status: 302 Moved Temporarily\n"; print "Location: $url\n"; print "Connection: close\n"; print "\n"; exit 0; } #Open HTML Page, load header and css &head(); &error(); &start(); #Functions sub start(){ if ($settings{'AUTH'} eq 'VOUCHER'){ &voucher(); }else{ &agb(); } } sub error(){ if ($errormessage){ print "

$errormessage
"; } } sub head(){ print< $settings{'TITLE'} END ; } sub agb(){ print<

$settings{'TITLE'}



END ; } sub voucher(){ print<

LOGIN





END ; } sub getcgihash { my ($hash, $params) = @_; my $cgi = CGI->new (); $hash->{'__CGI__'} = $cgi; return if ($ENV{'REQUEST_METHOD'} ne 'POST'); if (!$params->{'wantfile'}) { $CGI::DISABLE_UPLOADS = 1; $CGI::POST_MAX = 1024 * 1024; } else { $CGI::POST_MAX = 10 * 1024 * 1024; } $cgi->referer() =~ m/^http?\:\/\/([^\/]+)/; my $referer = $1; $cgi->url() =~ m/^http?\:\/\/([^\/]+)/; my $servername = $1; return if ($referer ne $servername); ### Modified for getting multi-vars, split by | my %temp = $cgi->Vars(); foreach my $key (keys %temp) { $hash->{$key} = $temp{$key}; $hash->{$key} =~ s/\0/|/g; $hash->{$key} =~ s/^\s*(.*?)\s*$/$1/; } if (($params->{'wantfile'})&&($params->{'filevar'})) { $hash->{$params->{'filevar'}} = $cgi->upload ($params->{'filevar'}); } return; } sub getagb(){ open( my $handle, "<:utf8", "/var/ipfire/captive/agb.txt" ) or die("$!"); while(<$handle>){ $_ = HTML::Entities::decode_entities($_); print $_; } close( $handle ); }