X-Git-Url: http://git.ipfire.org/?p=ipfire-2.x.git;a=blobdiff_plain;f=html%2Fcgi-bin%2Fcaptive.cgi;h=54ea54ffaf7bf1758b36c5556b1843f3169b944d;hp=b6175673e1be427eeb14d7fe6b0c1b79cfe34763;hb=ebfb8996930ec1e3b4f7d09208d2ab60a8f30603;hpb=827d3f61da96ebc8881f3fbf283fd67c8bad6809 diff --git a/html/cgi-bin/captive.cgi b/html/cgi-bin/captive.cgi index b6175673e1..54ea54ffaf 100755 --- a/html/cgi-bin/captive.cgi +++ b/html/cgi-bin/captive.cgi @@ -31,9 +31,13 @@ require '/var/ipfire/general-functions.pl'; require "${General::swroot}/lang.pl"; require "${General::swroot}/header.pl"; +my %selected = (); + my $coupons = "${General::swroot}/captive/coupons"; my %couponhash = (); +my $logo = "${General::swroot}/captive/logo.dat"; + my %settings=(); my %mainsettings; my %color; @@ -44,7 +48,6 @@ my $errormessage=''; my $clients="${General::swroot}/captive/clients"; my %clientshash=(); my $settingsfile="${General::swroot}/captive/settings"; -my $logopath = "/srv/web/ipfire/html/captive/logo"; unless (-e $settingsfile) { system("touch $settingsfile"); } &Header::getcgihash(\%cgiparams); @@ -56,15 +59,15 @@ unless (-e $settingsfile) { system("touch $settingsfile"); } &Header::showhttpheaders(); -#actions -if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}"){ - my $file = $cgiparams{'uploaded_file'}; - if ($file){ - #Check if extension is png +if ($cgiparams{'ACTION'} eq $Lang::tr{'save'}) { + my $file = $cgiparams{'logo'}; + if ($file) { + # Check if the file extension is PNG/JPEG chomp $file; + my ($name, $path, $ext) = fileparse($file, qr/\.[^.]*$/); - if ($ext ne ".png"){ - $errormessage=$Lang::tr{'Captive wrong ext'}; + if ($ext ne ".png" && $ext ne ".jpg" && $ext ne ".jpeg") { + $errormessage = $Lang::tr{'Captive wrong ext'}; } } @@ -72,43 +75,33 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}"){ $settings{'ENABLE_BLUE'} = $cgiparams{'ENABLE_BLUE'}; $settings{'AUTH'} = $cgiparams{'AUTH'}; $settings{'TITLE'} = $cgiparams{'TITLE'}; - $settings{'UNLIMITED'} = $cgiparams{'UNLIMITED'}; $settings{'COLOR'} = $cgiparams{'COLOR'}; + $settings{'SESSION_TIME'} = $cgiparams{'SESSION_TIME'}; if (!$errormessage){ #Check if we need to upload a new logo - if($file){ - #Save File - my ($filehandle) = CGI::upload('uploaded_file'); - open (UPLOADFILE, ">$logopath/logo.png"); + if ($file) { + # Save logo + my ($filehandle) = CGI::upload("logo"); + + # XXX check filesize + + open(FILE, ">$logo"); binmode $filehandle; - while ( <$filehandle> ) { - print UPLOADFILE; - } - close (UPLOADFILE); - - #Open file to check if dimensions are within rang - open (PNG , "<$logopath/logo.png"); - local $/; - my $PNG1=; - close(PNG); - my ($width,$height)=&pngsize($PNG1); - if($width > 1920 || $height > 800 || $width < 1280 || $height < 400){ - $errormessage.="$Lang::tr{'Captive invalid logosize'}
Filedimensions width: $width height: $height "; - unlink("$logopath/logo.png"); + while (<$filehandle>) { + print FILE; } + close(FILE); } &General::writehash("$settingsfile", \%settings); # Save terms - if ($cgiparams{'TERMS'}){ - $cgiparams{'TERMS'} = &Header::escape($cgiparams{'TERMS'}); - open(FH, ">:utf8", "/var/ipfire/captive/terms.txt") or die("$!"); - print FH $cgiparams{'TERMS'}; - close(FH); - $cgiparams{'TERMS'} = ""; - } + $cgiparams{'TERMS'} = &Header::escape($cgiparams{'TERMS'}); + open(FH, ">:utf8", "/var/ipfire/captive/terms.txt") or die("$!"); + print FH $cgiparams{'TERMS'}; + close(FH); + $cgiparams{'TERMS'} = ""; #execute binary to reload firewall rules system("/usr/local/bin/captivectrl"); @@ -119,29 +112,10 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}"){ } } -if ($cgiparams{'ACTION'} eq "$Lang::tr{'Captive generate coupon'}"){ - # Generates a new coupon - - #calculate expiredate - my $expire; - if ($settings{'UNLIMITED'} eq 'on'){ - $expire = $Lang::tr{'Captive nolimit'}; - }else{ - $settings{'EXPIRE'} = $cgiparams{'EXP_HOUR'}+$cgiparams{'EXP_DAY'}+$cgiparams{'EXP_WEEK'}+$cgiparams{'EXP_MONTH'}; - $expire = sub{sprintf '%02d.%02d.%04d %02d:%02d', $_[3], $_[4]+1, $_[5]+1900, $_[2], $_[1] }->(localtime(time()+$settings{'EXPIRE'})); - } - - #Check Expiretime - if($cgiparams{'EXP_HOUR'}+$cgiparams{'EXP_DAY'}+$cgiparams{'EXP_WEEK'}+$cgiparams{'EXP_MONTH'} == 0 && $cgiparams{'UNLIMITED'} == ''){ - $errormessage=$Lang::tr{'Captive noexpiretime'}; - } - #check if we already have a coupon with same code - &General::readhasharray($coupons, \%couponhash) if (-e $coupons); - foreach my $key (keys %couponhash) { - if($couponhash{$key}[1] eq $cgiparams{'CODE'}){ - $errormessage=$Lang::tr{'Captive err doublevoucher'}; - last; - } +if ($cgiparams{'ACTION'} eq "$Lang::tr{'Captive generate coupon'}") { + # Check expiry time + if ($cgiparams{'EXP_HOUR'} + $cgiparams{'EXP_DAY'} + $cgiparams{'EXP_WEEK'} + $cgiparams{'EXP_MONTH'} == 0 && $cgiparams{'UNLIMITED'} == '') { + $errormessage = $Lang::tr{'Captive noexpiretime'}; } #check valid remark @@ -149,28 +123,57 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'Captive generate coupon'}"){ $errormessage=$Lang::tr{'fwhost err remark'}; } - #if no error detected, write to disk - if (!$errormessage){ - my $date=time(); #seconds in utc - - #first get new key from hash - my $key=&General::findhasharraykey (\%couponhash); - #initialize all fields with '' - foreach my $i (0 .. 3) { $couponhash{$key}[$i] = "";} - #define fields - $couponhash{$key}[0] = $date; - $couponhash{$key}[1] = $cgiparams{'CODE'}; - $couponhash{$key}[2] = $settings{'EXPIRE'}; - $couponhash{$key}[3] = $cgiparams{'REMARK'}; - #write values to disk - &General::writehasharray($coupons, \%couponhash); + if (!$errormessage) { + # Remember selected values + foreach my $val (("UNLIMITED", "EXP_HOUR", "EXP_DAY", "EXP_WEEK", "EXP_MONTH")) { + $settings{$val} = $cgiparams{$val}; + } + &General::writehash($settingsfile, \%settings); + + &General::readhasharray($coupons, \%couponhash) if (-e $coupons); + my $now = time(); + + # Calculate expiry time in seconds + my $expires = 0; + + if ($settings{'UNLIMITED'} ne 'on') { + $expires += $settings{'EXP_HOUR'}; + $expires += $settings{'EXP_DAY'}; + $expires += $settings{'EXP_WEEK'}; + $expires += $settings{'EXP_MONTH'}; + } + + my $count = $cgiparams{'COUNT'} || 1; + while($count-- > 0) { + # Generate a new code + my $code = &gencode(); + + # Check if the coupon code already exists + foreach my $key (keys %couponhash) { + if($couponhash{$key}[1] eq $code) { + # Code already exists, so try again + $code = ""; + $count++; + last; + } + } + + next if ($code eq ""); - #now prepare log entry, get expiring date for voucher and decode remark for logfile - my $expdate=localtime(time()+$couponhash{$key}[3]); - my $rem=HTML::Entities::decode_entities($couponhash{$key}[4]); + # Get a new key from hash + my $key = &General::findhasharraykey(\%couponhash); - #write logfile entry - &General::log("Captive", "Generated new coupon $couponhash{$key}[1] $couponhash{$key}[2] hours valid expires on $expdate remark $rem"); + # Initialize all fields + foreach my $i (0 .. 3) { $couponhash{$key}[$i] = ""; } + + $couponhash{$key}[0] = $now; + $couponhash{$key}[1] = $code; + $couponhash{$key}[2] = $expires; + $couponhash{$key}[3] = $cgiparams{'REMARK'}; + } + + # Save everything to disk + &General::writehasharray($coupons, \%couponhash); } } @@ -219,151 +222,168 @@ if ($cgiparams{'ACTION'} eq 'delete-client') { &Header::openpage($Lang::tr{'Captive menu'}, 1, ''); &Header::openbigbox(); -#call error() to see if we have to print an errormessage on website -&error(); - -#call config() to display the configuration box -&config(); - -sub getterms(){ - my @ret; - - open(FILE, "<:utf8", "/var/ipfire/captive/terms.txt"); - while() { - push(@ret, HTML::Entities::decode_entities($_)); - } - close(FILE); - - return join(/\n/, @ret); +# If an error message exists, show a box with the error message +if ($errormessage) { + &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); + print $errormessage; + &Header::closebox(); } -sub config(){ - #prints the config box on the website - &Header::openbox('100%', 'left', $Lang::tr{'Captive config'}); - print <\n +# Prints the config box on the website +&Header::openbox('100%', 'left', $Lang::tr{'Captive config'}); +print <\n END ; - #check which parameters have to be enabled (from settings file) - $checked{'ENABLE_GREEN'}{'off'} = ''; - $checked{'ENABLE_GREEN'}{'on'} = ''; - $checked{'ENABLE_GREEN'}{$settings{'ENABLE_GREEN'}} = "checked='checked'"; - $checked{'ENABLE_BLUE'}{'off'} = ''; - $checked{'ENABLE_BLUE'}{'on'} = ''; - $checked{'ENABLE_BLUE'}{$settings{'ENABLE_BLUE'}} = "checked='checked'"; +#check which parameters have to be enabled (from settings file) +$checked{'ENABLE_GREEN'}{'off'} = ''; +$checked{'ENABLE_GREEN'}{'on'} = ''; +$checked{'ENABLE_GREEN'}{$settings{'ENABLE_GREEN'}} = "checked='checked'"; - $checked{'UNLIMITED'}{'off'} = ''; - $checked{'UNLIMITED'}{'on'} = ''; - $checked{'UNLIMITED'}{$settings{'UNLIMITED'}} = "checked='checked'"; +$checked{'ENABLE_BLUE'}{'off'} = ''; +$checked{'ENABLE_BLUE'}{'on'} = ''; +$checked{'ENABLE_BLUE'}{$settings{'ENABLE_BLUE'}} = "checked='checked'"; - if ($netsettings{'GREEN_DEV'}){ - print ""; - } - if ($netsettings{'BLUE_DEV'}){ - print ""; - } +$checked{'UNLIMITED'}{'off'} = ''; +$checked{'UNLIMITED'}{'on'} = ''; +$checked{'UNLIMITED'}{$settings{'UNLIMITED'}} = "checked='checked'"; - print< - - - - -END -; +$selected{'AUTH'} = (); +$selected{'AUTH'}{'COUPON'} = ""; +$selected{'AUTH'}{'TERMS'} = ""; +$selected{'AUTH'}{$settings{'AUTH'}} = "selected"; + +if ($netsettings{'GREEN_DEV'}){ + print ""; +} +if ($netsettings{'BLUE_DEV'}){ + print ""; +} print< - - + + + + END ; - print ""; - - print ""; - print< - - -END -; - if ($settings{'AUTH'} eq 'TERMS') { - my $terms = &getterms(); - print < - - - -END - } +if ($settings{'AUTH'} eq 'TERMS') { + $selected{'SESSION_TIME'} = (); + $selected{'SESSION_TIME'}{'0'} = ""; + $selected{'SESSION_TIME'}{'3600'} = ""; + $selected{'SESSION_TIME'}{'28800'} = ""; + $selected{'SESSION_TIME'}{'86400'} = ""; + $selected{'SESSION_TIME'}{'604800'} = ""; + $selected{'SESSION_TIME'}{'18144000'} = ""; + $selected{'SESSION_TIME'}{$settings{'SESSION_TIME'}} = "selected"; - #Logo Upload print < + - END +} - #Show Logo in webinterface with 1/2 size if set - if (-f "$logopath/logo.png"){ - print""; - print""; - }else{ - print""; - print""; - } +print< + + + + + + + + + + + + + + +END -print< - - + + +END +} - - - - -
$Lang::tr{'Captive active on'} Green
$Lang::tr{'Captive active on'} Blue
- $Lang::tr{'Captive title'} - - -
$Lang::tr{'Captive active on'} Green
$Lang::tr{'Captive active on'} Blue
- $Lang::tr{'Captive authentication'} - -
+ $Lang::tr{'Captive authentication'} + + +
- -
$Lang::tr{'Captive client session expiry time'} - $Lang::tr{'Captive logo_upload'} -
- $Lang::tr{'Captive logo_upload1'} -
- +
$Lang::tr{'Captive logo_set'}$logopath/logo.png
$Lang::tr{'Captive logo_set'}
$Lang::tr{'no'}
+
+ $Lang::tr{'Captive branding'} +
+ $Lang::tr{'Captive title'} + + +
$Lang::tr{'Captive brand color'} + +
+ $Lang::tr{'Captive upload logo'} + + +
$Lang::tr{'Captive upload logo recommendations'} +
$Lang::tr{'Captive brand color'} - - $Lang::tr{'Captive logo uploaded'}$Lang::tr{'yes'}
- -
- +my $terms = &getterms(); +print < + $Lang::tr{'Captive terms'} + + + + + + + + + + + END -; - &Header::closebox(); - #if settings is set to use coupons, the coupon part has to be displayed - if ($settings{'AUTH'} eq 'COUPON'){ - &coupons(); - }else{ - #otherwise we show the licensepart - &show_license_connections(); +&Header::closebox(); + +#if settings is set to use coupons, the coupon part has to be displayed +if ($settings{'AUTH'} eq 'COUPON') { + &coupons(); +} + +# Show active clients +&show_clients(); + +sub getterms() { + my @ret; + + open(FILE, "<:utf8", "/var/ipfire/captive/terms.txt"); + while() { + push(@ret, HTML::Entities::decode_entities($_)); } + close(FILE); + + return join(/\n/, @ret); } sub gencode(){ @@ -376,12 +396,23 @@ sub gencode(){ sub coupons() { &Header::openbox('100%', 'left', $Lang::tr{'Captive generate coupon'}); - print "
"; - print ""; - print " + +

$Lang::tr{'Captive vouchervalid'}

"; - - print ""; - print ""; + print < +
$Lang::tr{'hours'}$Lang::tr{'days'}$Lang::tr{'weeks'}$Lang::tr{'months'}
+ + + "; - print ""; - print "
+ $Lang::tr{'Captive vouchervalid'} + + + + + + + + + +END #print hour-dropdownbox my $hrs=3600; @@ -437,14 +468,47 @@ sub coupons() { print " selected='selected'" if ($settings{'EXP_MONTH'} eq $exp_sec); print ">$i"; } - print ""; - print ""; - print "
$Lang::tr{'hours'}$Lang::tr{'days'}$Lang::tr{'weeks'}$Lang::tr{'months'}
    $Lang::tr{'Captive nolimit'}
"; - print "

$Lang::tr{'remark'}

 


"; - $cgiparams{'CODE'} = &gencode(); - print "
"; + print < +
+ +
+ + + + $Lang::tr{'remark'} + + + + + + +
+ + + +
+ +END &Header::closebox(); @@ -452,134 +516,127 @@ sub coupons() { if (! -z $coupons) { &show_coupons(); } - - if (! -z $clients) { - &show_clients(); - } -} - -sub show_license_connections(){ - #if there are active clients, show the box with active connections - return if ( -z $clients || ! -f $clients ); - my $count=0; - my $col; - &Header::openbox('100%', 'left', $Lang::tr{'Captive voactive'}); -print< - - -END -; - #read all clients from hash and show table - &General::readhasharray($clients, \%clientshash) if (-e $clients); - foreach my $key (keys %clientshash){ - my $starttime = sub{sprintf '%02d.%02d.%04d %02d:%02d', $_[3], $_[4]+1, $_[5]+1900, $_[2], $_[1] }->(localtime($clientshash{$key}[2])); - my $endtime; - if ($clientshash{$key}[3] eq '0'){ - $endtime=$Lang::tr{'Captive nolimit'}; - }else{ - $endtime=sub{sprintf '%02d.%02d.%04d %02d:%02d', $_[3], $_[4]+1, $_[5]+1900, $_[2], $_[1] }->(localtime($clientshash{$key}[2]+$clientshash{$key}[3])); - } - - if ($count % 2){ - print" "; - $col="bgcolor='$color{'color20'}'"; - }else{ - $col="bgcolor='$color{'color22'}'"; - print" "; - } - print ""; - $count++; - } - - print "
$Lang::tr{'Captive coupon'}$Lang::tr{'Captive activated'}$Lang::tr{'Captive expire'}$Lang::tr{'Captive mac'}$Lang::tr{'delete'}
$clientshash{$key}[4]
$starttime "; - print "
$endtime "; - print "
$clientshash{$key}[0]
"; - &Header::closebox(); } sub show_coupons() { + &General::readhasharray($coupons, \%couponhash) if (-e $coupons); + #if there are already generated but unsused coupons, print a table - my $count=0; - my $col; - &Header::openbox('100%', 'left', $Lang::tr{'Captive vout'}); - print< - - + &Header::openbox('100%', 'left', $Lang::tr{'Captive issued coupons'}); + + print < + + + + + + END -; - &General::readhasharray($coupons, \%couponhash) if (-e $coupons); - foreach my $key (keys %couponhash) - { - my $starttime = sub{sprintf '%02d.%02d.%04d %02d:%02d', $_[3], $_[4]+1, $_[5]+1900, $_[2], $_[1] }->(localtime($couponhash{$key}[0])); - my $endtime; - if ($couponhash{$key}[2] eq '0'){ - $endtime=$Lang::tr{'Captive nolimit'}; - }else{ - $endtime=sub{sprintf '%02d.%02d.%04d %02d:%02d', $_[3], $_[4]+1, $_[5]+1900, $_[2], $_[1] }->(localtime(time()+$couponhash{$key}[2])); + + foreach my $key (keys %couponhash) { + my $expirytime = $Lang::tr{'Captive nolimit'}; + if ($couponhash{$key}[2] > 0) { + $expirytime = &General::format_time($couponhash{$key}[2]); } - if ($count % 2){ - print" "; + if ($count++ % 2) { $col="bgcolor='$color{'color20'}'"; - }else{ + } else { $col="bgcolor='$color{'color22'}'"; - print" "; } - print ""; - print ""; - print ""; - print ""; - print ""; - $count++; + print < + + + + + +END } print "
$Lang::tr{'Captive coupon'}$Lang::tr{'date'}$Lang::tr{'Captive expire'}$Lang::tr{'remark'}$Lang::tr{'delete'}
+ $Lang::tr{'Captive coupon'} + $Lang::tr{'Captive expiry time'}$Lang::tr{'remark'}$Lang::tr{'delete'}
$couponhash{$key}[1]
$starttime
$endtime
$couponhash{$key}[3]
+ $couponhash{$key}[1] + + $expirytime + + $couponhash{$key}[3] + +
+ + + +
+
"; + &Header::closebox(); } sub show_clients() { - #if there are active clients which use coupons show table + # if there are active clients which use coupons show table return if ( -z $clients || ! -f $clients ); + my $count=0; my $col; - &Header::openbox('100%', 'left', $Lang::tr{'Captive voactive'}); -print< - - + + &Header::openbox('100%', 'left', $Lang::tr{'Captive clients'}); + + print < + + + + + + + + END -; + &General::readhasharray($clients, \%clientshash) if (-e $clients); - foreach my $key (keys %clientshash) - { + foreach my $key (keys %clientshash) { #calculate time from clientshash (starttime) my $starttime = sub{sprintf '%02d.%02d.%04d %02d:%02d', $_[3], $_[4]+1, $_[5]+1900, $_[2], $_[1] }->(localtime($clientshash{$key}[2])); + #calculate endtime from clientshash my $endtime; if ($clientshash{$key}[3] eq '0'){ $endtime=$Lang::tr{'Captive nolimit'}; - }else{ + } else { $endtime = sub{sprintf '%02d.%02d.%04d %02d:%02d', $_[3], $_[4]+1, $_[5]+1900, $_[2], $_[1] }->(localtime($clientshash{$key}[2]+$clientshash{$key}[3])); } - if ($count % 2){ - print" "; - $col="bgcolor='$color{'color20'}'"; - }else{ - $col="bgcolor='$color{'color22'}'"; - print" "; - } + if ($count++ % 2) { + $col="bgcolor='$color{'color20'}'"; + } else { + $col="bgcolor='$color{'color22'}'"; + } + + my $coupon = ($clientshash{$key}[4] eq "LICENSE") ? $Lang::tr{'Captive terms short'} : $clientshash{$key}[4]; - print ""; - $count++; + print < + + + + + + + +END } print "
$Lang::tr{'Captive coupon'}$Lang::tr{'Captive activated'}$Lang::tr{'Captive expire'}$Lang::tr{'Captive mac'}$Lang::tr{'remark'}$Lang::tr{'delete'}
$Lang::tr{'Captive coupon'}$Lang::tr{'Captive activated'}$Lang::tr{'Captive expiry time'}$Lang::tr{'Captive mac'}$Lang::tr{'remark'}$Lang::tr{'delete'}
$clientshash{$key}[4]
$starttime "; - print "
$endtime
$clientshash{$key}[0]
$clientshash{$key}[5]
"; - print "
$coupon$starttime$endtime$clientshash{$key}[0]$clientshash{$key}[5] +
+ + + +
+
"; + &Header::closebox(); } @@ -603,29 +660,5 @@ sub validremark return 1; } -sub pngsize { - my $Buffer = shift; - my ($width,$height) = ( undef, undef ); - - if ($Buffer =~ /IHDR(.{8})/) { - my $PNG = $1; - ($width,$height) = unpack( "NN", $PNG ); - } else { - $width="invalid"; - $height= "invalid"; - }; - return ($width,$height); -} - -sub error{ - #if an errormessage exits, show a box with errormessage - if ($errormessage) { - &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); - print "$errormessage\n"; - print " \n"; - &Header::closebox(); - } -} - &Header::closebigbox(); &Header::closepage();