#!/usr/bin/perl
use strict;
use warnings;
use feature ':5.10';
use version; our $VERSION = qv('0.2');
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser); # Fehler sollen im Browser ausgegeben werden
use Net::LDAP;
use Delixs::Tools;
my $template_formular = 'formular.template';
my $template_danke = 'danke.template';
my $file = 'projektdaten.txt';
my ($name, $pass, %data);
# 1. wir holen uns die Parameter
my $login = param('login');
my $nr = param('nr'); # wir zählen ab 0. -> Anzeige $nr + 1
my $ip = $ENV{REMOTE_ADDR};
my $pc = $ENV{REMOTE_HOST};
# beim Aufruf durch die HTML-Seite ($nr == 0)
if ($nr == 0) {
$pass = param('pass');
}
# beim Aufruf durch ein generiertes Formular ($nr > 0)
else {
$name = param('name');
}
# 2. wir lesen die Projektdaten ein
my ($themen_lref, $urls_lref) = &read_projektdata( $file );
my @themen = @{$themen_lref};
my @urls = @{$urls_lref};
my $anz_projekte = scalar @themen;
# 3. Daten abspeichern
# beim 1. Aufruf gibt es noch keine Daten, wir initialisieren nur die Datei
# und authentifizieren und holen den Namen aus dem LDAP
if ($nr == 0) {
# wenn keine Authentifikation, stirb dieses Script
$name = &authen($login, $pass);
&init_file_userdata( $login );
%data = get_data();
&next_formular( $template_formular, %data );
}
# bei den nächsten Aufrufen werden die Daten abgespeichert
elsif ($nr > 0 and $nr < $anz_projekte) {
# wir holen uns die Values der Bewertung
$data = &get_data_bewertung();
&save_userdata( $login, $data );
%data = get_data();
&next_formular( $template_formular, %data );
}
elsif ($nr == $anz_projekte) {
# wir holen uns die Values der Bewertung
$data = &get_data_bewertung(); # wie geht das richtig?
&save_userdata( $login, $data );
%data = get_data();
&next_formular( $template_danke, %data );
}
else {
# dieser Fall kann/wird nicht eintreten
}
##################### Ende des Hauptprogramms ##################
# Aufruf: $name = &authen($login, $pass);
sub authen {
my $login = shift;
my $pass = shift;
my $ldap_base = &Delixs::Tools::get_ldapbase;
my $auth = Authen::Simple::LDAP->new(
host => '127.0.0.1',
basedn => "ou=people,ou=accounts,${ldap_base}" );
# wenn nicht authentifiziert, dann Abbruch
unless ( $auth->authenticate( $username, $userpass ) ) {
die "User $login konnte nicht authentifiziert werden!";
}
# Wir holen jetzt zu dem Login noch den Namen (Vor- und Nachnamen)
my $ldap = &Delixs::Tools::bind_to_LDAP($ldap_base);
my $mesg = $ldap->search(base => "uid=$login,ou=people,ou=accounts,$ldap_base",
filter => 'objectClass=inetOrgPerson',
attrs => ['cn'] ); # cn - common name
if ($mesg->count == 0) { die "User $login nicht im LDAP gefunden!"; }
my $entry = ($mesg->entries)[0]; # nur ein Element in der Liste
my $name = $entry->get_value('cn'); # cn - common name
return $name;
}
# Aufruf: ($themen_lref, $urls_lref) = &read_projektdata( $file );
sub read_projektdata {
my $file = shift;
my (@daten, $key, $value);
my @themen = ();
my @urls = ();
open DATEI, "<", $file or die "konnte Datei $file nicht einlesen! $!\n";
@daten = <DATEI>;
close DATEI;
foreach my $zeile (@daten) {
unless ($zeile =~ /^\s*$/ or $zeile =~ /^#/) { # Leerzeile + Kommentarzeile ignoriert
chomp $zeile; # Zeilenumbruch entfernt
($key, $value) = split /\s*=>\s*/, $zeile; # wir trennen Key und Value
# wir entfernen Leerzeichen am Anfang und Ende vom Key und vom Value
if ($key =~ /^\s*(.*)\s*$/) { $key = $1 }
if ($value =~ /^\s*(.*)\s*$/) { $value = $1 }
# wir entfernen einfache Anführungszeichen vom Key und vom Value
if ($key =~ /^'(.*)'$/) { $key = $1 }
if ($value =~ /^'(.*)'$/) { $value = $1 }
# wir entfernen doppelte Anführungszeichen vom Key und vom Value
if ($key =~ /^"(.*)"$/) { $key = $1 }
if ($value =~ /^"(.*)"$/) { $value = $1 }
# wir stecken den Key in die Liste @themen und den Value in die Liste @urls
push @themen, $key;
push @urls, $value;
}
}
return \@themen, \@urls;
}
# Aufruf: &init_file_userdata( $login );
sub init_file_userdata {
my $login = shift;
my $file = 'wertung/' . $login . '.txt';
open DATEI, '>', $file or die "konnte Datei $file nicht anlegen! $!\n";
close DATEI;
}
# aufruf: %data = get_data();
# wir greifen auf globale Variablen zurück
sub get_data {
my %myhash = ();
$myhash{pc} = $pc;
$myhash{name} = $name;
$myhash{login} = $login;
$myhash{ip} = $ip;
$myhash{thema} = $themen[$nr]; # Index in Listen ist 1 kleiner als $nr
$myhash{url} = $urls[$nr];
$myhash{nr} = $nr++;
return %myhash;
}
# Aufruf: &next_formular( $template_formular, %data );
sub next_formular {
my $file = shift;
my %param = @_;
# wir lesen die Vorlage (Template) ein
open DATEI, $file or die "konnte Datei $file nicht öffnen! $!\n";
my @text = <DATEI>;
close DATEI;
# als erstes einer Webseite muss immer der Content-Type angegeben werden
print "Content-type: text/html\n\n";
# für jeder Zeile der Vorlage
foreach my $zeile (@text) {
# ersetzen wir alle Platzhalter %%%XXXXX%%%
$zeile =~ s/%%%nr%%%/$param{nr}/;
$zeile =~ s/%%%pc%%%/$param{pc}/;
$zeile =~ s/%%%name%%%/$param{name}/;
$zeile =~ s/%%%login%%%/$param{login}/;
$zeile =~ s/%%%ip%%%/$param{ip}/;
$zeile =~ s/%%%thema%%%/$param{thema}/;
$zeile =~ s/%%%url%%%/$param{url}/;
# und geben die Zeile aus
print $zeile;
}
}
# Aufruf: $data = &get_data_bewertung();
# hier wird auf die globale Variable %para und $nr zugegriffen!
sub get_data_bewertung {
my $erg = $nr; # Initialisieren des Ergebnisses
# wir holen uns alle Ergebnisse des Formulars
foreach my $x ('nav','eindruck','start','werk','person',
'skizze','alternat','bedeut','link','impress'){
# und hängen die in dieser Reihenfolge an den String dran
$erg .= ':'.param($x);
}
return $erg; # $erg sieht z.B. so aus: 8:3:2:1:2:3:4:5:2
}
# Aufruf: &save_userdata( $pfad, $login, $data );
sub save_userdata {
my $pfad = shift;
my $login = shift;
my $data = shift;
open DATEI, '>>', $pfad . 'wertung/' . $login . '.txt';
print DATEI $data . "\n";
close DATEI;
}
__END__