#!/usr/bin/perl -T

# Copyright 1997-2000 by Marco Budde (Budde@tu-harburg.de)
# GNU GPL license 

$ENV{'PATH'} = '/bin';


####################################
# some subroutines for cgi parsing #
####################################

sub url_decode 
{
  my $input = shift;
  $input =~ s/\+/ /g;
  $input =~ s/%([0-9A-Fa-f]{2})/pack("C", hex($1))/eg;
  if ($input =~ /^([-\@\w.]{3,})$/)                 # anti hacker test
  {
      return $1;
  }
  else   
  {
      &error_message ('error_char');
  }  
}


sub parse_cgi
{
  my $input = shift;
  my %FORM;
  my (@PAIRS, $pair);

  @PAIRS = split (/&/, $input);
  foreach $pair (@PAIRS) 
  {
    ($key, $value) = split (/=/, $pair);
    $key = &url_decode ($key);
    $value = &url_decode ($value);
    if (defined $FORM {$key})
    {
      $FORM {$key} .= "\0" . $value;
    }
    else
    {
      $FORM {$key} = $value;
    }
  }

  return %FORM;
}


########################
#   message catalog    #
########################

sub language
{
  %MESG = ( 'headline', 'Search Results: ',
       'title', 'Title',
       'hits', 'Hits',
       'error', 'Error',
       'error_glimpse', 'Please install the glimpse package on this server!',
       'error_char', 'Your search string includes illegal characters or is shorter than three characters!' );

  if ($ENV {'HTTP_ACCEPT_LANGUAGE'} eq "de")
  {
    %MESG = ( 'headline', 'Suchergebnisse: ',
       'title', 'Titel',
       'hits', 'Treffer',
       'error', 'Fehler',
       'error_glimpse', 
             'Bitte installieren sie das glimpse Paket auf diesem Server!',
       'error_char', 'Ihre Suchanfrage enthlt unzulssige Buchstaben oder enthlt weniger als drei Buchstaben!' );
  }

  if ($ENV {'HTTP_ACCEPT_LANGUAGE'} eq "it")
  {
     %MESG = ( 'headline', 'Risultati della Ricerca: ',
       'title', 'Titolo',
       'hits', 'Hits',
       'error', 'Errore',
       'error_glimpse', 
           'Prego, installare il pacchetto glimpse su questo server!',
       'error_char', 
           'La propria stringa di ricerca comprende caratteri illegali!' );
  }

  if ($ENV {'HTTP_ACCEPT_LANGUAGE'} eq "es")
  {
     %MESG = ( 'headline', 'Resultados de la bsqueda: ',
       'title', 'ttulo',
       'hits', 'aciertos',
       'error', 'error',
       'error_glimpse',
              ' Por favor, instale el paquete glimpse en este servidor!',
        'error_char', 'La cadena de bsqueda incluye caracteres ilegales!' );
  }

  if ($ENV {'HTTP_ACCEPT_LANGUAGE'} eq "fr")
  {
    %MESG = ( 'headline', 'Rsultats de la recherche : ',
              'title', 'Titre',
              'hits', 'Touches',
              'error', 'Erreur',
              'error_glimpse', 
      'Vous devriez (faire) installer le paquet glimpse sur ce serveur !',
              'error_char', 
      'Votre chane de recherche contient des caractres illgaux !' );
  }

  if ($ENV {'HTTP_ACCEPT_LANGUAGE'} eq "da")
  {
    %MESG = ( 'headline', 'Sge Resultater: ',
              'title', 'Titel',
              'hits', 'Trffere',
              'error', 'Fejl',
              'error_glimpse', 
                 'Venligst installer glimpse pakken p denne server!',
	      'error_char', 'Din sge-streng indeholder ulovlige tegn!' );
  }

}

############################
#   output error message   #
############################

sub error_message
{  
  print <<"END";     
   <HTML>
      
   <HEAD>
    <TITLE>$MESG{'error'}</TITLE>
   </HEAD>

   <BODY BGCOLOR=#FFFFFF>
   <IMG SRC="/doc/dhelp/debian.jpg" ALT="Debian GNU/Linux">
   <H1>$MESG{'error'}</H1>
   $MESG{$_[0]}<P>
   <HR>
   <ADDRESS>
   <A HREF="mailto:$ENV{'SERVER_ADMIN'}">
   $ENV{'SERVER_ADMIN'}</A>
   </ADDRESS>
   </BODY>
      
   </HTML>
END
    exit;
}


#############################
#   is glimpse installed?   #
#############################

sub glimpse_installed
{
  if (not -X '/usr/bin/glimpse')
  {
    &error_message ('error_glimpse'); 
  }
}


#####################
#    sort hits      #
#####################

sub sort_vgl
{
  $results{$b}[1] <=> $results{$a}[1];  
}


######################
#       search       #
######################

sub search
{
  if (not mkdir "/tmp/dsearch.$$",0700)
  {
    exit 1;
  }
  @results = split (/\n/, 
      `/usr/bin/glimpse -L 100000:1000 -i -U -c -H /var/lib/dhelp -T /tmp/dsearch.$$ "$FORM{'search'}"`);
  rmdir "/tmp/dsearch.$$";

  foreach $line (@results)
  {
    if ($line =~ /(.+?)\s(.+):\s([0-9]*)/)
    {  
      $a = $1;
      $b = $2;
      $c = $3;
      $a =~ s/\/usr\/share//;
      $a =~ s/\/usr//;
      $b =~ s/\\:/:/g;
      $results{$a} = [$b, $c]; 
    }
  }

  print <<"ENDE";

<HTML>

<HEAD>
<TITLE>$MESG{'headline'} $FORM{'search'}</TITLE>
</HEAD>

<BODY BGCOLOR=#FFFFFF>
<IMG SRC="/doc/dhelp/debian.jpg" ALT="Debian GNU/Linux">
<H1>$MESG{'headline'} $FORM{'search'}</H1>

<TABLE CELLPADDING=5 BGCOLOR=#EEEEEE BORDER=0>
<TR BGCOLOR=#EEC000>
  <TD><FONT COLOR=#FFFFFF SIZE=+1 FACE="Helvetica,Arial"><B>
      <CENTER>$MESG{'title'}</CENTER></B></FONT>
  <TD><FONT COLOR=#FFFFFF SIZE=+1 FACE="Helvetica,Arial"><B>
      <CENTER>$MESG{'hits'}</CENTER></B></FONT>

ENDE


  foreach $key (sort sort_vgl keys %results)
  {
    printf ("<TR><TD><DL><DT><A HREF=\"%s\">%s</A><DD><I>%s</I></DL>\n", 
            $key, $results{$key}[0], $key);
    printf ("    <TD>%s\n", $results{$key}[1]); 
  }
  printf ("</TABLE>\n");

  printf ("</BODY>\n</HTML>\n");
}


###################
#      main       #   
###################

&language;

if (defined $ARGV[0])
{
  $ARGV[0] =~ /(.*)/;
  $FORM{'search'} = $1;
}
else
{
  printf ("Content-type: text/html\n\n");
  %FORM = &parse_cgi ($ENV {'QUERY_STRING'});
}

&glimpse_installed;
&search;


