#!/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__