mirror of
				https://git.lapiole.org/dani/ansible-roles.git
				synced 2025-10-31 02:41:36 +01:00 
			
		
		
		
	Update to 2021-12-01 19:13
This commit is contained in:
		
							
								
								
									
										884
									
								
								roles/squid/files/URLblocked.cgi
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										884
									
								
								roles/squid/files/URLblocked.cgi
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,884 @@ | ||||
| #!/usr/bin/perl -wT | ||||
| # | ||||
| # URLblocked.cgi - explain to the user that the URL is blocked and by which rule set. | ||||
| # | ||||
| # Currently the error messages supports  | ||||
| # en (English),  | ||||
| # de (German),  | ||||
| # pl (Polish) | ||||
| # sv (Swedisk) | ||||
| # it (Italian) | ||||
| # pt (Portuguese) | ||||
| # fr (French) | ||||
| # tr (Turkish) | ||||
| # nl (Dutch). | ||||
| # You can add a language yourself: search for all occurences of "NEWLANGUAGE" | ||||
| # and add your language text. | ||||
|  | ||||
| use strict; | ||||
|  | ||||
| use Socket; | ||||
|  | ||||
| # This CGI script uses fastcgi and also requires Fcgid configured in Apache. | ||||
| # Comment out the next line and the line with "while (new CGI::Fast)" (approximately at line 423) | ||||
| # to revert this script to a regular CGI script. | ||||
| ### use CGI::Fast; | ||||
|  | ||||
| use constant { | ||||
|    CT_IMAGE  => 1, | ||||
|    CT_JAVA   => 2, | ||||
|    CT_HTML   => 3, | ||||
|    CT_XML    => 4, | ||||
|    CT_CSS    => 5, | ||||
|    CT_TEXT   => 6, | ||||
|    CT_JSON   => 7, | ||||
|    CT_STREAM => 8, | ||||
|    CT_204    => 9 | ||||
| }; | ||||
|  | ||||
| use vars qw( $admin $clientaddr $clientname $clientuser $clientgroup $category $targetgroup ); | ||||
| use vars qw( $color $size $mode $textcolor $bgcolor $titlesize $textsize $httpcode $url $origurl ); | ||||
| use vars qw( $ufdbhost $ufdbscripturi $ufdbredirscripturi $ufdbsni $ufdbservername $ufdbrequesturi $ufdbrefurl ); | ||||
| use vars qw( $escaped_ufdbrequesturi $escaped_url ); | ||||
| use vars qw( @day @month @languages $lang $protocol $address $port $path ); | ||||
|  | ||||
| local $admin; | ||||
| local $clientaddr; | ||||
| local $clientname; | ||||
| local $clientuser; | ||||
| local $clientgroup; | ||||
| local $targetgroup; | ||||
| local $color; | ||||
| local $size; | ||||
| local $mode; | ||||
| local $textcolor; | ||||
| local $bgcolor; | ||||
| local $titlesize; | ||||
| local $textsize; | ||||
| local $httpcode; | ||||
| local $url; | ||||
| local $origurl; | ||||
| local $ufdbhost; | ||||
| local $ufdbscripturi; | ||||
| local $ufdbredirscripturi; | ||||
| local $ufdbsni; | ||||
| local $ufdbservername; | ||||
| local $ufdbrequesturi; | ||||
| local $ufdbrefurl; | ||||
| local $lang; | ||||
| local $protocol; | ||||
| local $address; | ||||
| local $port; | ||||
| local $path; | ||||
| local @day = ("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"); | ||||
| local @month = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); | ||||
| local @languages = ( | ||||
| 		"de (German),", | ||||
| 		"nl (Dutch),", | ||||
| 		"pl (Polish),", | ||||
| 		"sv (Swedish),", | ||||
| 		"es (Spanish),", | ||||
| 		"it (Italian),", | ||||
| 		"pt (Portuguese),", | ||||
| 		"fr (French),", | ||||
| 		"tr (Turkish),", | ||||
| 		"NEW (NEWLANGUAGE),", | ||||
| 		"en (English),", | ||||
| 	       ); | ||||
|  | ||||
| my $html_comment = "<!--  | ||||
| generated by URLblocked.cgi :\n | ||||
| this is a very long comment to signal | ||||
| to MSIE and other browsers not to display their own 'user-friendly' | ||||
| error message, but to display the one that is produced by this | ||||
| program.\n | ||||
| The rest of this message is bogus to make it longer  | ||||
| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | ||||
| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | ||||
| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | ||||
| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | ||||
| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | ||||
| xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  -->\n"; | ||||
|  | ||||
| sub init(); | ||||
| sub session_reinit(); | ||||
| sub getPreferedLanguage(@); | ||||
| sub parseURL($); | ||||
| sub parseQuery($); | ||||
|  | ||||
|  | ||||
| sub session_reinit () | ||||
| { | ||||
|    $admin = 'unknown'; | ||||
|    $clientaddr = 'unknown'; | ||||
|    $clientname = 'unknown'; | ||||
|    $clientuser = 'unknown'; | ||||
|    $clientgroup = 'unknown'; | ||||
|    $targetgroup = 'unknown'; | ||||
|    $color = 'orange'; | ||||
|    $size = 'normal'; | ||||
|    $mode = 'default'; | ||||
|    $httpcode = '200'; | ||||
|    $url = 'unknown'; | ||||
|    $origurl = 'unknown'; | ||||
|    $lang = 'unknown'; | ||||
|    $ufdbrequesturi = ''; | ||||
| } | ||||
|  | ||||
|  | ||||
| sub init ()  | ||||
| { | ||||
|    $lang = getPreferedLanguage( @languages ); | ||||
|    ( $httpcode, $admin, $clientaddr, $clientname, $clientuser, $clientgroup, $category, $url )  = | ||||
|       parseQuery( $ENV{"QUERY_STRING"} ); | ||||
| } | ||||
|  | ||||
|  | ||||
| # | ||||
| # Find the first supported language of the client. | ||||
| # | ||||
| sub getPreferedLanguage (@)  | ||||
| { | ||||
|   my @supported = @_; | ||||
|   my @clientLanguages = split(/\s*,\s*/,$ENV{"HTTP_ACCEPT_LANGUAGE"}) if(defined($ENV{"HTTP_ACCEPT_LANGUAGE"})); | ||||
|   my $lang; | ||||
|   my $supp; | ||||
|  | ||||
|   ### NO!  push(@clientLanguages,$supported[0]); | ||||
|   for $lang (@clientLanguages)  | ||||
|   { | ||||
|     $lang =~ s/\s.*//; | ||||
|     $lang =~ s/-.*//; | ||||
|     for $supp (@supported)  | ||||
|     { | ||||
|       $supp =~ s/\s.*//; | ||||
|       return($lang) if ($lang eq $supp); | ||||
|     } | ||||
|   } | ||||
|   return 'en';   # default language is 'en' | ||||
| } | ||||
|  | ||||
|  | ||||
| sub parseQuery ($)  | ||||
| { | ||||
|   my $query       = shift; | ||||
|   my $admin       = 'The system administrator.'; | ||||
|   my $clientaddr  = ''; | ||||
|   my $clientname  = ''; | ||||
|   my $clientuser  = ''; | ||||
|   my $clientgroup = ''; | ||||
|   my $category    = ''; | ||||
|   my $httpcode    = '200'; | ||||
|   my $url         = 'undefined'; | ||||
|   my $therequest  = ''; | ||||
|   my $dummy; | ||||
|  | ||||
|   $ufdbservername = ''; | ||||
|   $ufdbhost = ''; | ||||
|   $ufdbrequesturi = ''; | ||||
|  | ||||
|   if (defined($query)) | ||||
|   { | ||||
|     while ($query =~ /^\&?([^\&=]+)=\"([^\"]*)\"(.*)/  ||  | ||||
|            $query =~ /^\&?([^\&=]+)=([^\&=]*)(.*)/) | ||||
|     { | ||||
|       my $key = $1; | ||||
|       my $value = $2; | ||||
|       $value = '??' unless(defined($value) && $value && $value ne '??'); | ||||
|       $query = $3; | ||||
|  | ||||
|       if ($key =~ /^(admin|clientaddr|clientname|clientuser|clientident|clientgroup|category|targetgroup|color|size|source|srcclass|targetclass|mode|httpcode|ufdbhost|ufdbscripturi|ufdbredirscripturi|ufdbsni|ufdbservername|ufdbrequesturi|ufdbrefurl|url)$/)  | ||||
|       { | ||||
| 	$escaped_ufdbrequesturi = $value  if ($key eq 'ufdbrequesturi'); | ||||
| 	$escaped_url = $value             if ($key eq 'url'); | ||||
|  | ||||
| 	$value =~ s/%20/ /g; | ||||
| 	$value =~ s/%22/"/g; | ||||
| 	$value =~ s/%23/#/g; | ||||
| 	$value =~ s/%24/\$/g; | ||||
| 	$value =~ s/%26/\&/g; | ||||
| 	$value =~ s/%27/\?/g; | ||||
| 	$value =~ s/%2B/\+/ig; | ||||
|         $value =~ s/%2C/,/ig; | ||||
| 	$value =~ s/%2F/\//ig; | ||||
| 	$value =~ s/%3A/:/ig; | ||||
| 	$value =~ s/%3B/;/ig; | ||||
| 	$value =~ s/%3C/</ig; | ||||
| 	$value =~ s/%3D/=/ig; | ||||
| 	$value =~ s/%3E/>/ig; | ||||
| 	$value =~ s/%3F/?/ig; | ||||
| 	$value =~ s/%40/\@/ig; | ||||
| 	$value =~ s/%5C/\\/ig; | ||||
| 	$value =~ s/%25/%/g;            # must be last | ||||
| 	$key = 'clientgroup' if ($key eq 'source'  ||  $key eq 'srcclass'); | ||||
| 	$key = 'clientuser'  if ($key eq 'clientident'); | ||||
| 	$key = 'category'    if ($key eq 'targetgroup'  ||  $key eq 'targetclass'); | ||||
| 	eval "\$$key = \$value"; | ||||
|       } | ||||
|  | ||||
|       if ($query =~ /^url=(.*)/)  | ||||
|       { | ||||
| 	$url = $1; | ||||
| 	last; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   $dummy = $ENV{'HTTP_X_BLOCKED_URL'}; | ||||
|   $url = $dummy  if defined $dummy; | ||||
|  | ||||
|   $dummy = $ENV{'HTTP_X_BLOCKED_CATEGORY'}; | ||||
|   $targetgroup = $dummy  if defined $dummy; | ||||
|  | ||||
|   if ($url eq 'undefined') | ||||
|   { | ||||
|      if ($ufdbservername ne '') | ||||
|      { | ||||
|         $url = 'https://' . $ufdbservername; | ||||
|      } | ||||
|      elsif ($ufdbhost ne '') | ||||
|      { | ||||
|         $url = 'https://' . $ufdbhost; | ||||
|      } | ||||
|  | ||||
|      if ($url ne 'undefined'  &&  $ufdbrequesturi ne '') | ||||
|      { | ||||
| 	$ufdbrequesturi =~ s/\?.*//; | ||||
|         $url .= $ufdbrequesturi; | ||||
|      } | ||||
|   } | ||||
|  | ||||
|   $origurl = $url; | ||||
|   $url = substr( $url, 0, 120 ) . '...'  if (length($url) > 120); | ||||
|  | ||||
|   $ufdbrefurl = $ENV{'HTTP_REFERER'}; | ||||
|  | ||||
|   if (1) | ||||
|   { | ||||
|     my $dbgf = '/tmp/debug-cgibin-cgi';     # '/local/websites/logs/cgidebug'; | ||||
|     open DEBUG, ">> $dbgf"; | ||||
|  | ||||
|     print DEBUG "\n\nurl = $url\n"; | ||||
|     print DEBUG "lang = $lang\n"; | ||||
|     foreach my $key ('HTTP_HOST', 'HTTP_REFERER', 'HTTP_USER_AGENT', 'REMOTE_ADDR', 'REQUEST_METHOD',  | ||||
| 		     'HTTP_ACCEPT_CHARSET', 'HTTP_ACCEPT_LANGUAGE', 'HTTP_CONTENT_TYPE', 'QUERY_STRING') { | ||||
|        my $value = $ENV{$key}; | ||||
|        $value = 'undefined'  if !defined($value); | ||||
|        print DEBUG "$key = $value\n"; | ||||
|     } | ||||
|  | ||||
|     if (0)  | ||||
|     { | ||||
|        print DEBUG ":\n"; | ||||
|        foreach my $key (sort(keys(%ENV))) { | ||||
| 	  print DEBUG "$key = $ENV{$key}\n"; | ||||
|        } | ||||
|        close DEBUG; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return ( $httpcode, $admin, $clientaddr, $clientname, $clientuser, $clientgroup, $category, $url ); | ||||
| } | ||||
|  | ||||
|  | ||||
| sub parseURL ($)  | ||||
| { | ||||
|   my $url      = shift; | ||||
|   my $protocol = ""; | ||||
|   my $address  = ""; | ||||
|   my $port     = ""; | ||||
|   my $path     = ""; | ||||
|  | ||||
|   $url =~ /^([^\/:]+):\/\/([^\/:]+)(:\d*)?(.*)/; | ||||
|   $protocol = $1 if(defined($1)); | ||||
|   $address  = $2 if(defined($2)); | ||||
|   $port     = $3 if(defined($3)); | ||||
|   $path     = $4 if(defined($4)); | ||||
|  | ||||
|   return ( $protocol, $address, $port, $path ); | ||||
| } | ||||
|  | ||||
|  | ||||
| sub getContentType( $ ) | ||||
| { | ||||
|    my $url = shift; | ||||
|    my $suffix; | ||||
|    my $path; | ||||
|  | ||||
|    $url =~ s/[;\?\&].*//; | ||||
|    $url =~ s/^(ftp|http|https):\/\///; | ||||
|  | ||||
|    $path = $url; | ||||
|    $path =~ s/^[^\/]*//; | ||||
|  | ||||
|    $suffix = $path; | ||||
|    $suffix =~ s/.*\././; | ||||
|  | ||||
|    return CT_IMAGE  if ($suffix =~ /\.(bmp|gif|ico|jpg|jpeg|jpe|png|webp|tiff)$/i); | ||||
|    return CT_CSS    if ($suffix =~ /\.css$/i); | ||||
|    return CT_JSON   if ($suffix =~ /\.json$/i); | ||||
|    return CT_JAVA   if ($suffix =~ /\.(js|jar)$/i); | ||||
|    return CT_TEXT   if ($suffix =~ /\.(csv|txt)$/i); | ||||
|    return CT_HTML   if ($suffix =~ /\.(htm|html|dhtml|shtml)$/i); | ||||
|    return CT_XML    if ($suffix =~ /\.(xml|sxml|rss)$/i); | ||||
|    return CT_STREAM if ($suffix =~ /\.(bin|bz2|cab|class|dat|doc|gz|h264|mp3|mpg|mpeg|msi|mst|ppt|pdf|rar|tar|ttf|xls|zip|ogv|divx|xvid|qt|ra|ram|rv|wmv|avi|mov|swf|mp4|mv4|flv)$/i); | ||||
|  | ||||
|    # no suffix found, now we start with the guesswork | ||||
|  | ||||
|  | ||||
|    return CT_HTML   if ($path eq '/' || $path eq ''); | ||||
|    return CT_IMAGE  if ($url =~ /^googleadservices\.com\/pagead\/conversion\// ); | ||||
|    return CT_TEXT   if ($url =~ /^googleads\.g\.doubleclick\.net\/pagead\/ads\// ); | ||||
|    return CT_JAVA   if ($url =~ /^pubads\.g\.doubleclick\.net\/pagead\/ads\// ); | ||||
|    return CT_JAVA   if ($url eq 'a.analytics.yahoo.com/fpc.pl' ); | ||||
|    return CT_IMAGE  if ($url eq 'a.analytics.yahoo.com/p.pl' ); | ||||
|    return CT_IMAGE  if ($url eq 'ping.chartbeat.net/ping' ); | ||||
|  | ||||
|    if ($url =~ '^www\.youtube\.com') | ||||
|    { | ||||
|       return CT_STREAM  if ($path =~ /^\/cp\//  ||  $path =~ /^\/p\//  || | ||||
|                             $path =~ /^\/v\//   ||  $path =~ /^\/videoplayback/ ); | ||||
|    } | ||||
|  | ||||
|    return CT_204    if ($url =~ /^s\.youtube\.com\/api\/stats\//); | ||||
|  | ||||
|    return CT_IMAGE  if ($url =~ /^b\.scorecardresearch\.com\// ); | ||||
|  | ||||
|    return CT_JAVA   if ($url =~ /\.doubleclick\.net\/adj\//   || | ||||
|                         $url =~ /\.doubleclick\.net\/pfadj\// ); | ||||
|    return CT_IMAGE  if ($url =~ /\.doubleclick\.net\/imp/ ); | ||||
|  | ||||
|    return CT_IMAGE  if ($url =~ /\.tradedoubler\.com\/imp/ ); | ||||
|  | ||||
|    if ($url =~ /^view\.atdmt\.com\//) | ||||
|    { | ||||
|       return CT_IMAGE  if ($path =~ /^\/action\// ); | ||||
|       return CT_JAVA   if ($path =~ /^\/jview\// ); | ||||
|    } | ||||
|  | ||||
|    return CT_JAVA   if ($url eq 'static.ak.connect.facebook.com/connect.php' ); | ||||
|  | ||||
|    return CT_IMAGE  if ($url eq 'secure-us.imrworldwide.com/cgi-bin/m' ); | ||||
|  | ||||
|    return CT_IMAGE  if ($url =~ /ftjcfx\.com\/image-/ ); | ||||
|    return CT_IMAGE  if ($url =~ /lduhtrp\.net\/image-/ ); | ||||
|    return CT_IMAGE  if ($url =~ /img\.pheedo\.com\/img\.phdo/ ); | ||||
|        | ||||
|    if ($path =~ /\/realmedia\/ads\//i ) | ||||
|    { | ||||
|       return CT_JAVA   if ($path =~ /\/adstream_jx/  ||  $path =~ /\/adstream_mjx/ ); | ||||
|       return CT_IMAGE  if ($path =~ /\/adstream_lx/  ||  $path =~ /\/adstream_nx/ ); | ||||
|       return CT_IMAGE  if ($path =~ /\/ads\/cap\.cgi/  ); | ||||
|    } | ||||
|  | ||||
|    return CT_JAVA   if ($url =~ /overture\.com\/ls_js_/ ); | ||||
|  | ||||
|    return CT_IMAGE  if ($path =~ /\/scripts\/beacon\.dll/  ||  $path =~ /\/scripts\/beacon2\.dll/ ); | ||||
|  | ||||
|    return CT_IMAGE  if ($url eq 'rtd.tubemogul.com/upi/'); | ||||
|  | ||||
|    return CT_JAVA   if ($path =~ /\/javascript\//  ||  $path =~ /\/ajaxpro\// ); | ||||
|  | ||||
|    return CT_JAVA   if ($path =~ /\/js\.php$/  ||  $path =~ /\/javascript\.php$/ ); | ||||
|  | ||||
|    return CT_CSS    if ($path =~ /\/css\.php$/ ); | ||||
|  | ||||
|    return CT_IMAGE  if ($path =~ /\/image\.php$/  || $path =~ /\/image\.php\// ); | ||||
|  | ||||
|    return CT_JAVA   if ($path =~ /\/js\.ng\//  ||  $path =~ /\/js\// ); | ||||
|  | ||||
|    return CT_JAVA   if ($path =~ /\/scripts\//  ||  $path =~ /\/script\// ); | ||||
|  | ||||
|    return CT_XML    if ($url =~ /^xml\./ ); | ||||
|  | ||||
|    if ($path =~ /\/b\/ss\// ) | ||||
|    { | ||||
|       return CT_IMAGE  if ($path =~ /\/FAS/i  ||  $path =~ /\/H\./i  ||  $path =~ /\/G\./i ); | ||||
|    } | ||||
|    | ||||
|    return CT_JAVA   if ($url =~ /\.channel\.facebook\.com\/x\// ); | ||||
|    return CT_TEXT   if ($url =~ /\.channel\.facebook\.com\/p/ ); | ||||
|    return CT_IMAGE  if ($url eq 'www.facebook.com/fr/u.php' ); | ||||
|  | ||||
|    return CT_IMAGE  if ($url eq 'pixel.mathtag.com/event/img' ); | ||||
|    return CT_JAVA   if ($url eq 'pixel.mathtag.com/event/js' ); | ||||
|  | ||||
|    return CT_IMAGE  if ($url eq 'x.bidswitch.net/ul_cb/sync' ); | ||||
|  | ||||
|    return CT_XML    if ($path =~ /\/xml-rpc/ ); | ||||
|  | ||||
|    return CT_STREAM if ($path eq 'open/1'); | ||||
|  | ||||
|    return CT_IMAGE  if ($url =~ /^pixel\./  ||  $path =~ /\/pixel$/ ); | ||||
|  | ||||
|    return CT_TEXT   if ($url =~ /heatmap/ ); | ||||
|  | ||||
|    return CT_204    if ($url eq 'analytics.livestream.com/track'); | ||||
|  | ||||
|    return CT_HTML; | ||||
| } | ||||
|  | ||||
|  | ||||
| # comment out the next line if fastcgi is not configured | ||||
| ### while (new CGI::Fast) | ||||
| { | ||||
|    my $time = time; | ||||
|    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst); | ||||
|    my $root; | ||||
|    my $buffer; | ||||
|  | ||||
|    session_reinit(); | ||||
|    init(); | ||||
|  | ||||
|    # the default is english | ||||
|    my $forbidden = 'no access'; | ||||
|    my $title = $forbidden; | ||||
|    my $explanation_prefix = 'URL blocked because it is'; | ||||
|    my $explanation_suffix = ''; | ||||
|    my $go_back = 'back'; | ||||
|    my $more_info = 'More information about ufdbGuard is <a href="https://www.urlfilterdb.com">here</a>.'; | ||||
|  | ||||
|    my $contentType = getContentType( $origurl ); | ||||
|  | ||||
|    $contentType = CT_204  if ($httpcode eq '204'); | ||||
|  | ||||
|    if ($contentType == CT_IMAGE) | ||||
|    { | ||||
|       print "Content-Type: image/png\n"; | ||||
|       ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime( $time + 180 ); | ||||
|       printf "Expires: %s, %02d %s %04d %02d:%02d:%02d GMT\n", | ||||
| 	     $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec; | ||||
|       print "\n"; | ||||
|  | ||||
|       my $imgfile; | ||||
|  | ||||
|       if ($category eq 'ads') | ||||
|       { | ||||
|          $imgfile = "transparent.png"; | ||||
|          $imgfile = "no-ads.png"      if ($mode eq 'noads'); | ||||
|          $imgfile = "smallcross.png"  if ($mode eq 'cross'); | ||||
|          $imgfile = "square.png"      if ($mode eq 'square'); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
| 	 if ($mode eq 'cross') { | ||||
| 	    $imgfile = "smallcross.png"  if ($mode eq 'cross'); | ||||
| 	 } | ||||
| 	 elsif ($mode eq 'square') { | ||||
| 	    $imgfile = "square.png"      if ($mode eq 'square'); | ||||
| 	 } | ||||
| 	 elsif ($mode eq 'simple-red'  ||  $mode eq 'transparent'  ||  $mode eq 'transparant') { | ||||
| 	    $imgfile = "transparent.png"; | ||||
| 	 } | ||||
| 	 else  { | ||||
| 	    $imgfile = "forbidden-normal-" . $lang . ".png"; | ||||
| 	 } | ||||
|       } | ||||
|       $root = $ENV{'DOCUMENT_ROOT'}; | ||||
|       open( BLOCKEDPNG, "$root/images/$imgfile" )  ||  print "failed to open $root/images/$imgfile\n"; | ||||
|       print $buffer while (read (BLOCKEDPNG,$buffer,8192)); | ||||
|       close( BLOCKEDPNG ); | ||||
|    } | ||||
|    elsif ($contentType == CT_204) | ||||
|    { | ||||
|       print "Status: 204 No Content\n"; | ||||
|       ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime( $time + 180 ); | ||||
|       print "Content-Type: text/plain\n"; | ||||
|       printf "Expires: %s, %02d %s %04d %02d:%02d:%02d GMT\n", | ||||
|              $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec; | ||||
|       printf "X-blocked-category: %s\n", $category; | ||||
|       printf "X-blocked-URL: %s\n", $url; | ||||
|       print "\n"; | ||||
|    } | ||||
|    elsif ($contentType == CT_STREAM) | ||||
|    { | ||||
|       if (1) | ||||
|       { | ||||
| 	 print "Status: 204 no content\n"; | ||||
|          print "Content-Type: text/plain\n"; | ||||
| 	 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime( $time + 180 ); | ||||
| 	 printf "Expires: %s, %02d %s %04d %02d:%02d:%02d GMT\n", | ||||
| 		$day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec; | ||||
| 	 printf "X-blocked-category: %s\n", $category; | ||||
| 	 printf "X-blocked-URL: %s\n", $url; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
| 	 print "Content-Type: application/octet-stream\n"; | ||||
| 	 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime( $time + 180 ); | ||||
| 	 printf "Expires: %s, %02d %s %04d %02d:%02d:%02d GMT\n", | ||||
| 		$day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec; | ||||
|       } | ||||
|       print "\n"; | ||||
|    } | ||||
|    elsif ($contentType == CT_JAVA) | ||||
|    { | ||||
|       print "Content-Type: application/x-javascript\n"; | ||||
|       ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime( $time + 180 ); | ||||
|       printf "Expires: %s, %02d %s %04d %02d:%02d:%02d GMT\n", | ||||
| 	     $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec; | ||||
|       print "\n"; | ||||
|  | ||||
|       print "\n"; | ||||
|    } | ||||
|    elsif ($contentType == CT_JSON) | ||||
|    { | ||||
|       print "Content-Type: application/json\n"; | ||||
|       ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime( $time + 180 ); | ||||
|       printf "Expires: %s, %02d %s %04d %02d:%02d:%02d GMT\n", | ||||
| 	     $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec; | ||||
|       print "\n"; | ||||
|  | ||||
|       print "\n"; | ||||
|    } | ||||
|    elsif ($contentType == CT_CSS) | ||||
|    { | ||||
|       print "Content-Type: text/css\n"; | ||||
|       ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime( $time + 180 ); | ||||
|       printf "Expires: %s, %02d %s %04d %02d:%02d:%02d GMT\n", | ||||
| 	     $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec; | ||||
|       print "\n"; | ||||
|  | ||||
|       print "\n"; | ||||
|    } | ||||
|    elsif ($contentType == CT_TEXT) | ||||
|    { | ||||
|       print "Content-Type: text/plain\n"; | ||||
|       ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime( $time + 180 ); | ||||
|       printf "Expires: %s, %02d %s %04d %02d:%02d:%02d GMT\n", | ||||
| 	     $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec; | ||||
|       print "\n"; | ||||
|  | ||||
|       print "\n"; | ||||
|    } | ||||
|    elsif ($contentType == CT_XML) | ||||
|    { | ||||
|       print "Content-Type: text/xml\n"; | ||||
|       ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime( $time + 180 ); | ||||
|       printf "Expires: %s, %02d %s %04d %02d:%02d:%02d GMT\n", | ||||
| 	     $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec; | ||||
|       print "\n"; | ||||
|  | ||||
|       print "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; | ||||
|       print "<cross-domain-policy>\n"; | ||||
|       print "   <allow-access-from domain=\"*\" />\n"; | ||||
|       print "</cross-domain-policy>\n"; | ||||
|    } | ||||
|    else 	# CT_HTML | ||||
|    { | ||||
|       if ($category eq 'fatal-error') | ||||
|       { | ||||
| 	 print "Content-Type: text/html\n"; | ||||
| 	 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime( $time + 180 ); | ||||
| 	 printf "Expires: %s, %02d %s %04d %02d:%02d:%02d GMT\n", | ||||
| 		$day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec; | ||||
| 	 print "Content-Language: $lang\n"; | ||||
| 	 print "\n"; | ||||
|  | ||||
| 	 print "<html lang=\"$lang\">\n"; | ||||
| 	 print "<head>\n"; | ||||
| 	 print "   <title>The URL filter has a fatal error</title>\n"; | ||||
| 	 print "   <meta name=\"description\" content=\"All URLs are blocked because the URL filter has a fatal error\" />\n"; | ||||
| 	 print "</head>\n"; | ||||
| 	 print "<body bgcolor=\"#e0e0e0\">\n"; | ||||
| 	 print "<center>\n"; | ||||
| 	 print "<font color=red><b>\n" . | ||||
| 	       "Access to the internet is blocked because<br>\n" . | ||||
| 	       "the URL filter has a fatal error. <br>\n" .  | ||||
| 	       "Ask your helpdesk or web proxy administrator for assistance." . | ||||
| 	       "</b></font>\n"; | ||||
| 	 print "</center>\n"; | ||||
| 	 print "$html_comment"; | ||||
| 	 print "</body>\n"; | ||||
| 	 print "</html>\n"; | ||||
|       } | ||||
|       elsif ($category eq 'loading-database') | ||||
|       { | ||||
| 	 print "Content-Type: text/html\n"; | ||||
| 	 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime( $time + 180 ); | ||||
| 	 printf "Expires: %s, %02d %s %04d %02d:%02d:%02d GMT\n", | ||||
| 		$day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec; | ||||
| 	 print "Content-Language: $lang\n"; | ||||
| 	 print "\n"; | ||||
|  | ||||
| 	 print "<html lang=\"$lang\">\n"; | ||||
| 	 print "<head>\n"; | ||||
| 	 print "   <title>a new URL database is being loaded</title>\n"; | ||||
| 	 print "   <meta name=\"description\" content=\"All URLs are blocked because the URL filter is loading a fresh database\" />\n"; | ||||
| 	 print "</head>\n"; | ||||
| 	 print "<body bgcolor=\"#e0e0e0\">\n"; | ||||
| 	 print "<center>\n"; | ||||
| 	 print "<font color=red><b>\n" . | ||||
| 	       "Access to the internet is temporarily blocked because<br>\n" . | ||||
| 	       "a new URL database is being loaded by the URL filter. <br>\n" .  | ||||
| 	       "Wait one minute and try again." . | ||||
| 	       "</b></font>\n"; | ||||
| 	 print "</center>\n"; | ||||
| 	 print "$html_comment"; | ||||
| 	 print "</body>\n"; | ||||
| 	 print "</html>\n"; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
| 	 if ($lang eq 'de') { | ||||
| 	    $forbidden = 'Verboten'; | ||||
| 	    $title = "zugriff verweigert ($category)"; | ||||
| 	    $explanation_prefix = 'Zugriff verweigert weil die URL die Klassifizierung'; | ||||
| 	    $explanation_suffix = 'hat.'; | ||||
| 	    $more_info = 'Mehr Informationen über ufdbGuard ist <a href="https://www.urlfilterdb.com/blocking/">hier</a>.'; | ||||
| 	    $go_back = 'Klicken Sie hier um zurück zu gehen.'; | ||||
| 	 } | ||||
| 	 elsif ($lang eq 'pl') { | ||||
| 	    $forbidden = 'Pobranie tej strony jest zabronione!'; | ||||
| 	    $title = "Cenzura, zakaz pobrania ($category)"; | ||||
| 	    $explanation_prefix = 'Nie otworzysz tej strony bo jest ona sklasyfikowana jako'; | ||||
| 	    $explanation_suffix = 'przez program kontroli ufdbGuard'; | ||||
| 	    $more_info = 'Informacja (po angielsku) o tym programie kontroli jest na <a href="https://www.urlfilterdb.com/blocking/">stronie</a>.'; | ||||
| 	    $go_back = 'Wycofaj do poprzedniej strony'; | ||||
| 	 } | ||||
| 	 elsif ($lang eq 'sv') { | ||||
| 	    $forbidden = 'Sidan stoppad enligt landstingets riktlinjer'; | ||||
| 	    $title = "Förbjuden ($category)"; | ||||
| 	    $explanation_prefix = 'Access till denna sida är stoppad:'; | ||||
| 	    $explanation_suffix = ''; | ||||
| 	    $more_info = 'Mer information om ufdbGuard är <a href="https://www.urlfilterdb.com/blocking/">här</a>.'; | ||||
| 	    $go_back = 'Klicka här för att komma tillbaks'; | ||||
| 	 } | ||||
| 	 elsif ($lang eq 'nl') { | ||||
| 	    $forbidden = 'Geen Toegang'; | ||||
| 	    $title = "geen toegang ($category)"; | ||||
| 	    $explanation_prefix = 'De toegang is geblokkeerd omdat de URL in de categorie'; | ||||
| 	    $explanation_suffix = 'valt.'; | ||||
| 	    $more_info = 'Meer informatie over ufdbGuard is <a href="https://www.urlfilterdb.com/blocking/">hier</a>.'; | ||||
| 	    $go_back = 'Klik hier om terug te gaan'; | ||||
| 	 } | ||||
| 	 elsif ($lang eq 'es') { | ||||
| 	    $forbidden = 'Ningún acceso'; | ||||
| 	    $title = "ningún acceso ($category)"; | ||||
| 	    $explanation_prefix = 'Se bloquea el acceso puesto que el URL se considera ser'; | ||||
| 	    $explanation_suffix = ''; | ||||
| 	    $more_info = 'Más información sobre ufdbGuard está <a href="https://www.urlfilterdb.com/blocking/">aquí</a>.'; | ||||
| 	    $go_back = 'ir detrás'; | ||||
| 	 } | ||||
| 	 elsif ($lang eq 'it') { | ||||
| 	    $forbidden = 'Accesso negato'; | ||||
| 	    $title = "accesso negato ($category)"; | ||||
| 	    $explanation_prefix = "L'accesso è negato poiché l'URL appartiene a none"; | ||||
| 	    $explanation_suffix = ''; | ||||
| 	    $more_info = 'Maggiori informazioni su ufdbGuard sono disponibili <a href="https://www.urlfilterdb.com/blocking">qui</a>.'; | ||||
| 	    $go_back = 'tornare indietro'; | ||||
| 	 } | ||||
| 	 elsif ($lang eq 'pt') { | ||||
| 	    $forbidden = 'Proibido'; | ||||
| 	    $title = "Proibido ($category)"; | ||||
| 	    $explanation_prefix = "O acesso a este site foi bloqueado porque o conteúdo está"; | ||||
| 	    $explanation_suffix = ''; | ||||
| 	    $more_info = 'Mais informação sobre ufdbGuard está <a href="https://www.urlfilterdb.com/blocking">aqui</a>.'; | ||||
| 	    $go_back = 'volte'; | ||||
| 	 } | ||||
| 	 elsif ($lang eq 'fr') { | ||||
| 	    $forbidden = 'Interdit'; | ||||
| 	    $title = "Accès Interdit ($category)"; | ||||
| 	    $explanation_prefix = "L'accès est inderdit parce que le site est dans la catégorie "; | ||||
| 	    $explanation_suffix = ''; | ||||
| 	    $more_info = "Pour plus d'information sur ufdbGuard cliquez <a href=\"https://www.urlfilterdb.com/blocking\">ici</a>."; | ||||
| 	    $go_back = 'retour'; | ||||
| 	 } | ||||
| 	 elsif ($lang eq 'tr') { | ||||
| 	    $forbidden = 'Erişim engellendi'; | ||||
| 	    $title = "Erişim engellendi ($category)"; | ||||
| 	    $explanation_prefix = "Ulaşmak istediğiniz sayfaya erişim kapalıdır. Sınıfı:"; | ||||
| 	    $explanation_suffix = ''; | ||||
| 	    $more_info = "ufdbGuard hakkında bilgi için <a href=\"https://www.urlfilterdb.com/blocking\">tıklayınız</a>."; | ||||
| 	    $go_back = 'Önceki sayfa'; | ||||
| 	 } | ||||
| 	 elsif ($lang eq 'NEWLANGUAGE') { | ||||
| 	    $forbidden = 'Forbidden'; | ||||
| 	    $title = "Forbidden ($category)"; | ||||
| 	    $explanation_prefix = 'Access is blocked since the URL is considered to be'; | ||||
| 	    $explanation_suffix = ''; | ||||
| 	    $more_info = 'More information about ufdbGuard is <a href="https://www.urlfilterdb.com/blocking">here</a>.'; | ||||
| 	    $go_back = 'Click here to go back'; | ||||
| 	 } | ||||
| 	 else {   # default (matches 'en') | ||||
| 	    $forbidden = 'Forbidden'; | ||||
| 	    $title = "Forbidden ($category)"; | ||||
| 	    $explanation_prefix = 'Access is blocked since the URL is considered to be'; | ||||
| 	    $explanation_suffix = ''; | ||||
| 	    $more_info = 'More information about ufdbGuard is <a href="https://www.urlfilterdb.com/blocking">here</a>.'; | ||||
| 	    $go_back = 'Click here to go back'; | ||||
| 	    $lang = 'en'; | ||||
| 	 } | ||||
|  | ||||
| 	 if ($color eq 'orange') | ||||
| 	 { | ||||
| 	    $textcolor = 'white'; | ||||
| 	    $bgcolor = '#ee8811'; | ||||
| 	 } | ||||
| 	 elsif ($color eq 'white') | ||||
| 	 { | ||||
| 	    $textcolor = '#3f003f'; | ||||
| 	    $bgcolor = 'white'; | ||||
| 	 } | ||||
| 	 elsif ($color eq 'black') | ||||
| 	 { | ||||
| 	    $textcolor = '#f0f0f0'; | ||||
| 	    $bgcolor = 'black'; | ||||
| 	 } | ||||
| 	 elsif ($color eq 'red') | ||||
| 	 { | ||||
| 	    $textcolor = '#f0f0f0'; | ||||
| 	    $bgcolor = 'red'; | ||||
| 	 } | ||||
| 	 elsif ($color eq 'grey'  ||  $color eq 'gray') | ||||
| 	 { | ||||
| 	    $textcolor = '#111111'; | ||||
| 	    $bgcolor = '#c2c2c2'; | ||||
| 	 } | ||||
| 	 else	# default color: orange | ||||
| 	 { | ||||
| 	    $textcolor = 'white'; | ||||
| 	    $bgcolor = '#ee8811'; | ||||
| 	 } | ||||
|  | ||||
| 	 if ($size eq 'normal') | ||||
| 	 { | ||||
| 	    $titlesize = '+2'; | ||||
| 	    $textsize = '+0'; | ||||
| 	 } | ||||
| 	 elsif ($size eq 'small') | ||||
| 	 { | ||||
| 	    $titlesize = '+1'; | ||||
| 	    $textsize = '-1'; | ||||
| 	 } | ||||
| 	 elsif ($size eq 'large') | ||||
| 	 { | ||||
| 	    $titlesize = '+3'; | ||||
| 	    $textsize = '+1'; | ||||
| 	 } | ||||
| 	 else    # default size: normal | ||||
| 	 { | ||||
| 	    $titlesize = '+2'; | ||||
| 	    $textsize = '+0'; | ||||
| 	    $size = 'normal'; | ||||
| 	 } | ||||
|  | ||||
| 	 $url =~ s/[?;&].*//; | ||||
|  | ||||
| 	 print "Content-Type: text/html\n"; | ||||
| 	 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime( $time + 180 ); | ||||
| 	 printf "Expires: %s, %02d %s %04d %02d:%02d:%02d GMT\n", | ||||
| 		$day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec; | ||||
| 	 print "Content-Language: $lang\n"; | ||||
| 	 print "\n"; | ||||
|  | ||||
| 	 if ($url eq 'https://blockedhttps.urlfilterdb.com') | ||||
| 	 { | ||||
| 	    print "<html lang=\"$lang\">\n"; | ||||
| 	    print "<head>\n"; | ||||
| 	    print "   <title>$title</title>\n"; | ||||
| 	    print "   <meta name=\"description\" content=\"$title\" />\n"; | ||||
| 	    print "</head>\n"; | ||||
| 	    print "<body bgcolor=\"ffcccc\" link=\"red\" alink=\"red\" vlink=\"red\" text=\"red\">\n"; | ||||
| 	    print "<p align=center>\n"; | ||||
| 	    print "https://blockedhttps.urlfilterdb.com is used by ufdbGuard<br>\n"; | ||||
| 	    print "to display messages about blocked URLs.<br>\n"; | ||||
| 	    print "</p>\n"; | ||||
| 	    print "$html_comment"; | ||||
| 	    print "</body>\n"; | ||||
| 	    print "</html>\n"; | ||||
| 	 } | ||||
| 	 elsif ($category eq 'ads') | ||||
| 	 { | ||||
| 	    my $text; | ||||
| 	    $text = " ";	 # transparent | ||||
| 	    $text = " no ads " if $mode eq 'noads'; | ||||
| 	    $text = " [] "     if $mode eq 'square'; | ||||
| 	    $text = " x "      if $mode eq 'cross'; | ||||
| 	    $text = "<font color=red><i>ads</i></font>"  if $mode eq 'simple-red'; | ||||
|  | ||||
| 	    print "<html lang=\"$lang\">\n"; | ||||
| 	    print "<head>\n"; | ||||
| 	    print "   <title>$title</title>\n"; | ||||
| 	    print "   <meta name=\"description\" content=\"The ad is blocked by the URL filter.\nURL: $ufdbhost$ufdbrequesturi\" />\n"; | ||||
| 	    print "</head>\n"; | ||||
| 	    print "<body>\n"; | ||||
| 	    print "<font size=\"$textsize\">$text</font>\n"; | ||||
| 	    print "$html_comment"; | ||||
| 	    print "</body>\n"; | ||||
| 	    print "</html>\n"; | ||||
| 	 } | ||||
| 	 else      	# no ads | ||||
| 	 { | ||||
| 	    if ($mode eq 'simple-red') | ||||
| 	    { | ||||
| 	       my $whyblocked = "$explanation_prefix $category $explanation_suffix.  URL = $url"; | ||||
| 	       print "<html lang=\"$lang\">\n"; | ||||
| 	       print "<head>\n"; | ||||
| 	       print "   <title>$title</title>\n"; | ||||
| 	       print "   <meta name=\"description\" content=\"The URL is blocked by the URL filter ($ufdbhost$escaped_ufdbrequesturi)\" />\n"; | ||||
| 	       print "</head>\n"; | ||||
| 	       print "<body bgcolor=\"ffe6e6\" link=\"blue\" alink=\"red\" vlink=\"black\" text=\"red\">\n"; | ||||
| 	       print "<p align=center>\n"; | ||||
| 	       print "<a title=\"$whyblocked\">$forbidden<br><i>$category</i></a>\n"; | ||||
| 	       print "<a href=\"/cgi-bin/show_url_details.cgi?mode=$mode&url=$ufdbhost$escaped_ufdbrequesturi\">why is this URL blocked?</a>\n"; | ||||
| 	       print "</p>\n"; | ||||
| 	       print "$html_comment"; | ||||
| 	       print "</body>\n"; | ||||
| 	       print "</html>\n"; | ||||
| 	    } | ||||
| 	    elsif ($category eq 'social-bdg'  ||  $category eq 'socbadges'  ||  $category eq 'social-badges'  ||  $category eq 'social_badges') | ||||
| 	    { | ||||
| 	       print "<html lang=\"$lang\">\n"; | ||||
| 	       print "<head>\n"; | ||||
| 	       print "   <title>block social networking badge</title>\n"; | ||||
| 	       print "   <meta name=\"description\" content=\"social networking badge is blocked by the URL filter\" />\n"; | ||||
| 	       print "</head>\n"; | ||||
| 	       # print "<body width=30 height=30 bgcolor=\"transparent\">\n"; | ||||
| 	       print "<body bgcolor=#fafafa>\n"; | ||||
| 	       print "<center>\n"; | ||||
| 	       print "<font size=\"-1\" color=\"#1f1f1f\">\n" . | ||||
| 		     "<a title=\"The social networking badge is blocked.\"> B </a>\n" . | ||||
| 		     "</font>\n"; | ||||
| 	       print "</center>\n"; | ||||
| 	       print "$html_comment"; | ||||
| 	       print "</body>\n"; | ||||
| 	       print "</html>\n"; | ||||
| 	    } | ||||
| 	    else | ||||
| 	    { | ||||
| 	       print "<html lang=\"$lang\">\n"; | ||||
| 	       print "<head>\n"; | ||||
| 	       print "   <title>$title</title>\n"; | ||||
| 	       print "   <meta name=\"description\" content=\"The URL is blocked by the URL filter\" />\n"; | ||||
| 	       print "</head>\n"; | ||||
| 	       print "<body bgcolor=\"$bgcolor\" text=\"$textcolor\">\n"; | ||||
| 	       print "<font size=\"$titlesize\">$forbidden</font> <br>\n"; | ||||
| 	       print "<font size=\"$textsize\">\n"; | ||||
| 	       print "$explanation_prefix <i>$category</i> $explanation_suffix <br>\n"; | ||||
| 	       print "URL: $url <br>\n"; | ||||
| 	       print "<p>\n"; | ||||
| 	       print "<a href=\"javascript:history.go(-1);\">$go_back</a>. <br>\n"; | ||||
| 	       print "$admin\n"; | ||||
| 	       print "<p>\n"; | ||||
| 	       print "$more_info\n"; | ||||
| 	       print "<br>\n <p />\n"; | ||||
| 	       print "</font>\n"; | ||||
| 	       print "<font size=\"-3\">"; | ||||
| 	       print "user=$clientuser   "      if (defined($clientuser)  &&  length($clientuser)>0); | ||||
| 	       print "client=$clientaddr   "    if (defined($clientaddr)  &&  length($clientaddr)>0); | ||||
| 	       print "group=$clientgroup   "    if (defined($clientgroup)  &&  length($clientgroup)>0); | ||||
| 	       print "source=$clientname   "    if (defined($clientname)  &&  length($clientname)>0); | ||||
| 	       print "</font>\n"; | ||||
| 	       print "$html_comment"; | ||||
| 	       print "<!-- color:$color size:$size mode:$mode lang:$lang category:$category -->\n"; | ||||
| 	       print "</body>\n"; | ||||
| 	       print "</html>\n"; | ||||
| 	    } | ||||
| 	 } | ||||
|       } | ||||
|    } | ||||
| } | ||||
|  | ||||
| exit 0; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Daniel Berteaud
					Daniel Berteaud