Online Abstimmungen und Umfragen
Listing der verwendeten Skripte
Diese Dateien stehen unter Creative Commons Lizenz CC BY-NC-SA 3.0, d.h. man/frau kann den Inhalt vervielfältigen, verbreiten und öffentlich zugänglich machen,Abwandlungen und Bearbeitungen des Werkes bzw. Inhaltes anfertigen bei Namensnennung, keine kommerzielle Nutzung und Weitergabe unter gleichen Bedingungen.
Zurück zu Online-Abstimmungen und Umfragen
Das Skript configWahl
#!/usr/bin/perl
#
# --- --- --- --- --- --- --- -------
#
# Eine Abstimmung erzeugen
#
# Dem Veranstalter der Abstimmung werden rechtliche Hinweise gegeben und die
# möglichen Wahloptionen dargestellt. Er muss seinen Namen und seine Mailadresse
# angeben. Er muss eine Endedatum für die Abstimung festlegen.
# Er kann wählen ob die Abstimmungsberechtigten das Ergebnis zugeschickt bekommmen.
# Er kann die Namen und Maildressen von bis zu 20 Wählern angeben und
# einen Erläuterungstext für die zu verschickenden Mails eingeben.
# Es gibt die Wahl-Möglichkeit des [x] ankreuzen (Checkbox) und der Abstimmung
# mit Auswahl (o) ja-nein-enthalten (RadioButton).
# Dann kann er bis zu 9 Optionen, Fragen, Kandidaten zur Abstimmung stellen.
# Nach Absenden des Formulars werden für jeden Abstimmungsberechtigten ein
# eineindeutiger Token erzeugt und dieser per Mail verschickt.
# Dem Veranstalter der Abstimmung werden die ausgewählten Abtsimmungsoptionen
# zur Kontrolle angezeigt.
# Das Ergebnis der Abstimmung wird ihm nach Ablauf des Endedatums per Mail zugeschickt.
#
# (CC BY-NC-SA 3.0) R. Hammerschmidt, Aktion Freiheit statt Angst e.V., Juni 2011
#
# --- --- --- --- --- --- --- -------
#
{
# -- Unterprogramme
# -- Einige Standardausgaben für die Webseite aufbauen
#
sub Header
{ print "Content-type: text/html\n\n";
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
print "<html>\n";
print "<head>\n";
print "<title>Abstimmung erzeugen</title>\n";
print "</head>\n";
print "<body bgcolor=\"#E5FFE0\" text=\"#000000\" link=\"#0000FF\" vlink=\"#3080FF\"alink=\"#aa00aa\">\n";
print "<span style=\"font-size: 12px;font-family:'sans-serif'\">\n";
print "<img src=\"/images/icons/201107rechenbrett.jpg\" width=\"80\">\n";
print "<a href=\"http://www.aktion-freiheitstattangst.org/\"><img src=\"/images/logo/logo_fsa_01.jpg\" width=\"400\"></a>\n";
print "<img src=\"/images/icons/201107rechenbrett.jpg\" width=\"80\">\n";
print "<hr>\n";
print "<h3>Abstimmungen / Umfragen leicht gemacht.</h3>\n";
print "Dieses Tool soll Ihnen ermöglichen zu beliebigen Themen Umfragen oder Abstimmungen zu gestalten.\n";
print "Da wir uns für den Datenschutz einsetzen, haben wir versucht das Tool sicher und anonym zu gestalten.<p>\n";
print "Folgende Möglichkeiten stehen zur Verfügung:<br>\n";
print "<ul><li>Es können bis zu 20 Teilnehmer befragt werden. (Die Begrenzung ist als Spam-Schutz gedacht.)\n";
print "<li>Es können bis zu 9 Optionen/Kandidaten abgefragt werden.\n";
print "<li>Als Antworten können \"ja-nein-enthalten\" (Radio Button) oder \"ankreuzen\" (Checkbox) ausgewählt werden.\n";
print "<li>Die Befragten bekommen eine Mail mit einem eindeutigen Token, der nur eine Abstimmung zulässt.\n";
print "<li>Mehrmaliges Wählen ist nicht möglich.\n";
print "<li>Der Veranstalter der Abstimmung erhät nach Ablauf der Abstimmung eine Mail mit dem Ergebnis.\n";
print "<li>Die Befragten bekommen den Stand der Befragung weder beim Wählen noch im Nachhinein zur Kenntnis.\n";
print "<li>Die Befragten erhalten keine Kenntniss über ihre Mitwähler oder deren Wahlverhalten.\n";
print "<li>Der Stand der Wahl oder das Ergebnis werden von keinem Mitarbeiter von Aktion FsA e.V. angeschaut. Nach dem Ende der Wahl und dem Verschicken per Mail an den Veranstalter der Abstimmung wird die Ergebnisdatei gelöscht. \n";
print "<li><b>Haftungsausschluß:</b> Aktion FsA e.V. stellt lediglich dieses Tool zur Verfügung und übernimmt keine Garantie für die Richtigkeit und Vollständigkeit der Ergebnisse der Umfrage, noch für Folgen daraus.\n";
print "<li>Aktion FsA e.V. bemüht sich den Service dauerhaft anzubieten, übernimmt jedoch keine Garantie für die Funktion über den gesamten Abtsimmungszeitraum.\n";
print "<li>Der Nutzer des Tools verpflichtet sich damit keine Inhalte zu verbreiten, die rechtswidrig, schädigend, bedrohend, missbräuchlich, belästigend, unerlaubt, verleumderisch, vulgär, obszön, unanständig, persönlichkeitsrechtsverletzend, hasserfüllt oder rassisch, ethnisch oder anderweitig anstößig sind.\n";
print "<li><b>Der Nutzer bestätigt die Kenntnisnahme dieser Bedingungen mit dem Absenden des Abstimmungsformulars.</b>\n";
print "<li>Aktion FsA wünscht viel Erfolg und freut sich über jede Form der Rückmeldung, z.B. per Mail an <a href=mailto:kontakt\@aktion-fsa.de>kontakt\@aktion-fsa.de</a> oder\n";
print "schreiben Sie uns Ihre Meinung zu diesem Tool direkt unter <a href=\"http://www.aktion-freiheitstattangst.org/kampagnen/76-anti-ueberwachung/2235-anonyme-abstimmungen-und-umfragen\">Anonyme Abstimmungen und Umfragen</a><br>\n";
print "</ul><hr>\n";
}
#
# -- Webseite abschliessen
#
sub Tail
{ print "</span>\n";
print "</body>\n";
print "</html>\n";
}
#
# -- Formular Webseite anzeigen
#
sub Formular
{ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
$year=$year-100; $mon=sprintf("%.2d",$mon+1); $mday=sprintf("%.2d",$mday);
$startdat=join('.',$mday,$mon,$year);
# -- Eingabe Formular darstellen
Header;
print "<form action=\"configWahl.pl\" method=\"post\" >\n";
print "<h3>Abstimmung starten</h3> <p>\n";
print "Die Abstimmung startet heute ($startdat) mit dem Abschicken des Formulars.<p>\n";
print "<input type=\"hidden\" name=\"startdat\" size=\"3\" maxlength=\"30\" value=\"$startdat\"> \n";
print "<b>Name und Mailadresse des für die Wahl Verantwortlichen</b><br> \n";
print "Name: <input type=\"text\" name=\"nammast\" size=\"30\" maxlength=\"60\"><p> \n";
print "Mailadresse des für die Wahl Verantwortlichen:<br> \n";
print "<input type=\"text\" name=\"master\" size=\"40\" maxlength=\"60\"><br> \n";
print "An diese Mailadresse wird das Ergebnis nach Ablauf der Wahl geschickt.<p> \n";
print "Bitte ankreuzen, wenn das Abstimmungsergebnis zusätzlich an alle Beteiligten verschickt werden soll. \n";
print "<input type=\"checkbox\" name=\"alleMail\"> <p> \n";
print "Welches soll der letzte Tag der Abstimmung sein (dd.mm.yy)? \n";
print "<input type=\"text\" name=\"enddat\" size=\"8\" maxlength=\"8\"><p> \n";
print "Nun bitte die Abstimmungsberechtigten angeben.<br> \n";
print "Bitte bis zu $anzPers Teilnehmer mit Anrede, Name, Mailadresse eingeben. (Anrede ist optional)<p>\n";
print "<table style=\"font-size: 12px;\">\n";
print "<tr><td></td><td>Anrede</td><td>Name</td><td>E-Mail</td></tr>\n";
for($i=1; $i<=$anzPers; $i++ )
{ $nr=sprintf("%.2d",$i); $Anr=join('',"anr",$nr);
$Nam=join('',"nam",$nr); $Mailad=join('',"mailadr",$nr);
print "<tr><td>$nr</td><td><input type=\"text\" name=\"$Anr\" size=\"5\" maxlength=\"10\" </td>\n";
print "<td><input type=\"text\" name=\"$Nam\" size=\"40\" maxlength=\"40\"</td> \n";
print "<td><input type=\"text\" name=\"$Mailad\" size=\"40\" maxlength=\"60\"</td></tr> \n";
}
print "</table><br>\n";
print "<p>Mailtext zur Erläuterung der Abstimmung (am besten mit einem erklärenden Titel)<br>\n";
# print "<input type=\"text\" name=\"txt\" size=\"80\" maxlength=\"800\" \n";
print "<textarea name=\"txt\" cols=\"70\" rows=\"10\"></textarea>\n";
print "<p><b>Art der Wahl</b><br>(Sollen nur Optionen beliebig angekreuzt werden oder bei jeder Option Ja-Nein-Enthaltung?)<br>\n";
print "<p>[X] CheckBox oder (o) RadioButton mit Ja-Nein-Enthaltung?<br>\n";
print "<input type=\"radio\" name=\"art\" value=\"cb\"> als CheckBox<br> \n";
print "<input type=\"radio\" name=\"art\" value=\"rb\" checked> als RadioButton<p>\n";
print "<b>Die Wahloptionen,</b> bzw. eine Frage, Behauptung oder ein Kandidat (max. 80 Zeichen)<br>\n";
print "1 <input type=\"text\" name=\"op1\" size=\"40\" maxlength=\"80\"><br> \n";
print "2 <input type=\"text\" name=\"op2\" size=\"40\" maxlength=\"80\"><br> \n";
print "3 <input type=\"text\" name=\"op3\" size=\"40\" maxlength=\"80\"><br> \n";
print "4 <input type=\"text\" name=\"op4\" size=\"40\" maxlength=\"80\"><br> \n";
print "5 <input type=\"text\" name=\"op5\" size=\"40\" maxlength=\"80\"><br> \n";
print "6 <input type=\"text\" name=\"op6\" size=\"40\" maxlength=\"80\"><br> \n";
print "7 <input type=\"text\" name=\"op7\" size=\"40\" maxlength=\"80\"><br> \n";
print "8 <input type=\"text\" name=\"op8\" size=\"40\" maxlength=\"80\"><br> \n";
print "9 <input type=\"text\" name=\"op9\" size=\"40\" maxlength=\"80\"><br> \n";
print "<input type=\"submit\" value=\"Absenden und Abstimmung starten\"> \n";
print "<input type=\"reset\" value=\"Abbrechen\"> \n";
print "</form><br>\n";
print "Hiermit bestätige ich die Kenntnisnahme und Einhaltung der oben genannten Bedingungen.</b><br>\n";
print "(Bitte Geduld, es dauert 1 Sekunde pro Abstimmenden um die Token zu berechnen.)\n";
Tail;
}
# --- --- --- --- --- --- ------
#
# -- Mails mit Einladung zur Abstimmung verschicken an alle Teilnehmer mit einem
# -- Einladungstext und einem eineindeutigen Token verschicken
#
sub sendMail
{ print "<hr>\n"; $anz=0;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
$year=$year+1900;
$min=sprintf("%.2d",$min);
$sec=sprintf("%.2d",$sec);
$hour=sprintf("%.2d",$hour);
my @monNam = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
my @dayNam = qw( Sun Mon Tue Wed Thu Fri Sat );
# $now = localtime;
for($i=0; $i<=$#ma; $i++)
{
($hasi,$tmp)=split(' ',$has[$i],2); $hasi=~ s/\n//; $anz++;
print "$anz: Eine Mail an $an[$i] $na[$i] mit Adresse $ma[$i] wurde verschickt.<br>\n";
open(MAIL,"|/maildat/sendmail -bs >/dev/null") || die;
print MAIL "HELO mail.aktion-fsa.de\n";
print MAIL "MAIL FROM: kontakt\@aktion-fsa.de\n";
print MAIL "RCPT TO: $ma[$i]\n";
print MAIL "DATA\n";
# print MAIL "Date: $now +0200\r\n";
print MAIL "Date: $dayNam[$wday], $mday $monNam[$mon] $year $hour:$min:$sec +0200\r\n";
print MAIL "From: rh\@aktion-fsa.de\r\n";
print MAIL "Subject: Aufruf zur Abstimmung fuer \"$na[$i]\" \r\n";
print MAIL "To: $ma[$i]\r\n";
# print MAIL "Content-Type: text/plain; charset=UTF-8\r\n";
print MAIL "Content-Type: text/plain; charset=ISO-8859-1\r\n";
print MAIL "Content-Transfer-Encoding: 8bit\r\n";
print MAIL "\r\n";
print MAIL "$nammast mit der Mailadresse $mastermail hat Sie zur Abstimmung, bzw. Umfrage \"$survey\" eingeladen:\r\n";
print MAIL "\r\n";
print MAIL "$mailtxt\r\n";
print MAIL "\r\n";
print MAIL "\r\n";
print MAIL "Um an der Abstimmung teilzunehmen, muss der nachfolgende Link angeklickt werden.\r\n";
print MAIL "Achtung! Der Link sollte nur aus einer Zeile ohne Zeilenwechsel bestehen.\r\n";
print MAIL "<http://aktion-freiheitstattangst.org/cgi-bin/makeWahl.pl?S=$survey&H=$hasi> \r\n";
print MAIL "\r\n";
print MAIL "-- \r\n";
print MAIL "Sollten Sie den Absender der Mail $mastermail nicht kennen, so ignorieren Sie diese Nachricht.\r\n";
print MAIL "Aktion Freiheit statt Angst e.V. stellt lediglich das verwendete Umfragetool kostenlos bereit.\r\n";
print MAIL "Sollten Sie wiederholt unverlangt Mails mit diesem Tool bekommen, so teilen Sie uns dies bitte mit.\r\n";
print MAIL "kontakt\@aktion-fsa.de</a>\r\n";
print MAIL "\r\n";
print MAIL ".\r\n";
close(MAIL);
}
} # Subroutine fertig
#
# --- --- --- --- --- ----------
sub Umlaute # UTF-8 Umlaute umwandeln (wird nicht benötigt)
{
$ae=join('',chr(195),chr(164)); # À
$oe=join('',chr(195),chr(182)); # ö
$ue=join('',chr(195),chr(188)); # Ì
$Ae=join('',chr(195),chr(132)); # Ã
$Oe=join('',chr(195),chr(150)); # Ã
$Ue=join('',chr(195),chr(144)); # Ã
$wae=join('',chr(228)); # Ì
$woe=join('',chr(246)); # Ì
$wue=join('',chr(252)); # Ì
$wAe=join('',chr(196)); # Ì
$wOe=join('',chr(214)); # Ì
$wUe=join('',chr(220)); # Ì
$wss=join('',chr(223)); # ss
$_ =~ s/$ae/ae/g; # Umlaute korr.
$_ =~ s/$oe/oe/g;
$_ =~ s/$ue/ue/g;
$_ =~ s/$Ae/Ae/g;
$_ =~ s/$Oe/Oe/g;
$_ =~ s/$Ue/Ue/g;
$_ =~ s/$wae/ae/g;
$_ =~ s/$woe/oe/g;
$_ =~ s/$wue/ue/g;
$_ =~ s/$wAe/Ae/g;
$_ =~ s/$wOe/Oe/g;
$_ =~ s/$wUe/Ue/g;
$_ =~ s/$wss/ss/g;
} # Subroutine fertig
#
# --- --- --- --- --- ----------
sub Ausgabe # Bestätigung des Wahlbeginns
{
print "<br>Es darf nun gewählt werden.<br> \n";
print "<p><b>Zurück zu <a href=\"http://aktion-freiheitstattangst.org\">Aktion Freiheit statt Angst</a> \n";
} # Subroutine fertig
#
# --- --- --- --- --- ---------
# -- Hauptprogramm
#
$anzPers=20; $anzOpt=9; # z.Zt. max. 20 Wähler und max. 9 Optionen
#
# -- ankommende Argumente beim Aufruf des Skripts lesen
if($ENV{'REQUEST_METHOD'} eq 'GET') { $Daten = $ENV{'QUERY_STRING'} }
else { read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'}); }
@Formularfelder = split(/&/, $Daten);
$anz=0;
foreach $Feld (@Formularfelder)
{ $anz++; ($name, $value) = split(/=/, $Feld);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;
push(@nlist,$name);
push(@vlist,$value);
} # end of saving parameter
if($#nlist < 0) # wenn keine Parameter, dann
# -- Formular anzeigen und ausfüllen lassen
{ Formular }
else
# -- Daten für die Abstimmung anzeigen und Abstimmung starten
{ Header; # HTML Header aufbauen
# print "$anz :: $#nlist<br>";
# for($i=0; $i<=$#nlist; $i++ ) {print "$nlist[$i] : $vlist[$i]<br>\n"}
# -- Parameterübergabe und Ausgabe
for($i=0; $i<=$#nlist; $i++ )
{ $_=$nlist[$i];
if(/startdat/)
{ $startdat=$vlist[$i] }
if(/enddat/)
{ $enddat=$vlist[$i];
($mday,$mon,$year)=split('\.',$enddat);
$mon=sprintf("%.2d",$mon); $mday=sprintf("%.2d",$mday);
$enddat=join('.',$mday,$mon,$year);
}
if(/alleMail/) {$alleMail=$vlist[$i]}
if(/nammast/) {$nammast=$vlist[$i]}
if(/master/) {$mastermail=$vlist[$i]}
if((/mailadr/)and($vlist[$i] ne ""))
{ push(@an, $vlist[$i-2]);
push(@na, $vlist[$i-1]); push(@ma, $vlist[$i]);
}
# if(/txt/) {$_=$vlist[$i]; Umlaute; $mailtxt=$_ } # nicht nötig, keine UTF-8 Umlaute
if(/txt/) {$_=$vlist[$i]; $mailtxt=$_ }
if(/art/) {$art=$vlist[$i]}
if((/op/)and($vlist[$i] ne ""))
{ push(@op, $vlist[$i])
}
}
for(@ma) { $adr=$_; sleep 1; # 1 Sek. Zeit vergehen lassen, für verschiedene Token
$timestamp = join(':',localtime);
open(TXT, ">/somewhere/tmp.tmp");
print TXT "$adr $timestamp\n";
close(TXT); # Token bilden
system("/usr/bin/md5sum /somewhere/tmp.tmp > /somewhere/tmp2.tmp");
open(TXT, "</somewhere/tmp2.tmp");
while(<TXT>) { push(@has,$_);
} Token abspeichern
close(TXT);
$_=$adr;
}
# -- alle temporären Dateien löschen
system("/bin/rm /somewhere/tmp*.tmp");
# -- für Survey eindeutigen Namen festlegen
# dazu Nr. der Umfrage um 1 erhöhen und mit Datum versehen
open(TXT, "</somewhere/SurvNr.txt");
while(<TXT>) {$snr=$_}
close(TXT);
$survey=join('-',"Survey",$startdat,$enddat,$snr);
$optidat=join('',$survey,".opti");
$optidat=join('/',"/somewhere",$optidat);
$hashdat=join('',$survey,".hash");
$hashdat=join('/',"/somewhere",$hashdat);
$snr++;
open(TXT, ">/somewhere/SurvNr.txt");
print TXT $snr;
close(TXT);
$wae=$#ma+1; $wop=$#op+1;
#
# -- Alle gewählten Wahloptionen dem Veranstalter anzeigen
print "<h3>Die Abstimmung wurde gestartet</h3>\n";
print "Bezeichnung der Abstimmung:<b> $survey</b><br> mit $wae Wähler(n) und $wop Wahloption(en)<hr><br>\n";
print "<b>verschickter Mailtext:</b> <p>$mailtxt<br><hr><b>Art der Wahl: </b>\n";
if($art=~ s/rb/rb/)
{ print "Abstimmung mit RadioButton <p>\n";
} else
{ print "Abstimmung mit Checkbox <p>\n";
}
print "<b>Die Wahloptionen lauten:</b> <p>\n";
for(@op)
{ # Umlaute; # nicht nötig, keine UTF-8 Umlaute
print "$_ <br>\n"
}
$allemail=$mastermail;
if($alleMail eq "on") # Das Ergebnis der Wahl soll an alle Wähler verschickt werden
{ print "Das Ergebnis der Abstimmung wird am Wahlabend an alle Wähler verschickt.<br>\n";
$allemail=join(':',$mastermail,@ma);
}
# -- Wahl vorbereiten
open(TXT, ">$optidat"); # Optionen ablegen
# # art AnzWaehler 0=schon gewaehlt Leitername LeiterMail+ua
print TXT "$art $wae 0 $nammast $allemail\n";
for(@op) { print TXT "$_ 0 0 0\n" }
close(TXT);
# system("/usr/bin/gpg "); # Abstimmungsliste verschluesseln (noch draft)
open(TXT, ">$hashdat"); # Token in der Hash-Datei ablegen
for(@has)
{ ($h,$t)= split(' ',$_,2); print TXT "$h\n"
}
close(TXT);
sendMail; # Mails verschicken
Ausgabe;
Tail; # HTML Datei abschließen
}
}
Das Skript makeWahl
#!/usr/bin/perl
#
# --- --- --- --- --- --- --- -------
#
# Abstimmung durchführen
#
# Das Skript wird durch den Abstimmungs-Link eines Wahlberechtigten aufgerufen.
# Nach Prüfung der Wahlberechtigung wird das Formular zur Wahl aufgebaut.
# Nach Absenden des Formulars wird die Berechtigung erneut geprüft und dieser Token gelöscht.
# Die Abstimmung wird zum bisherigen Wahlergebnis hinzu addiert.
# Unberechtigte Aufrufe der Seite ohne gültigen Token werden abgewiesen.
#
# (CC BY-NC-SA 3.0) R. Hammerschmidt, Aktion Freiheit statt Angst e.V., Juni 2011
#
# --- --- --- --- --- --- --- -------
#
{
# -- Unterprogramme
#
# -- Einige Standardausgaben für die Webseite aufbauen
#
sub Header
{ print "Content-type: text/html\n\n";
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
print "<html>\n";
print "<head>\n";
print "<title>Abstimmung durchführen</title>\n";
print "</head>\n";
print "<body bgcolor=\"#E5FFE0\" text=\"#000000\" link=\"#0000FF\" vlink=\"#3080FF\"alink=\"#aa00aa\">\n";
print "<span style=\"font-size: 12px;font-family:'sans-serif'\">\n";
print "<img src=\"/images/icons/201107rechenbrett.jpg\" width=\"80\">\n";
print "<a href=\"http://www.aktion-freiheitstattangst.org/\"><img src=\"/images/logo/logo_fsa_01.jpg\" width=\"400\"></a>\n";
print "<img src=\"/images/icons/201107rechenbrett.jpg\" width=\"80\">\n";
print "<p><b>Aktuelle Abstimmung durchführen</b><br>\n";
print "Aktion Freiheit statt Angst e.V. stellt hiermit ein kostenloses Umfragetool bereit.<br>\n";
print "Wir speichern keine persönlichen Daten von Ihnen. <br>\n";
print "Sie wurden zu dieser Abstimmung eingeladen vom Absender der von Ihnen angeklickten E-Mail. <br>\n";
print "Sollten Sie wiederholt unverlangt Mails mit diesem Tool bekommen, so teilen Sie uns dies bitte per Mail an <a href=\"mailto:kontakt\@aktion-fsa.de\">kontakt\@aktion-fsa.de</a> mit oder <br>\n";
print "schreiben Sie uns Ihre Meinung zu diesem Tool direkt unter <a href=\"http://www.aktion-freiheitstattangst.org/kampagnen/76-anti-ueberwachung/2235-anonyme-abstimmungen-und-umfragen\">Anonyme Abstimmungen und Umfragen</a><br>\n";
print "<p><b>Zur Website von <a href=\"http://aktion-freiheitstattangst.org\">Aktion Freiheit statt Angst</a></b> \n";
print "<hr>\n";
print "\n";
print "\n";
}
#
# -- Webseite abschliessen
#
sub Tail
{ print "</span>\n";
print "</body>\n";
print "</html>\n";
}
#
# -- Formular Webseite anzeigen
#
sub Formular
{
# -- Eingabe Formular für den Wähler darstellen
Header; # HTML Header
# print "$anz :: $#nlist<br>"; # 2 Zeilen Kontrollausgabe zum Testen
# for($i=0; $i<=$#nlist; $i++ ) {print "$i, $nlist[$i] : $vlist[$i]<br>\n"}
$survey=$vlist[0];
$hash=$vlist[1];
$optidat=join('',$survey,".opti");
$optidat=join('/',"/somewhere",$optidat); # Datei mit den Wahloptionen
$hashdat=join('',$survey,".hash");
$hashdat=join('/',"/somewhere",$hashdat); # Hashdatei mit den Token
open(IN, "<$hashdat"); # Hashes lesen und Berechtigung prüfen
$ok=0;
while(<IN>) { push(@has,$_);
if(/$hash/) {$ok=1} # Token in der Hashdatei gefunden
}
close(IN);
if($ok==0) # Ablehnung eines nicht Wahlberechtigten
{ print "Sorry, nicht in der Wählerliste gefunden<br>\n";
}
else
# -- Token ist ok, darf waehlen
{ $i=0;
open(IN, "<$optidat"); # Optionen lesen
while(<IN>) { if($i==0)
{ $i++; $_=~ s/\n//; $art=$_; # CheckBox oder RadioButton
} else
{ ($opti,$z1,$z2,$z3)=split(' ',$_);
push(@op,$_);
}
}
close(IN);
print "<form action=\"makeWahl.pl\" method=\"post\" >\n"; # Formular aufbauen
print "<b>Abstimmung starten</b><p>\n";
print "Zur Teilnahme an der Abstimmung <b>\"$survey\"</b><p>\n";
print "Es gibt folgende Wahlmöglichkeiten:<p>\n";
print "<p>Wahloptionen<br>\n";
$i=0;
if($art=~ s/rb/rb/ )
{ for(@op)
{ ($opti,$z1,$z2,$z3)=split(' ',$_);
$i++; print "Ja: <input type=\"radio\" name=\"$i\" value=\"ja\">| Nein: <input type=\"radio\" name=\"$i\" value=\"nein\">| Enthaltung: <input type=\"radio\" name=\"$i\" value=\"enth\" checked> $opti<br> \n";
}
} else
{ for(@op)
{ ($opti,$z1,$z2,$z3)=split(' ',$_);
print "<input type=\"checkbox\" name=\"wahl\" value=\"$opti\"> $opti<br> \n";
}
}
print "<p><input type=\"hidden\" name=\"dum\" size=\"3\" maxlength=\"30\" value=\"dummy\"> \n";
print "<p><input type=\"hidden\" name=\"s\" size=\"3\" maxlength=\"30\" value=\"$survey\"> \n";
print "<p><input type=\"hidden\" name=\"h\" size=\"3\" maxlength=\"30\" value=\"$hash\"> \n";
print "Der Token \"$hash\" wird mit dieser <br> \n";
print "Abstimmung gelöscht und kann nicht erneut verwendet werden.<br> \n";
print "<p><input type=\"submit\" value=\"Abstimmen\"> \n";
print "<input type=\"reset\" value=\"Abbrechen\"><p> \n";
print "</form>\n";
}
Tail; # HTML Datei abschließen
} # Subroutine fertig
#
# --- --- --- --- --- ----------
sub Ausgabe # Bestätigung des Wahlvorgangs
{
print "<b>Abstimmung ist erfolgreich verlaufen.</b><p> \n";
print "Es wurde abgestimmt für:<br> \n";
for($i=0; $i<=$#vlist-3; $i++) # -3 wegen Token,Survey,Dummy
{ ($kan,$tmp)=split(' ',$vlist[$i],2);
if($art=~ s/rb/rb/)
{ $op[$i]=~ s/\n//; ($opti,$z1,$z2,$z3)=split(' ',$op[$i]);
print "$opti: ";
}
print "$kan<br>\n";
}
print "<p><b>Danke für die Beteiligung</b><br> \n";
} # Subroutine fertig
#
# --- --- --- --- --- ---------
# -- Hauptprogramm
#
# -- Argumente des Aufrufs lesen
if($ENV{'REQUEST_METHOD'} eq 'GET') { $Daten = $ENV{'QUERY_STRING'} }
else { read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'}); }
@Formularfelder = split(/&/, $Daten);
$anz=0;
foreach $Feld (@Formularfelder)
{ $anz++; ($name, $value) = split(/=/, $Feld);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;
push(@nlist,$name);
push(@vlist,$value);
} # end of saving parameter
if($#nlist <= 1) # 1. Aufruf des Wahlzettels mit Hash
# -- also Wahlzettel anzeigen und ausfüllen lassen
{ Formular }
# -- Wahl zählen und dem Wähler bestätigen
else
{ Header;
# -- Parameterübergabe und Ausgabe
# -- zuerst Berechtigung prüfen und Hash löschen
$survey=$vlist[$#vlist-1];
$hash=$vlist[$#vlist];
$optidat=join('',$survey,".opti");
$optidat=join('/',"/somewhere",$optidat);
$hashdat=join('',$survey,".hash");
$hashdat=join('/',"/somewhere",$hashdat);
$hash=$vlist[$#vlist]; $ok=0; if($hash eq "") {$hash="no token"}
open(TXT, "<$hashdat"); # Hashes lesen
while(<TXT>)
{ push(@has,$_); #print "aus datei $_<br>\n";
}
close(TXT);
open(TXT, ">$hashdat"); # Hashes schreiben und prüfen
for(@has)
{ if(/$hash/)
{ $ok=1; # Token ist ok, darf wählen
} else
{ print TXT $_;
}
}
close(TXT);
#
# -- ohne gültigen Token Wahl abbrechen und Skript beenden
if($ok==0) { print "Sorry, Token ohne Berechtigung<br>\n"; Tail; exit 1}
#
# -- bei gültigem Token Wahlergebnis zaehlen und dem Wähler bestätigen
$i=0;
open(IN, "<$optidat"); # Optionen lesen
while(<IN>)
{ if($i==0) # CheckBox oder RadioButton
{ $i++; $_=~ s/\n//; ($art,$maxMail,$anzMail,$nammast,$mastermail)=split(' ',$_);
} else
{ ($opti,$z1,$z2,$z3)=split(' ',$_);
push(@op,$_);
} }
close(IN);
$anzMail++; # ein Waehler hat zusaetzlich gewaehlt
open(TXT, ">$optidat"); # Optionen ablegen
print TXT "$art $maxMail $anzMail $nammast $mastermail\n";
$i=0;
for(@op)
{ $_=~ s/\n//; ($opti,$z1,$z2,$z3)=split(' ',$_);
if($art=~ s/rb/rb/)
{ if($vlist[$i]=~ s/ja/ja/) {$z1++} # ja-nein-enthalten zählen
if($vlist[$i]=~ s/nein/nein/) {$z2++}
if($vlist[$i]=~ s/enth/enth/) {$z3++}
} else
{ for(@vlist)
{ if(/$opti/) # wenn Checkbox angekreuzt,
{ $z1++; # dann zählen
}
}
}
print TXT "$opti $z1 $z2 $z3\n"; # Ergebnis abspeichern
$i++;
}
close(TXT);
Ausgabe; # Wahlerfolg dem Wähler bestätigen
Tail;
}
}
Das Skript sendResult
#!/usr/bin/perl
# --- --- --- --- --- --- --- -------
#
# Abstimmungsergebnis versenden
#
# Dieses Skript wird täglich um 23:59 vom Cron gestartet.
# Es prüft, ob Abstimmungen heute abgelaufen sind, verschickt die Ergebnisse
# und löscht die zugehörigen Ergebnis- und die Hash-Dateien.
# (CC BY-NC-SA 3.0) R. Hammerschmidt, Aktion Freiheit statt Angst e.V., Juni 2011
#
# --- --- --- --- --- --- --- -------
#
{ sub sendMail # Mail mit Ergebnis der Abstimmung verschicken
{ for(@adr)
{ $adresse=$_;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
$year=$year+1900;
$min=sprintf("%.2d",$min);
$sec=sprintf("%.2d",$sec);
$hour=sprintf("%.2d",$hour);
my @monNam = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
my @dayNam = qw( Sun Mon Tue Wed Thu Fri Sat );
print "Mail an Adresse $adresse fuer Abstimmung \"$dat\" wurde verschickt.\n";
open(MAIL,"|/maildat/sendmail -bs >/dev/null") || die;
print MAIL "HELO mail.aktion-fsa.de\n";
print MAIL "MAIL FROM: kontakt\@aktion-fsa.de\n";
print MAIL "RCPT TO: $adresse\n";
print MAIL "DATA\n";
print MAIL "Date: $dayNam[$wday], $mday $monNam[$mon] $year $hour:$min:$sec +0200\r\n";
print MAIL "From: rh\@aktion-fsa.de\r\n";
print MAIL "Subject: Ergebnis der Abstimmung fuer \"$dat\" \r\n";
print MAIL "To: $adresse\r\n";
# print MAIL "Content-Type: text/plain; charset=UTF-8\r\n";
print MAIL "Content-Type: text/plain; charset=ISO-8859-1\r\n";
print MAIL "Content-Transfer-Encoding: 8bit\r\n";
print MAIL "\r\n";
print MAIL "\r\n";
print MAIL "Das Ergebnis der Abstimmung fuer \"$dat\", zu der $nammast mit der Mailadresse $master eingeladen hatte, lautet: \r\n";
print MAIL "\r\n";
if($art=~ s/rb/rb/)
{ print MAIL "ja nein Enthaltung Wahloption, bzw. Kandidat \r\n";
}
else
{ print MAIL "angekreuzt Wahloption, bzw. Kandidat \r\n";
}
for(@op) { print MAIL $_,"\r\n"}
print MAIL "\r\n";
print MAIL "Von den $maxMail Wahlberechtigten haben $anzMail abgestimmt.\r\n";
print MAIL "\r\n";
print MAIL "Je nach Laenge der Begriffe koennen sich die Zahlen verschieben. \r\n";
print MAIL "Das Trennzeichen ist ein Tabulator. In einem Tabellenprogramm sollten \r\n";
print MAIL "die Ergebnisse richtig untereinander stehen. \r\n";
print MAIL "\r\n";
print MAIL "Vielen Dank fuer die Erprobung des Umfragetools.\r\n";
print MAIL "Bei Problemen sind wir fuer Hinweise an kontakt\@aktion-fsa.de dankbar.\r\n";
print MAIL "Eigene Umfragen erzeugen unter\r\n";
print MAIL "http://www.aktion-freiheitstattangst.org/cgi-bin/configWahl.pl\r\n";
print MAIL "\r\n";
print MAIL "Das Web-Team von Aktion FsA \r\n";
print MAIL "\r\n";
print MAIL ".\r\n";
close(MAIL);
}
}
} # Subroutine fertig
#
# --- --- --- --- --- ----------
# -- Hauptprogramm
#
$verz="/somewhere/"; # Arbeitsverzeichnis festlegen
opendir DIR, $verz || die "can't opendir $dir: $!";
@liste = readdir (DIR); # vorhanden Dateien listen
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
$year=$year-100; $mon=sprintf("%.2d",$mon+1); $mday=sprintf("%.2d",$mday);
$datum=join('.',$mday,$mon,$year); # heutiges Datum
for(@liste) # Gibt es in der Liste aller Dateien
{ @op=();
if(/opti/)
{ $dat=substr($_,0,length($_)-5); $ldat=join('',$verz,$_);
($sur,$start,$ende,$nr)=split('-',$_);
if($ende eq $datum) # eine Abstimmung, die heute endet?
{ $i=0;
open(TXT, "<$ldat"); # beendete Abstimmung lesen
while(<TXT>)
{ if($i==0)
# # art AnzahlWaehler habenGewaehlt LeiterName LeiterMail+ua
{ $i++; $_=~ s/\n//; ($art,$maxMail,$anzMail,$nammast,$master)=split(' ',$_);
# print"$art,$maxMail,$anzMail,$nammast,$master\n";
} else
{ $_=~ s/\n//; ($opti,$z1,$z2,$z3)=split(' ',$_);
if($art=~ s/rb/rb/)
{ $_=join(' ',$z1,$z2,$z3,$opti);
}
else
{ $_=join(' ',$z1,$opti);
}
push(@op,$_);
}
}
close(TXT);
# -- Mail(s) verschicken
# eine oder viele Adressen? ... und Veranstalter abtrennen
@adr=split(':',$master); # an alle Mailadressen
($master,$tmp)=split(':',$master,2);
sendMail; # Mail verschicken
system("/bin/rm $ldat"); # Ergebnis-Datei löschen
}
}
if(/hash/)
{ $ldat=join('',$verz,$_);
($sur,$start,$ende,$nr)=split('-',$_);
# print "$_\n$sur,$start,$ende,$nr\n";
if($ende eq $datum) # wenn Endedatum erreicht,
{ system("/bin/rm $ldat"); # Hash-Datei löschen
}
}
}
Kategorie[40]: Anti-Überwachung Short-Link dieser Seite: a-fsa.de/d/1Ex
Link zu dieser Seite: https://www.aktion-freiheitstattangst.org/de/articles/2278-listing-der-skripte-fuer-das-abstimmungstool.htm
Link im Tor-Netzwerk: http://a6pdp5vmmw4zm5tifrc3qo2pyz7mvnk4zzimpesnckvzinubzmioddad.onion/de/articles/2278-listing-der-skripte-fuer-das-abstimmungstool.htm
Tags: #e-voting #Anti-Ueberwachung #Selbstschutz #Online #Abstimmungen #UmfragenListing #Quellcode #Skripte #Perl
Erstellt: 2011-07-01 11:40:41 Aufrufe: 5493
Kommentar abgeben