#!/usr/local/bin/perl

#
# (C) Erik Heinz <erik@iks-jena.de>
# Version 2004-05-04
# Niels Dettenbach

use CGI;
use DB_File;
use Encode;

require whois;


$LOG_FILE  = "/var/log/whois-cgi.log";
$CLIENT_DB = '/var/lib/whois/clients.db';


########## Subroutinen


sub print_head {
  print $query->start_html(
    -title=>'Syndicat WHOIS-Abfrage', 
    -style=>{'src'=>'http://syndicat.com/Z/sy/content/stylesheet_ger.css'},
  );

  open HTML, "whois.pre"; print while (<HTML>); close HTML;
}


sub print_foot {
  open HTML, "whois.post"; print while (<HTML>); close HTML;
  print $query->end_html;
}


sub print_form {
  print $query->header;
  print_head(); 

  print "<h2>Syndicat WHOIS-Abfrage</h2>",
    "<TR><TD class=inhalt>",
    "Diese <b>Whois-Abfrage</b> vereinfacht die Suche nach Informationen &uuml;ber ",
    "<ul><li>Domainnamen (z.B. syndicat.com, www.rimi.de)</li><li>IP-Adressen (z.B. 62.146.89.62)</li><li>Kontaktpersonen \/ Handles (z.B. ND74-RIPE)</li></ul>",
    "und anderen in WHOIS-Datenbanken gespeicherten Daten.<BR>",
    "Die zust&auml;ndigen WHOIS-Server werden automatisch ermittelt.";
  print $query->startform,
    "<STRONG>Suchbegriff</STRONG><BR>", 
    $query->textfield('search', '', 32, 128), "&nbsp;&nbsp;",
    $query->submit(-name=>'submit', -value=>'Suchen');
  if ($charset) { print $query->hidden('charset', $charset); }
  print $query->endform;
  print "</TD></TR></TABLE>\n",
	"<TABLE border=\"0\"><TR><TD align=\"right\">",
	"<A HREF=\"http\:\/\/syndicat.com\"><IMG SRC=\"http://de.syndicat.com/pics/mousepad.jpg\" BORDER=\"0\" ALT=\"Syndicat\" /></A></TD>",
	"<TD align=\"left\" valign=\"middle\"><A HREF=\"http://www.smartns.de/\">[ Domains registrieren ]</A><BR />",
	"<A HREF=\"http://www.smartns.de/\">[ Verf&uuml;gbarkeitscheck ]</A><BR />",
	"<A HREF=\"http://www.syndicat.com/\">[ Syndicat Home ]</A></TD></TR></TABLE>";

  print_foot(); 
}


sub do_job {
  $ENV{'HOME'} = '/home/httpd/html/whois';

  if ($search =~ /@([^@>]+)/) { 
    $search = $1; }
  elsif ($search =~ m|http://([^/]+)|) { 
    $search = $1; }
  if ($search =~ /^www\.(.+\..+)$/) { 
    my $dom = $1;
    my $ns = `host -t NS $search`;
    if ($ns !~ / name server /) { $search = $dom; } }

  ($result, $host) = whois::whois($search, $host, 86400, 0);
  $result =~ s/&/&amp;/g; $result =~ s/</&lt;/g;

  my $url = $query->url;
  $result =~ 
    s|\(([A-Z][A-Z\d-]{4,})\)|(<A HREF="$url?search=$1&host=$host">$1</A>)|mg
    ||
  $result =~ 
    s/([A-Z0-9-]+-(?:ARIN|FRNIC|NICAT|NORID|RIPE|RIPN|SA|UANIC|VRIO))/<A HREF="$url?search=$1">$1<\/A>/mg; 
}


sub print_result {
  if ($deny) {
    print $query->header;
    print_head();
    print 
      "<TR><TD class=inhalt>",
      "Zugriff gesperrt wegen zu vieler Anfragen.<BR>",
      "Query limit exhausted. Access is temporarily disabled.",
      "</TD></TR>\n"; 
  }

  else {
    if ($result =~ /[\240-\377]/) {
      if (whois::check_utf8($result)) {
        if ($charset) { Encode::from_to($result, 'utf-8', $charset); }
        else { 
          $query->charset('utf-8');
          if (! whois::check_utf8($search)) {
            Encode::from_to($search, 'iso-8859-1', 'utf-8'); }
        }
      }
    }
    print $query->header;
    print_head();
    print "<TR><TD class=inhalt><h2>Syndicat WHOIS-Abfrage</h2>",
      "<STRONG>Suchbegriff</STRONG>: $search<BR>",
      "<STRONG>Adresse:</STRONG> $host<P>",
      "<STRONG>Suchergebnis:</STRONG><BR><PRE>$result</PRE>",
      "</TD></TR></TABLE>\n"; 
    print "</TD></TR></TABLE>\n",
        "<TABLE border=\"0\"><TR><TD align=\"right\">",
        "<A HREF=\"http\:\/\/syndicat.com\"><IMG SRC=\"http://de.syndicat.com/pics/mousepad.jpg\" BORDER=\"0\" ALT=\"Syndicat\" /></A></TD>",
        "<TD align=\"left\" valign=\"middle\"><A HREF=\"http://www.smartns.de/\">[ Domains registrieren ]</A><BR />",
	"<A HREF=\"http://www.smartns.de/\">[ Verf&uuml;gbarkeitscheck ]</A><BR />",
        "<A HREF=\"http://www.syndicat.com/\">[ Syndicat Home ]</A></TD></TR></TABLE>";

  }

  print_foot();
}


sub write_log {
  local $date = `date +"%b %d %X"`; chomp $date;
  open (LOG, ">>$LOG_FILE");
  if ($deny) { print LOG "$date Query from $remote DENIED\n"; }
  else { print LOG "$date Query from $remote for \"$search\"\n"; }
  close LOG;
}


sub check_client {
  $rhost = $ENV{'REMOTE_HOST'}; 
  $raddr = $ENV{'REMOTE_ADDR'};

  if ($rhost) { $remote = "$rhost ($raddr)"; } 
  else { $remote = "$raddr"; }

  if (exists $CLI{$raddr}) { 
    if ((time() - $CLI{"LAST:$raddr"}) > 1800) { $CLI{$raddr} = 0; } }

  $CLI{$raddr} ++;
  $CLI{"LAST:$raddr"} = time();
  if ($CLI{$raddr} > 20) { $deny = 1; }
}


########## Hauptprogramm


tie (%CLI, DB_File, $CLIENT_DB, O_RDWR|O_CREAT, 0755, $DB_HASH) ||
    die "$CLIENT_DB: $!\n";

$query = new CGI();
$query->autoEscape(undef);

$search = $query->param('search');
$host = $query->param('host');

$charset = $query->param('charset');
if ($charset) { $query->charset($charset); }
else { $query->charset('iso-8859-1'); }

if (!$search) { print_form(); exit; }

check_client();
write_log();

do_job() unless ($deny); 

print_result();

untie %CLI;


########## Ende   


