]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - html/cgi-bin/captive/index.cgi
Captive-Portal: add Errormessage when wrong code is entered
[people/pmueller/ipfire-2.x.git] / html / cgi-bin / captive / index.cgi
1 #!/usr/bin/perl
2 ###############################################################################
3 # #
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2016 Alexander Marx alexander.marx@ipfire.org #
6 # #
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. #
11 # #
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. #
16 # #
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/>. #
19 # #
20 ###############################################################################
21
22 use strict;
23 use CGI ':standard';
24 use URI::Escape;
25 use HTML::Entities();
26
27 # enable only the following on debugging purpose
28 #use warnings;
29 #use CGI::Carp 'fatalsToBrowser';
30
31 require '/var/ipfire/general-functions.pl';
32 require "${General::swroot}/lang.pl";
33
34 #Set Variables
35 my %voucherhash=();
36 my %clientshash=();
37 my %cgiparams=();
38 my %settings=();
39 my $voucherout="${General::swroot}/captive/voucher_out";
40 my $clients="${General::swroot}/captive/clients";
41 my $settingsfile="${General::swroot}/captive/settings";
42 my $redir=0;
43 my $errormessage;
44 my $url=param('redirect');
45
46 #Create /var/ipfire/captive/clients if not exist
47 unless (-f $clients){ system("touch $clients"); }
48
49 #Get GUI variables
50 &getcgihash(\%cgiparams);
51
52 #Read settings
53 &General::readhash("$settingsfile", \%settings) if(-f $settingsfile);
54
55 #Actions
56 if ($cgiparams{'ACTION'} eq "$Lang::tr{'gpl i accept these terms and conditions'}"){
57 my $key = &General::findhasharraykey(\%clientshash);
58
59 #Get Clients IP-Address
60 my $ip_address = $ENV{X_FORWARDED_FOR} || $ENV{REMOTE_ADDR} ||"";
61
62 #Ask arp to give the corresponding MAC-Address
63 my $mac_address = qx(arp -a|grep $ip_address|cut -d ' ' -f 4);
64 $mac_address =~ s/\n+\z//;
65
66 &General::readhasharray("$clients", \%clientshash);
67
68 if (!$errormessage){
69 foreach my $i (0 .. 5) { $clientshash{$key}[$i] = "";}
70
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] = '';
77
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]");
81 $redir=1;
82 }
83 }
84
85 if ($cgiparams{'ACTION'} eq "$Lang::tr{'Captive activate'}"){
86 my $ip_address;
87 my $mac_address;
88 my $granted=0;
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] = "";}
104
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]);
111
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]");
114
115 delete $voucherhash{$key};
116 &General::writehasharray("$voucherout", \%voucherhash);
117 $granted=1;
118 last;
119 }
120 }
121 if($granted==1){
122 system("/usr/local/bin/captivectrl");
123 $redir=1;
124 }else{
125 $errormessage="$Lang::tr{'Captive invalid_voucher'}";
126 }
127 }
128
129 if($redir == 1){
130 print "Status: 302 Moved Temporarily\n";
131 print "Location: $url\n";
132 print "Connection: close\n";
133 print "\n";
134 exit 0;
135 }
136
137 #Open HTML Page, load header and css
138 &head();
139 &error();
140 &start();
141
142 #Functions
143 sub start(){
144 if ($settings{'AUTH'} eq 'VOUCHER'){
145 &voucher();
146 }else{
147 &agb();
148 }
149 }
150
151 sub error(){
152 if ($errormessage){
153 print "<center><div class='title'><br><font color='red'>$errormessage</font><br></div><br>";
154 }
155 }
156
157 sub head(){
158 print<<END
159 Content-type: text/html\n\n
160 <html>
161 <head>
162 <meta charset="utf-8">
163 <title>$settings{'TITLE'}</title>
164 <link href="../assets/captive.css" type="text/css" rel="stylesheet">
165 </head>
166 <body>
167 END
168 ;
169 }
170
171 sub agb(){
172 print<<END
173 <center>
174 <div class="title">
175 <h1>$settings{'TITLE'}</h1>
176 </div>
177 <br>
178 <div class="agb">
179 <textarea style="width:100%;" rows='40'>
180 END
181 ;
182 &getagb();
183 print<<END
184 </textarea>
185 <center>
186 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
187 <br><input type='hidden' name='redirect' value ='$url'><input type='submit' name='ACTION' value="$Lang::tr{'gpl i accept these terms and conditions'}"/>
188 </form>
189 </center>
190 </div>
191 </center>
192 </body>
193 </html>
194 END
195 ;
196 }
197
198 sub voucher(){
199 print<<END
200 <center>
201 <div class="title">
202 <h1>$settings{'TITLE'}</h1>
203 </div>
204 <br>
205 <div class="login">
206 END
207 ;
208
209 print<<END
210 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
211 <center>
212 <table>
213 <tr>
214 <td>
215 <b>$Lang::tr{'Captive voucher'}</b>&nbsp<input type='text' maxlength="8" size='10' style="font-size: 24px;font-weight: bold;" name='VOUCHER'>
216 </td>
217 <td>
218 <input type='hidden' name='redirect' value ='$url'><input type='submit' name='ACTION' value="$Lang::tr{'Captive activate'}"/>
219 </td>
220 </tr>
221 </table>
222 </form>
223 </div>
224 <br>
225 <div class="agb">
226 <textarea style="width:100%;" rows='40'>
227 END
228 ;
229 &getagb();
230 print<<END
231 </textarea>
232 <br><br>
233 </div>
234 </body>
235 </html>
236 END
237 ;
238 }
239
240 sub getcgihash {
241 my ($hash, $params) = @_;
242 my $cgi = CGI->new ();
243 $hash->{'__CGI__'} = $cgi;
244 return if ($ENV{'REQUEST_METHOD'} ne 'POST');
245 if (!$params->{'wantfile'}) {
246 $CGI::DISABLE_UPLOADS = 1;
247 $CGI::POST_MAX = 1024 * 1024;
248 } else {
249 $CGI::POST_MAX = 10 * 1024 * 1024;
250 }
251 $cgi->referer() =~ m/^http?\:\/\/([^\/]+)/;
252 my $referer = $1;
253 $cgi->url() =~ m/^http?\:\/\/([^\/]+)/;
254 my $servername = $1;
255 return if ($referer ne $servername);
256
257 ### Modified for getting multi-vars, split by |
258 my %temp = $cgi->Vars();
259 foreach my $key (keys %temp) {
260 $hash->{$key} = $temp{$key};
261 $hash->{$key} =~ s/\0/|/g;
262 $hash->{$key} =~ s/^\s*(.*?)\s*$/$1/;
263 }
264
265 if (($params->{'wantfile'})&&($params->{'filevar'})) {
266 $hash->{$params->{'filevar'}} = $cgi->upload
267 ($params->{'filevar'});
268 }
269 return;
270 }
271
272 sub getagb(){
273 open( my $handle, "<:utf8", "/var/ipfire/captive/agb.txt" ) or die("$!");
274 while(<$handle>){
275 $_ = HTML::Entities::decode_entities($_);
276 print $_;
277 }
278 close( $handle );
279 }