#!/usr/bin/perl -w
#
# Wird von Squid aufgerufen mit einer User/Passwort-Kombination
# Checkt Kombination via sisiscgi.pl (misc) auf Sisisrechner
# Liefer OK oder ERR zurueck, je nach Ergebnis
# Laeuft endlos, damit Squid die Instanz offen halten kann
#
# Version 1.0, 9/07, misc
#
#####################################################################

use strict;
$| = 1;   # Wichtig: Keine Ausgabepufferung, sonst geht gar nix

# Server, der zur Auth verwendet werden soll. Dort muss im URL-Pfad /cgi-bin das Script sisiscgi.pl erreichbar sein
our $server="meinsisis.server";    

our $gesperrt="999999 1111111"; # Gesperrte Benutzernummern, nacheinander, durch Leerzeichen getrennt

our $accesspassword="mein-access-passwort";

# ----------------------------------------
sub authenticate_user {
  my ($username,$password)=@_;

  my $checkurl=qq#http://$server/cgi-bin/sisiscgi.pl?accesspassword=$accesspassword&order=auth#;
  my $response=&urlholen($checkurl."&user=$username&pass=$password");

  if (  ($response=~m/<!--returncode:OK-->/) and ($response!~m/<!--geperrt:ja-->/)
     ){
    return 1;
  }

# Anhand des folgenden Codes kann man erkennen, wie man weitere Authentifizierungen einbinden kann
######### Naechster Versuch: Auth. per Radius
#  open PIPE,qq{echo "User-Name=$username", "User-Password=$password" | $radiuscommand  $radiusserver  auth $radiussecret|};
#  while (my $z=<PIPE>) {
#     if ($z=~/code 2,/) {
#        close PIPE;
#        return 1;
#     }
#  }
#  close PIPE;
#  ########

  return 0;
}
# ----------------------------------------
sub urlholen {

   my $gefragteurl = $_[0];

   use LWP::UserAgent;
   my $ua = new LWP::UserAgent;
   $ua->agent("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031007" . $ua->agent);
   my $req = new HTTP::Request GET => $gefragteurl;
   my $res = $ua->request($req);
   if ($res->is_success) {
      return $res->content;
   } else {
      return "Bad luck this time\n";
   }
} 
# ----------------------------------------

# Entgegennahme des Benutzernamens und Passwortes ueber STDIN
while (<STDIN>){
   chomp;
   my $argumentstring=$_;
   if ($argumentstring!~/^.+\s.+$/){
      print "ERR\n";
      next;
   }
   my ($username,$password)=split(/ /,$argumentstring);
   if ($gesperrt=~m/$username/) {   # Gesperrter Benutzer
      print "ERR\n";
      next;
   }
   if (&authenticate_user($username,$password)){
     print "OK\n";
   } else {
     print "ERR\n";
   }
}
