]>
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";
35 # Load the most appropriate language from the browser configuration
36 my @langs = &Lang
::DetectBrowserLanguages
();
37 &Lang
::reload
(@langs);
39 my $coupons = "${General::swroot}/captive/coupons";
45 my $clients="${General::swroot}/captive/clients";
46 my $settingsfile="${General::swroot}/captive/settings";
48 my $url=param
('redirect');
50 #Create /var/ipfire/captive/clients if not exist
51 unless (-f
$clients){ system("touch $clients"); }
54 &getcgihash
(\
%cgiparams);
57 &General
::readhash
("$settingsfile", \
%settings) if(-f
$settingsfile);
60 if ($cgiparams{'ACTION'} eq "SUBMIT") {
61 # Get client IP address
62 my $ip_address = $ENV{X_FORWARDED_FOR
} || $ENV{REMOTE_ADDR
};
64 # Retrieve the MAC address from the ARP table
65 my $mac_address = &Network
::get_hardware_address
($ip_address);
67 &General
::readhasharray
("$clients", \
%clientshash);
68 my $key = &General
::findhasharraykey
(\
%clientshash);
70 # Create a new client line
71 foreach my $i (0 .. 5) { $clientshash{$key}[$i] = ""; }
73 # MAC address of the client
74 $clientshash{$key}[0] = $mac_address;
76 # IP address of the client
77 $clientshash{$key}[1] = $ip_address;
80 $clientshash{$key}[2] = time();
82 if ($settings{"AUTH"} eq "COUPON") {
83 &General
::readhasharray
($coupons, \
%couponhash);
85 if ($cgiparams{'COUPON'}) {
86 # Convert coupon input to uppercase
87 $cgiparams{'COUPON'} = uc $cgiparams{'COUPON'};
89 # Walk through all valid coupons and find the right one
91 foreach my $coupon (keys %couponhash) {
92 if ($couponhash{$coupon}[1] eq $cgiparams{'COUPON'}) {
96 $clientshash{$key}[3] = $couponhash{$coupon}[2];
99 $clientshash{$key}[4] = $cgiparams{'COUPON'};
102 $clientshash{$key}[5] = $couponhash{$coupon}[3];
105 delete $couponhash{$coupon};
106 &General
::writehasharray
($coupons, \
%couponhash);
113 &General
::log("Captive", "Internet access granted via coupon ($clientshash{$key}[4]) for $ip_address until $clientshash{$key}[3]");
115 $errormessage = $Lang::tr
{"Captive invalid coupon"};
120 $errormessage = $Lang::tr
{"Captive please enter a coupon code"};
125 # Make sure that they have been accepted
126 if ($cgiparams{'TERMS'} eq "on") {
127 # Copy session expiry time
128 $clientshash{$key}[3] = $settings{'SESSION_TIME'} || "0";
131 $clientshash{$key}[4] = "TERMS";
133 &General
::log("Captive", "Internet access granted via license agreement for $ip_address until $clientshash{$key}[3]");
135 # The terms have not been accepted
137 $errormessage = $Lang::tr
{'Captive please accept the terms and conditions'};
141 # If no errors were found, save configruation and reload
142 if (!$errormessage) {
143 &General
::writehasharray
("$clients", \
%clientshash);
145 system("/usr/local/bin/captivectrl");
147 # Redirect client to the original URL
148 print "Status: 302 Moved Temporarily\n";
149 print "Location: $url\n";
150 print "Connection: close\n\n";
155 my $tmpl = HTML
::Template
->new(
156 filename
=> "/srv/web/ipfire/html/captive/template.html",
157 die_on_bad_params
=> 0
160 $tmpl->param(REDIRECT
=> $url);
163 if ($settings{'AUTH'} eq "COUPON") {
164 $tmpl->param(COUPON
=> 1);
165 $tmpl->param(L_HEADING
=> $Lang::tr
{'Captive coupon'});
167 $tmpl->param(L_HEADING
=> $Lang::tr
{'Captive terms'});
170 $tmpl->param(TITLE
=> $settings{'TITLE'});
171 $tmpl->param(COLOR
=> $settings{'COLOR'});
172 $tmpl->param(ERROR
=> $errormessage);
174 $tmpl->param(TERMS
=> &getterms
());
176 # Some translated strings
177 $tmpl->param(L_ACTIVATE
=> $Lang::tr
{'Captive ACTIVATE'});
178 $tmpl->param(L_GAIN_ACCESS
=> $Lang::tr
{'Captive GAIN ACCESS'});
179 $tmpl->param(L_AGREE_TERMS
=> $Lang::tr
{'Captive agree tac'});
182 print "Pragma: no-cache\n";
183 print "Cache-control: no-cache\n";
184 print "Connection: close\n";
185 print "Content-type: text/html\n\n";
187 # Print rendered template
188 print $tmpl->output();
191 my ($hash, $params) = @_;
192 my $cgi = CGI
->new ();
193 $hash->{'__CGI__'} = $cgi;
194 return if ($ENV{'REQUEST_METHOD'} ne 'POST');
195 if (!$params->{'wantfile'}) {
196 $CGI::DISABLE_UPLOADS
= 1;
197 $CGI::POST_MAX
= 1024 * 1024;
199 $CGI::POST_MAX
= 10 * 1024 * 1024;
201 $cgi->referer() =~ m/^http?\:\/\
/([^\/]+)/;
203 $cgi->url() =~ m/^http?\:\/\
/([^\/]+)/;
205 return if ($referer ne $servername);
207 ### Modified for getting multi-vars, split by |
208 my %temp = $cgi->Vars();
209 foreach my $key (keys %temp) {
210 $hash->{$key} = $temp{$key};
211 $hash->{$key} =~ s/\0/|/g;
212 $hash->{$key} =~ s/^\s*(.*?)\s*$/$1/;
215 if (($params->{'wantfile'})&&($params->{'filevar'})) {
216 $hash->{$params->{'filevar'}} = $cgi->upload
217 ($params->{'filevar'});
225 open(my $handle, "<:utf8", "/var/ipfire/captive/terms.txt");
227 $_ = HTML
::Entities
::decode_entities
($_);
232 my $terms = join("\n", @terms);
235 $terms =~ s/\n\n/<\/p>\n<p
>/g
;