]>
git.ipfire.org Git - 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 ###############################################################################
27 # enable only the following on debugging purpose
29 #use CGI::Carp 'fatalsToBrowser';
31 require '/var/ipfire/general-functions.pl' ;
32 require "${General::swroot}/lang.pl" ;
39 my $voucherout = "${General::swroot}/captive/voucher_out" ;
40 my $clients = "${General::swroot}/captive/clients" ;
41 my $settingsfile = "${General::swroot}/captive/settings" ;
44 my $url = param
( 'redirect' );
46 #Create /var/ipfire/captive/clients if not exist
47 unless (- f
$clients ){ system ( "touch $clients " ); }
50 & getcgihash
( \
%cgiparams );
53 & General
:: readhash
( " $settingsfile " , \
%settings ) if (- f
$settingsfile );
56 if ( $cgiparams { 'ACTION' } eq " $Lang ::tr{'gpl i accept these terms and conditions'}" ){
57 my $key = & General
:: findhasharraykey
( \
%clientshash );
59 #Get Clients IP-Address
60 my $ip_address = $ENV { X_FORWARDED_FOR
} || $ENV { REMOTE_ADDR
} || "" ;
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// ;
66 & General
:: readhasharray
( " $clients " , \
%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 );
120 system ( "/usr/local/bin/captivectrl" );
126 print "Status: 302 Moved Temporarily \n " ;
127 print "Location: $url \n " ;
128 print "Connection: close \n " ;
133 #Open HTML Page, load header and css
140 if ( $settings { 'AUTH' } eq 'VOUCHER' ){
149 print "<div id='title'><br> $errormessage <br></diV>" ;
155 Content-type: text/html \n\n
158 <meta charset="utf-8">
159 <title> $settings {'TITLE'}</title>
160 <link href="../assets/captive.css" type="text/css" rel="stylesheet">
171 <h1> $settings {'TITLE'}
175 <textarea style="width:100%;" rows='40'>
182 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
183 <br><input type='hidden' name='redirect' value =' $url '><input type='submit' name='ACTION' value=" $Lang ::tr{'gpl i accept these terms and conditions'}"/>
207 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
212 <b> $Lang ::tr{'Captive voucher'}</b> <input type='text' maxlength="8" size='10' style="font-size: 24px;font-weight: bold;" name='VOUCHER'>
215 <input type='submit' name='ACTION' value=" $Lang ::tr{'Captive activate'}"/>
223 <textarea style="width:100%;" rows='40'>
238 my ( $hash , $params ) = @_ ;
239 my $cgi = CGI
-> new ();
240 $hash ->{ '__CGI__' } = $cgi ;
241 return if ( $ENV { 'REQUEST_METHOD' } ne 'POST' );
242 if (! $params ->{ 'wantfile' }) {
243 $CGI :: DISABLE_UPLOADS
= 1 ;
244 $CGI :: POST_MAX
= 1024 * 1024 ;
246 $CGI :: POST_MAX
= 10 * 1024 * 1024 ;
248 $cgi -> referer () =~ m/^http?\:\/ \
/([^\/ ]+)/;
250 $cgi -> url () =~ m/^http?\:\/ \
/([^\/ ]+)/;
252 return if ( $referer ne $servername );
254 ### Modified for getting multi-vars, split by |
255 my %temp = $cgi -> Vars ();
256 foreach my $key ( keys %temp ) {
257 $hash ->{ $key } = $temp { $key };
258 $hash ->{ $key } =~ s/\0/|/g ;
259 $hash ->{ $key } =~ s/^\s*(.*?)\s*$/$1/ ;
262 if (( $params ->{ 'wantfile' })&&( $params ->{ 'filevar' })) {
263 $hash ->{ $params ->{ 'filevar' }} = $cgi -> upload
264 ( $params ->{ 'filevar' });
270 open ( my $handle , "<:utf8" , "/var/ipfire/captive/agb.txt" ) or die ( "$!" );
272 $_ = HTML
:: Entities
:: decode_entities
( $_ );