]>
git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - html/cgi-bin/captive/index.cgi
2 ###############################################################################
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2016 Alexander Marx alexander.marx@ipfire.org #
7 # This program is free software you can redistribute it and/or modify #
8 # it under the terms of the GNU General Public License as published by #
9 # the Free Software Foundation, either version 3 of the License, or #
10 # (at your option) any later version. #
12 # This program is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
20 ###############################################################################
28 # enable only the following on debugging purpose
30 #use CGI::Carp 'fatalsToBrowser';
32 require '/var/ipfire/general-functions.pl';
33 require "${General::swroot}/lang.pl";
40 my $voucherout="${General::swroot}/captive/voucher_out";
41 my $clients="${General::swroot}/captive/clients";
42 my $settingsfile="${General::swroot}/captive/settings";
45 my $url=param
('redirect');
47 #Create /var/ipfire/captive/clients if not exist
48 unless (-f
$clients){ system("touch $clients"); }
51 &getcgihash
(\
%cgiparams);
54 &General
::readhash
("$settingsfile", \
%settings) if(-f
$settingsfile);
57 if ($cgiparams{'ACTION'} eq "$Lang::tr{'gpl i accept these terms and conditions'}"){
58 #Get Clients IP-Address
59 my $ip_address = $ENV{X_FORWARDED_FOR
} || $ENV{REMOTE_ADDR
} ||"";
61 #Ask arp to give the corresponding MAC-Address
62 my $mac_address = qx(arp
-a
|grep $ip_address|cut
-d
' ' -f
4);
63 $mac_address =~ s/\n+\z//;
65 &General
::readhasharray
("$clients", \
%clientshash);
66 my $key = &General
::findhasharraykey
(\
%clientshash);
69 foreach my $i (0 .. 5) { $clientshash{$key}[$i] = "";}
71 $clientshash{$key}[0] = $mac_address; #mac address of actual client
72 $clientshash{$key}[1] = $ip_address; #ip address of actual client
73 $clientshash{$key}[2] = time(); #actual time in unix seconds (timestamp of first conenction)
74 $clientshash{$key}[3] = $settings{'EXPIRE'}; #Expire time in seconds (1day, 1 week ....)
75 $clientshash{$key}[4] = $Lang::tr
{'Captive auth_lic'}; #Type of license (license or voucher)
76 $clientshash{$key}[5] = '';
78 &General
::writehasharray
("$clients", \
%clientshash);
79 system("/usr/local/bin/captivectrl");
80 &General
::log("Captive", "Internet Access granted via license-agreement for $ip_address until $clientshash{$key}[3]");
85 if ($cgiparams{'ACTION'} eq "$Lang::tr{'Captive activate'}"){
89 #Convert voucherinput to uppercase
90 $cgiparams{'VOUCHER'} = uc $cgiparams{'VOUCHER'};
91 #Get Clients IP-Address
92 $ip_address = $ENV{X_FORWARDED_FOR
} || $ENV{REMOTE_ADDR
} ||"";
93 #Ask arp to give the corresponding MAC-Address
94 $mac_address = qx(arp
-a
|grep $ip_address|cut
-d
' ' -f
4);
95 $mac_address =~ s/\n+\z//;
96 #Check if voucher is valid and write client to clients file, delete voucher from voucherout
97 &General
::readhasharray
("$voucherout", \
%voucherhash);
98 &General
::readhasharray
("$clients", \
%clientshash);
99 foreach my $key (keys %voucherhash) {
100 if($voucherhash{$key}[1] eq $cgiparams{'VOUCHER'}){
101 #Voucher valid, write to clients, then delete from voucherout
102 my $key1 = &General
::findhasharraykey
(\
%clientshash);
103 foreach my $i (0 .. 5) { $clientshash{$key1}[$i] = "";}
105 $clientshash{$key1}[0] = $mac_address;
106 $clientshash{$key1}[1] = $ip_address;
107 $clientshash{$key1}[2] = time();
108 $clientshash{$key1}[3] = $voucherhash{$key}[2];
109 $clientshash{$key1}[4] = $cgiparams{'VOUCHER'};
110 $clientshash{$key1}[5] = HTML
::Entities
::decode_entities
($voucherhash{$key}[3]);
112 &General
::writehasharray
("$clients", \
%clientshash);
113 &General
::log("Captive", "Internet Access granted via voucher no. $clientshash{$key1}[4] for $ip_address until $clientshash{$key}[3] Remark: $clientshash{$key1}[7]");
115 delete $voucherhash{$key};
116 &General
::writehasharray
("$voucherout", \
%voucherhash);
122 system("/usr/local/bin/captivectrl");
125 $errormessage="$Lang::tr{'Captive invalid_voucher'}";
130 print "Status: 302 Moved Temporarily\n";
131 print "Location: $url\n";
132 print "Connection: close\n";
137 #Open HTML Page, load header and css
138 my $tmpl = HTML
::Template
->new(
139 filename
=> "/srv/web/ipfire/html/captive/template.html",
140 die_on_bad_params
=> 0
143 $tmpl->param(REDIRECT_URL
=> $url);
145 $tmpl->param(AUTH
=> $settings{'AUTH'});
146 $tmpl->param(TITLE
=> $settings{'TITLE'});
147 $tmpl->param(ERROR
=> $errormessage);
150 print "Pragma: no-cache\n";
151 print "Cache-control: no-cache\n";
152 print "Connection: close\n";
153 print "Content-type: text/html\n\n";
155 # Print rendered template
159 my ($hash, $params) = @_;
160 my $cgi = CGI
->new ();
161 $hash->{'__CGI__'} = $cgi;
162 return if ($ENV{'REQUEST_METHOD'} ne 'POST');
163 if (!$params->{'wantfile'}) {
164 $CGI::DISABLE_UPLOADS
= 1;
165 $CGI::POST_MAX
= 1024 * 1024;
167 $CGI::POST_MAX
= 10 * 1024 * 1024;
169 $cgi->referer() =~ m/^http?\:\/\
/([^\/]+)/;
171 $cgi->url() =~ m/^http?\:\/\
/([^\/]+)/;
173 return if ($referer ne $servername);
175 ### Modified for getting multi-vars, split by |
176 my %temp = $cgi->Vars();
177 foreach my $key (keys %temp) {
178 $hash->{$key} = $temp{$key};
179 $hash->{$key} =~ s/\0/|/g;
180 $hash->{$key} =~ s/^\s*(.*?)\s*$/$1/;
183 if (($params->{'wantfile'})&&($params->{'filevar'})) {
184 $hash->{$params->{'filevar'}} = $cgi->upload
185 ($params->{'filevar'});
191 open( my $handle, "<:utf8", "/var/ipfire/captive/agb.txt" ) or die("$!");
193 $_ = HTML
::Entities
::decode_entities
($_);