]>
git.ipfire.org Git - ipfire-2.x.git/blob - html/cgi-bin/captive.cgi
2 ###############################################################################
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2016 IPFire Team <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 ###############################################################################
26 # enable only the following on debugging purpose
28 #use CGI::Carp 'fatalsToBrowser';
30 require '/var/ipfire/general-functions.pl' ;
31 require "${General::swroot}/lang.pl" ;
32 require "${General::swroot}/header.pl" ;
36 my $coupons = "${General::swroot}/captive/coupons" ;
39 my $logo = "${General::swroot}/captive/logo.dat" ;
48 my $clients = "${General::swroot}/captive/clients" ;
50 my $settingsfile = "${General::swroot}/captive/settings" ;
51 unless (- e
$settingsfile ) { system ( "touch $settingsfile " ); }
53 & Header
:: getcgihash
( \
%cgiparams );
55 & General
:: readhash
( "${General::swroot}/main/settings" , \
%mainsettings );
56 & General
:: readhash
( "/srv/web/ipfire/html/themes/" . $mainsettings { 'THEME' }. "/include/colors.txt" , \
%color );
57 & General
:: readhash
( " $settingsfile " , \
%settings ) if (- f
$settingsfile );
58 & General
:: readhash
( "${General::swroot}/ethernet/settings" , \
%netsettings );
60 & Header
:: showhttpheaders
();
63 if ( $cgiparams { 'ACTION' } eq " $Lang ::tr{'save'}" ){
64 my $file = $cgiparams { 'logo' };
66 #Check if extension is png
68 my ( $name , $path , $ext ) = fileparse
( $file , qr/\.[^.]*$/ );
70 $errormessage = $Lang :: tr
{ 'Captive wrong ext' };
74 $settings { 'ENABLE_GREEN' } = $cgiparams { 'ENABLE_GREEN' };
75 $settings { 'ENABLE_BLUE' } = $cgiparams { 'ENABLE_BLUE' };
76 $settings { 'AUTH' } = $cgiparams { 'AUTH' };
77 $settings { 'TITLE' } = $cgiparams { 'TITLE' };
78 $settings { 'UNLIMITED' } = $cgiparams { 'UNLIMITED' };
79 $settings { 'COLOR' } = $cgiparams { 'COLOR' };
80 $settings { 'SESSION_TIME' } = $cgiparams { 'SESSION_TIME' };
83 #Check if we need to upload a new logo
86 my ( $filehandle ) = CGI
:: upload
( "logo" );
92 while (< $filehandle >) {
98 & General
:: writehash
( " $settingsfile " , \
%settings );
101 if ( $cgiparams { 'TERMS' }){
102 $cgiparams { 'TERMS' } = & Header
:: escape
( $cgiparams { 'TERMS' });
103 open ( FH
, ">:utf8" , "/var/ipfire/captive/terms.txt" ) or die ( "$!" );
104 print FH
$cgiparams { 'TERMS' };
106 $cgiparams { 'TERMS' } = "" ;
109 #execute binary to reload firewall rules
110 system ( "/usr/local/bin/captivectrl" );
112 if ( $cgiparams { 'ENABLE_BLUE' } eq 'on' ){
113 system ( "/usr/local/bin/wirelessctrl" );
118 if ( $cgiparams { 'ACTION' } eq " $Lang ::tr{'Captive generate coupon'}" ){
119 # Generates a new coupon
121 #calculate expiredate
123 if ( $settings { 'UNLIMITED' } eq 'on' ){
124 $expire = $Lang :: tr
{ 'Captive nolimit' };
126 $settings { 'EXPIRE' } = $cgiparams { 'EXP_HOUR' }+ $cgiparams { 'EXP_DAY' }+ $cgiparams { 'EXP_WEEK' }+ $cgiparams { 'EXP_MONTH' };
127 $expire = sub { sprintf ' %02d . %02d . %04d %02d : %02d ' , $_ [ 3 ], $_ [ 4 ]+ 1 , $_ [ 5 ]+ 1900 , $_ [ 2 ], $_ [ 1 ] }->( localtime ( time ()+ $settings { 'EXPIRE' }));
131 if ( $cgiparams { 'EXP_HOUR' }+ $cgiparams { 'EXP_DAY' }+ $cgiparams { 'EXP_WEEK' }+ $cgiparams { 'EXP_MONTH' } == 0 && $cgiparams { 'UNLIMITED' } == '' ){
132 $errormessage = $Lang :: tr
{ 'Captive noexpiretime' };
134 #check if we already have a coupon with same code
135 & General
:: readhasharray
( $coupons , \
%couponhash ) if (- e
$coupons );
136 foreach my $key ( keys %couponhash ) {
137 if ( $couponhash { $key }[ 1 ] eq $cgiparams { 'CODE' }){
138 $errormessage = $Lang :: tr
{ 'Captive err doublevoucher' };
144 if ( $cgiparams { 'REMARK' } ne '' && !& validremark
( $cgiparams { 'REMARK' })){
145 $errormessage = $Lang :: tr
{ 'fwhost err remark' };
148 #if no error detected, write to disk
150 my $date = time (); #seconds in utc
152 #first get new key from hash
153 my $key =& General
:: findhasharraykey
( \
%couponhash );
154 #initialize all fields with ''
155 foreach my $i ( 0 .. 3 ) { $couponhash { $key }[ $i ] = "" ;}
157 $couponhash { $key }[ 0 ] = $date ;
158 $couponhash { $key }[ 1 ] = $cgiparams { 'CODE' };
159 $couponhash { $key }[ 2 ] = $settings { 'EXPIRE' };
160 $couponhash { $key }[ 3 ] = $cgiparams { 'REMARK' };
161 #write values to disk
162 & General
:: writehasharray
( $coupons , \
%couponhash );
164 #now prepare log entry, get expiring date for voucher and decode remark for logfile
165 my $expdate = localtime ( time ()+ $couponhash { $key }[ 3 ]);
166 my $rem = HTML
:: Entities
:: decode_entities
( $couponhash { $key }[ 4 ]);
169 & General
:: log ( "Captive" , "Generated new coupon $couponhash { $key }[1] $couponhash { $key }[2] hours valid expires on $expdate remark $rem " );
173 if ( $cgiparams { 'ACTION' } eq 'delete-coupon' ) {
174 #deletes an already generated but unused voucher
176 #read all generated vouchers
177 & General
:: readhasharray
( $coupons , \
%couponhash ) if (- e
$coupons );
178 foreach my $key ( keys %couponhash ) {
179 if ( $cgiparams { 'key' } eq $couponhash { $key }[ 0 ]){
180 #write logenty with decoded remark
181 my $rem = HTML
:: Entities
:: decode_entities
( $couponhash { $key }[ 4 ]);
182 & General
:: log ( "Captive" , "Delete unused coupon $couponhash { $key }[1] $couponhash { $key }[2] hours valid expires on $couponhash { $key }[3] remark $rem " );
183 #delete line from hash
184 delete $couponhash { $key };
189 & General
:: writehasharray
( $coupons , \
%couponhash );
192 if ( $cgiparams { 'ACTION' } eq 'delete-client' ) {
193 #delete voucher and connection in use
195 #read all active clients
196 & General
:: readhasharray
( $clients , \
%clientshash ) if (- e
$clients );
197 foreach my $key ( keys %clientshash ) {
198 if ( $cgiparams { 'key' } eq $clientshash { $key }[ 0 ]){
199 #prepare log entry with decoded remark
200 my $rem = HTML
:: Entities
:: decode_entities
( $clientshash { $key }[ 7 ]);
202 & General
:: log ( "Captive" , "Deleted client in use $clientshash { $key }[1] $clientshash { $key }[2] hours valid expires on $clientshash { $key }[3] remark $rem - Connection will be terminated" );
203 #delete line from hash
204 delete $clientshash { $key };
209 & General
:: writehasharray
( " $clients " , \
%clientshash );
210 #reload firewallrules to kill connection of client
211 system ( "/usr/local/bin/captivectrl" );
214 #open webpage, print header and open box
215 & Header
:: openpage
( $Lang :: tr
{ 'Captive menu' }, 1 , '' );
216 & Header
:: openbigbox
();
218 #call error() to see if we have to print an errormessage on website
221 #call config() to display the configuration box
227 open ( FILE
, "<:utf8" , "/var/ipfire/captive/terms.txt" );
229 push ( @ret , HTML
:: Entities
:: decode_entities
( $_ ));
233 return join ( /\n/ , @ret );
237 #prints the config box on the website
238 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'Captive config' });
240 <form method='post' action=' $ENV {'SCRIPT_NAME'}' enctype="multipart/form-data"> \n
241 <table width='100%' border="0">
245 #check which parameters have to be enabled (from settings file)
246 $checked { 'ENABLE_GREEN' }{ 'off' } = '' ;
247 $checked { 'ENABLE_GREEN' }{ 'on' } = '' ;
248 $checked { 'ENABLE_GREEN' }{ $settings { 'ENABLE_GREEN' }} = "checked='checked'" ;
250 $checked { 'ENABLE_BLUE' }{ 'off' } = '' ;
251 $checked { 'ENABLE_BLUE' }{ 'on' } = '' ;
252 $checked { 'ENABLE_BLUE' }{ $settings { 'ENABLE_BLUE' }} = "checked='checked'" ;
254 $checked { 'UNLIMITED' }{ 'off' } = '' ;
255 $checked { 'UNLIMITED' }{ 'on' } = '' ;
256 $checked { 'UNLIMITED' }{ $settings { 'UNLIMITED' }} = "checked='checked'" ;
258 if ( $netsettings { 'GREEN_DEV' }){
259 print "<td width='30%'> $Lang ::tr{'Captive active on'} <font color='$Header::colourgreen'>Green</font></td><td><input type='checkbox' name='ENABLE_GREEN' $checked{'ENABLE_GREEN'}{'on'} /></td></tr>" ;
261 if ( $netsettings { 'BLUE_DEV' }){
262 print "<td width='30%'> $Lang ::tr{'Captive active on'} <font color='$Header::colourblue'>Blue</font></td><td><input type='checkbox' name='ENABLE_BLUE' $checked{'ENABLE_BLUE'}{'on'} /></td></tr>" ;
269 $Lang ::tr{'Captive authentication'}
275 print "<option value='TERMS' " ;
276 print " selected='selected'" if ( $settings { 'AUTH' } eq 'TERMS' );
277 print "> $Lang ::tr{'Captive terms'}</option>" ;
279 print "<option value='COUPON' " ;
280 print " selected='selected'" if ( $settings { 'AUTH' } eq 'COUPON' );
281 print "> $Lang ::tr{'Captive coupon'}</option>" ;
289 if ( $settings { 'AUTH' } eq 'TERMS' ) {
290 $selected { 'SESSION_TIME' } = ();
291 $selected { 'SESSION_TIME' }{ '0' } = "" ;
292 $selected { 'SESSION_TIME' }{ '3600' } = "" ;
293 $selected { 'SESSION_TIME' }{ '86400' } = "" ;
294 $selected { 'SESSION_TIME' }{ '604800' } = "" ;
295 $selected { 'SESSION_TIME' }{ '18144000' } = "" ;
296 $selected { 'SESSION_TIME' }{ $settings { 'SESSION_TIME' }} = "selected" ;
298 my $terms = & getterms
();
303 <textarea cols="50" rows="10" name="TERMS"> $terms </textarea>
308 <td> $Lang ::tr{'Captive client session expiry time'}</td>
310 <select name="SESSION_TIME">
311 <option value="0" $selected {'SESSION_TIME'}{'0'}>- $Lang ::tr{'unlimited'} -</option>
312 <option value="3600" $selected {'SESSION_TIME'}{'3600'}> $Lang ::tr{'one hour'}</option>
313 <option value="86400" $selected {'SESSION_TIME'}{'86400'}> $Lang ::tr{'24 hours'}</option>
314 <option value="604800" $selected {'SESSION_TIME'}{'604800'}> $Lang ::tr{'one week'}</option>
315 <option value="18144000" $selected {'SESSION_TIME'}{'18144000'}> $Lang ::tr{'one month'}</option>
326 <strong> $Lang ::tr{'Captive branding'}</strong>
331 $Lang ::tr{'Captive title'}
334 <input type='text' name='TITLE' value=" $settings {'TITLE'}" size='40'>
338 <td> $Lang ::tr{'Captive brand color'}</td>
340 <input type="color" name="COLOR" value=" $settings {'COLOR'}">
349 $Lang ::tr{'Captive logo_upload'}
351 $Lang ::tr{'Captive logo_upload1'}
354 <input type="file" name="logo">
362 <td> $Lang ::tr{'Captive logo uploaded'}</td>
363 <td> $Lang ::tr{'yes'}</td>
372 <input type='submit' name='ACTION' value=" $Lang ::tr{'save'}"/>
380 #if settings is set to use coupons, the coupon part has to be displayed
381 if ( $settings { 'AUTH' } eq 'COUPON' ){
384 #otherwise we show the licensepart
385 & show_license_connections
();
390 #generate a random code only letters from A-Z except 'O' and 0-9
391 my @chars = ( "A" .. "N" , "P" .. "Z" , "0" .. "9" );
393 $randomstring .= $chars [ rand @chars ] for 1 . .8 ;
394 return $randomstring ;
398 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'Captive generate coupon' });
399 print "<form method='post' action=' $ENV {'SCRIPT_NAME'}'>" ;
400 print "<table border='0' width='100%'>" ;
401 print "<tr><td width='30%'><br> $Lang ::tr{'Captive vouchervalid'}</td><td width='70%'><br>" ;
403 print "<table class='tbl' border='0' width='100%'>" ;
404 print "<th> $Lang ::tr{'hours'}</th><th> $Lang ::tr{'days'}</th><th> $Lang ::tr{'weeks'}</th><th> $Lang ::tr{'months'}</th><th></th><th></th>" ;
406 #print hour-dropdownbox
408 print "<tr height='40px'><td><select name='EXP_HOUR' style='width:8em;'>" ;
409 print "<option value='0' " ;
410 print " selected='selected'" if ( $settings { 'EXP_HOUR' } eq '0' );
411 print ">--</option>" ;
412 for ( my $i = 1 ; $i < 25 ; $i ++){
413 my $exp_sec = $i * $hrs ;
414 print "<option value=' $exp_sec ' " ;
415 print " selected='selected'" if ( $settings { 'EXP_HOUR' } eq $exp_sec );
416 print "> $i </option>" ;
420 #print day-dropdownbox
422 print "<select name='EXP_DAY' style='width:8em;'>" ;
423 print "<option value='0' " ;
424 print " selected='selected'" if ( $settings { 'EXP_DAY' } eq '0' );
425 print ">--</option>" ;
426 for ( my $i = 1 ; $i < 8 ; $i ++){
427 my $exp_sec = $i * $days ;
428 print "<option value=' $exp_sec ' " ;
429 print " selected='selected'" if ( $settings { 'EXP_DAY' } eq $exp_sec );
430 print "> $i </option>" ;
434 #print week-dropdownbox
436 print "<select name='EXP_WEEK' style='width:8em;'>" ;
437 print "<option value='0' " ;
438 print " selected='selected'" if ( $settings { 'EXP_WEEK' } eq '0' );
439 print ">--</option>" ;
440 for ( my $i = 1 ; $i < 5 ; $i ++){
441 my $exp_sec = $i * $week ;
442 print "<option value=' $exp_sec ' " ;
443 print " selected='selected'" if ( $settings { 'EXP_WEEK' } eq $exp_sec );
444 print "> $i </option>" ;
448 #print month-dropdownbox
449 my $month = 3600 * 24 * 30 ;
450 print "<select name='EXP_MONTH' style='width:8em;'>" ;
451 print "<option value='0' " ;
452 print " selected='selected'" if ( $settings { 'EXP_MONTH' } eq '0' );
453 print ">--</option>" ;
454 for ( my $i = 1 ; $i < 13 ; $i ++){
455 my $exp_sec = $i * $month ;
456 print "<option value=' $exp_sec ' " ;
457 print " selected='selected'" if ( $settings { 'EXP_MONTH' } eq $exp_sec );
458 print "> $i </option>" ;
461 print "<td> <input type='checkbox' name='UNLIMITED' $checked {'UNLIMITED'}{'on'} /></td><td> <b> $Lang ::tr{'Captive nolimit'}</b></td>" ;
462 print "</tr></table>" ;
464 print "<tr><td><br> $Lang ::tr{'remark'}</td><td><br><input type='text' style='width: 98%;' name='REMARK' align='left'></td></tr>" ;
465 print "<tr><td> </td><td></td></tr></table><br><br>" ;
466 $cgiparams { 'CODE' } = & gencode
();
467 print "<div align='right'><input type='submit' name='ACTION' value=' $Lang ::tr{'Captive generate coupon'}'><input type='hidden' name='CODE' value=' $cgiparams {'CODE'}'></form></div>" ;
471 # Show all coupons if exist
481 sub show_license_connections
(){
482 #if there are active clients, show the box with active connections
483 return if ( - z
$clients || ! - f
$clients );
486 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'Captive voactive' });
488 <center><table class='tbl'>
490 <th align='center' width='15%'> $Lang ::tr{'Captive coupon'}</th><th th align='center' width='15%'> $Lang ::tr{'Captive activated'}</th><th th align='center' width='15%'> $Lang ::tr{'Captive expire'}</th><th align='center' width='50%'><font size='1'> $Lang ::tr{'Captive mac'}</th><th th align='center' width='5%'> $Lang ::tr{'delete'}</th></tr>
493 #read all clients from hash and show table
494 & General
:: readhasharray
( $clients , \
%clientshash ) if (- e
$clients );
495 foreach my $key ( keys %clientshash ){
496 my $starttime = sub { sprintf ' %02d . %02d . %04d %02d : %02d ' , $_ [ 3 ], $_ [ 4 ]+ 1 , $_ [ 5 ]+ 1900 , $_ [ 2 ], $_ [ 1 ] }->( localtime ( $clientshash { $key }[ 2 ]));
498 if ( $clientshash { $key }[ 3 ] eq '0' ){
499 $endtime = $Lang :: tr
{ 'Captive nolimit' };
501 $endtime = sub { sprintf ' %02d . %02d . %04d %02d : %02d ' , $_ [ 3 ], $_ [ 4 ]+ 1 , $_ [ 5 ]+ 1900 , $_ [ 2 ], $_ [ 1 ] }->( localtime ( $clientshash { $key }[ 2 ]+ $clientshash { $key }[ 3 ]));
506 $col = "bgcolor=' $color {'color20'}'" ;
508 $col = "bgcolor=' $color {'color22'}'" ;
511 print "<td $col ><center> $clientshash { $key }[4]</td><td $col ><center> $starttime " ;
512 print "</center></td><td $col ><center> $endtime " ;
513 print "</td><td $col ><center> $clientshash { $key }[0]</td><td $col ><form method='post'><center><input type='image' src='/images/delete.gif' align='middle' alt=' $Lang ::tr{'delete'}' title=' $Lang ::tr{'delete'}' /><form method='post'><input type='hidden' name='ACTION' value='delete-client' /><input type='hidden' name='key' value=' $clientshash { $key }[0]' /></form></tr>" ;
522 #if there are already generated but unsused coupons, print a table
525 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'Captive vout' });
527 <center><table class='tbl' border='0'>
529 <th align='center' width='15%'> $Lang ::tr{'Captive coupon'}</th><th align='center' width='15%'> $Lang ::tr{'date'}</th><th th align='center' width='15%'> $Lang ::tr{'Captive expire'}</th><th align='center' width='60%'> $Lang ::tr{'remark'}</th><th align='center' width='5%'> $Lang ::tr{'delete'}</th></tr>
532 & General
:: readhasharray
( $coupons , \
%couponhash ) if (- e
$coupons );
533 foreach my $key ( keys %couponhash )
535 my $starttime = sub { sprintf ' %02d . %02d . %04d %02d : %02d ' , $_ [ 3 ], $_ [ 4 ]+ 1 , $_ [ 5 ]+ 1900 , $_ [ 2 ], $_ [ 1 ] }->( localtime ( $couponhash { $key }[ 0 ]));
537 if ( $couponhash { $key }[ 2 ] eq '0' ){
538 $endtime = $Lang :: tr
{ 'Captive nolimit' };
540 $endtime = sub { sprintf ' %02d . %02d . %04d %02d : %02d ' , $_ [ 3 ], $_ [ 4 ]+ 1 , $_ [ 5 ]+ 1900 , $_ [ 2 ], $_ [ 1 ] }->( localtime ( time ()+ $couponhash { $key }[ 2 ]));
545 $col = "bgcolor=' $color {'color20'}'" ;
547 $col = "bgcolor=' $color {'color22'}'" ;
551 print "<td $col ><center><b> $couponhash { $key }[1]</b></td>" ;
552 print "<td $col ><center> $starttime </td>" ;
553 print "<td $col ><center> $endtime </td>" ;
554 print "<td $col align='center'> $couponhash { $key }[3]</td>" ;
555 print "<td $col ><form method='post'><center><input type='image' src='/images/delete.gif' align='middle' alt=' $Lang ::tr{'delete'}' title=' $Lang ::tr{'delete'}' /><form method='post'><input type='hidden' name='ACTION' value='delete-coupon' /><input type='hidden' name='key' value=' $couponhash { $key }[0]' /></form></tr>" ;
564 #if there are active clients which use coupons show table
565 return if ( - z
$clients || ! - f
$clients );
568 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'Captive voactive' });
570 <center><table class='tbl' width='100%'>
572 <th align='center' width='15%'> $Lang ::tr{'Captive coupon'}</th><th th align='center' width='15%'> $Lang ::tr{'Captive activated'}</th><th align='center' width='15%'> $Lang ::tr{'Captive expire'}</th><th align='center' width='10%'> $Lang ::tr{'Captive mac'}</th><th align='center' width='43%'> $Lang ::tr{'remark'}</th><th th align='center' width='5%'> $Lang ::tr{'delete'}</th></tr>
575 & General
:: readhasharray
( $clients , \
%clientshash ) if (- e
$clients );
576 foreach my $key ( keys %clientshash )
578 #calculate time from clientshash (starttime)
579 my $starttime = sub { sprintf ' %02d . %02d . %04d %02d : %02d ' , $_ [ 3 ], $_ [ 4 ]+ 1 , $_ [ 5 ]+ 1900 , $_ [ 2 ], $_ [ 1 ] }->( localtime ( $clientshash { $key }[ 2 ]));
580 #calculate endtime from clientshash
582 if ( $clientshash { $key }[ 3 ] eq '0' ){
583 $endtime = $Lang :: tr
{ 'Captive nolimit' };
585 $endtime = sub { sprintf ' %02d . %02d . %04d %02d : %02d ' , $_ [ 3 ], $_ [ 4 ]+ 1 , $_ [ 5 ]+ 1900 , $_ [ 2 ], $_ [ 1 ] }->( localtime ( $clientshash { $key }[ 2 ]+ $clientshash { $key }[ 3 ]));
590 $col = "bgcolor=' $color {'color20'}'" ;
592 $col = "bgcolor=' $color {'color22'}'" ;
596 print "<td $col ><center><b> $clientshash { $key }[4]</b></td><td $col ><center> $starttime " ;
597 print "</center></td><td $col ><center> $endtime </center></td><td $col ><center> $clientshash { $key }[0]</td><td $col ><center> $clientshash { $key }[5]</center>" ;
598 print "</td><td $col ><form method='post'><center><input type='image' src='/images/delete.gif' align='middle' alt=' $Lang ::tr{'delete'}' title=' $Lang ::tr{'delete'}' /><form method='post'><input type='hidden' name='ACTION' value='delete-client' /><input type='hidden' name='key' value=' $clientshash { $key }[0]' /></form></tr>" ;
608 # Checks a hostname against RFC1035
610 # Each part should be at least two characters in length
611 # but no more than 63 characters
612 if ( length ( $remark ) < 1 || length ( $remark ) > 255 ) {
614 # Only valid characters are a-z, A-Z, 0-9 and -
615 if ( $remark !~ /^[a-zäöüA-ZÖÄÜ0-9-.:;\|_()\/ \s
]*$/) {
617 # First character can only be a letter or a digit
618 if ( substr ( $remark , 0 , 1 ) !~ /^[a-zäöüA-ZÖÄÜ0-9]*$/ ) {
620 # Last character can only be a letter or a digit
621 if ( substr ( $remark , - 1 , 1 ) !~ /^[a-zöäüA-ZÖÄÜ0-9.:;_)]*$/ ) {
628 my ( $width , $height ) = ( undef , undef );
630 if ( $Buffer =~ /IHDR(.{8})/ ) {
632 ( $width , $height ) = unpack ( "NN" , $PNG );
637 return ( $width , $height );
641 #if an errormessage exits, show a box with errormessage
643 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'error messages' });
644 print "<class name='base'> $errormessage \n " ;
645 print " </class> \n " ;
650 & Header
:: closebigbox
();
651 & Header
:: closepage
();