diff -r -u usevoteger-4.11/CHANGES usevoteger-4.12/CHANGES
--- usevoteger-4.11/CHANGES	2012-09-25 22:16:06.000000000 +0200
+++ usevoteger-4.12/CHANGES	2014-02-16 20:27:39.493319000 +0100
@@ -1,18 +1,39 @@
-UseVoteGer Versionshistorie (aktuelle Version: 4.11, released 25.09.2012)
+UseVoteGer Versionshistorie (aktuelle Version: 4.12, released 28.02.2014)
 =========================================================================
 
 TODO:
 - aussortieren von Bounces aus Stimmenliste
-- [Zugschlus] ich fänd es klasse, wenn man eine Kopie des Wahlscheines ins
-Abstimmungsverzeichnis legt und Usevote einem dann auf Abruf ein diff
-oder wdiff zwischen Sollwahlschein und wirklich eingreichtem
-Wahlschein macht. Auf diese Weise erwischt man auch kleine Änderungen
-am Datenschutzhinweis (da bin ich eben in eine Falle von th-h getappt).
+
+Version 4.12 (28.02.2014):
+- uvbounce.pl und uvballot.pl benutzen jetzt wieder den uebergebenen
+  Dateinamen statt irrtuemlich das Mailboxfile aus usevote.cfg
+  (Bugfix in UVreadmail.pm)
+- UVreadmail.pm setzt beim Schreiben eines Mailarchivs nun einen
+  Timestamp in der mbox-Fromline, der aus der Mail stammt
+  (timestamp()-Funktion von Mail::Box) statt dem aktuellen Datum
+- UVreadmail.pm laesst nun Mailboxdateien bzw. -ordner bestehen,
+  auch wenn sie leer sind, um Kompatibiliaetsprobleme mit anderen
+  Programmen zu vermeiden
+- neue Config-Optionen "diff" und "sampleballotfile"
+- im Fehlermenue bei der Wahlscheinverarbeitung ist es nun moeglich,
+  mit der Option "0" einen Dateivergleich (diff) zwischen dem gemailten
+  Wahlschein und einem Musterwahlschein (wie im CfV geposted) zu starten.
+  Dazu muss die Config-Option "sampleballotfile" gesetzt und die Datei
+  vorhanden sein (Standard-Dateiname: ballot.sample)
+- im Fehlermenue wird nun der Name der Abstimmung als Ueberschrift
+  angezeigt. Ausserdem wurde in UVmenu.pm ein redundanter Code-Abschnitt
+  entfernt
+- BDSG-Klausel muss nun standardmaessig zwingend mit JA beantwortet
+  werden, DAFUER wird nicht mehr akzeptiert. Dies kann in usevote.cfg
+  konfiguriert werden
+- Regular Expression fuer Pruefung des Abstimmungsnamens weiter
+  verbessert
+- Standardwert fuer Mindest-JA-Stimmenzahl von 60 auf 50 verringert
 
 Version 4.11 (25.09.2012):
 - Regular Expression fuer Pruefung des Abstimmungsnamens verbessert.
   Es kam zu vielen False Positives
-- Einlesen der Mailbox auf Perlmodule Mail::Box umgestellt, damit
+- Einlesen der Mailbox auf Perlmodul Mail::Box umgestellt, damit
   auch Maildir moeglich (neue Option "mailboxtype" in usevote.cfg).
   Archivierung erfolgt aber vorerst weiterhin immer als mbox
 
diff -r -u usevoteger-4.11/messages.cfg usevoteger-4.12/messages.cfg
--- usevoteger-4.11/messages.cfg	2012-01-14 22:51:38.000000000 +0100
+++ usevoteger-4.12/messages.cfg	2014-01-19 20:07:31.624491000 +0100
@@ -42,6 +42,7 @@
 MENU_VIOLATEDRULE = Regel ${RULE} verletzt.
 MENU_PROBLEMS = Die folgenden Probleme muessen beseitigt werden:
 MENU_CAPTION = Auswahlmenue:
+MENU_DIFF_BALLOT = Wahlschein mit Original vergleichen (diff)
 MENU_SHOW_MAIL = Anzeigen der Wahlmail
 MENU_CHANGE_PROPERTIES = Bestaetigen oder Aendern von Wahlschein-Eigenschaften:
 MENU_ADDRESS = Mailadresse
diff -r -u usevoteger-4.11/README usevoteger-4.12/README
--- usevoteger-4.11/README	2012-09-25 22:15:33.000000000 +0200
+++ usevoteger-4.12/README	2014-02-16 20:26:06.075712000 +0100
@@ -1,4 +1,4 @@
-UseVoteGer 4.11  (c) 2001-2012 Marc Langer
+UseVoteGer 4.12  (c) 2001-2014 Marc Langer
 
 UseVoteGer is a voting software for usenet votes.
 
@@ -18,7 +18,7 @@
  
 -------------------------------------------------------------------------------
 
-UseVoteGer 4.11 - Usenet-Abstimmungssoftware
+UseVoteGer 4.12 - Usenet-Abstimmungssoftware
 ===========================================
 
 von Marc Langer <uv@marclanger.de>
@@ -324,6 +324,7 @@
 sollten im Abstimmungsverzeichnis vorhanden sein (notwendig ist nur
 usevote.cfg, darin können alle anderen Pfade angepasst werden):
 
+ballot.sample
 bdsgtext.cfg
 mailpatterns.cfg
 messages.cfg
@@ -404,6 +405,7 @@
 Meistens gibt es folgende Moeglichkeiten, die durch die
 eingeklammerten Buchstaben und Zahlen aufgerufen werden koennen:
 
+(0) Wahlschein mit Original vergleichen (diff)
 (1) Anzeigen der Wahlmail
 
 Bestaetigen oder Aendern von Wahlschein-Eigenschaften:
@@ -412,6 +414,7 @@
 (4) Stimmen
 (5) Scheinkennung
 (6) Datenschutzklausel
+(7) Abstimmung
 
 (i) Diese Stimme ignorieren (ohne Benachrichtigung verwerfen)
 (w) Weiter
@@ -426,8 +429,11 @@
 Nun solltest Du zunaechst mit (1) die Mail ansehen und anhand
 der bemaengelten Punkte entscheiden, ob der Wahlschein gueltig
 oder ungueltig ist bzw. welche Maengel tatsaechlich zutreffen.
+Mit (0) kannst Du einen Dateivergleich zu einem vorher hinterlegten
+Musterwahlschein ausfuehren ("diff"), um Aenderungen/Fehler schneller
+zu sehen.
 
-Mit den Optionen (2) bis (6) kannst Du einzelne Eigenschaften
+Mit den Optionen (2) bis (7) kannst Du einzelne Eigenschaften
 des Wahlscheins nachbessern (wenn Usevote z.B. einen Namen oder
 eine Stimme nicht korrekt erkannt hat) oder auch einfach die
 Korrektheit bestaetigen.
@@ -685,6 +691,10 @@
   eingeschaltet und die Option -f (siehe unten) nicht benutzt wurde,
   werden die uebergebenen Dateinamen ignoriert.
 
+  Die Mails werden aus den uebergebenen Mailboxdateien geloescht
+  und statt dessen in einer neuen Datei mit der Erweiterung ".processed"
+  gespeichert.
+
   Die Vorlage fuer die ausgegebene Liste ist im templates-
   Unterverzeichnis konfigurierbar (Datei "bouncelist").
 
@@ -957,6 +967,7 @@
 votename         Name der Abstimmung
 group1           Erster Abstimmungsgegenstand
 group2           Zweiter (und so weiter durchnummerieren)
+sampleballotfile Datei mit Musterwahlschein aus dem CfV fuer Dateivergleich (diff)
 votefile         Mailbox mit eingehenden Stimmen (falls POP3 ausgeschaltet)
 mailboxtype      Typ der Mailbox (mbox, maildir)
 personal         Personalisierte Wahlscheine verwenden? [BOOL]
@@ -1025,6 +1036,10 @@
                  oder Betriebssystem keinen solchen Befehl bereitstellen,
                  sollte ein Kommando verwendet werden, welches eine Trennlinie
                  oder aehnliches auf dem Bildschirm ausgibt, z.B. mit "echo"
+diff             Shellbefehl zum Dateivergleich (diff); es koennen auch 
+                 Parameter angegeben werden, z.B. "diff -u". Das verwendete
+                 Programm muss das Lesen einer Datei von STDIN erlauben
+                 ("-" statt Dateinamen fuer Einlesen von Standardeingabekanal)
 pager            Shellbefehl zum seitenweisen Darstellen von Mails auf dem
                  Bildschirm (normalerweise "less"). Unter Windows muss "more"
                  benutzt werden, unter Unix hingegen gibt es moeglicherweise
diff -r -u usevoteger-4.11/usevote.cfg usevoteger-4.12/usevote.cfg
--- usevoteger-4.11/usevote.cfg	2012-09-25 22:10:18.000000000 +0200
+++ usevoteger-4.12/usevote.cfg	2014-02-16 11:57:37.131476000 +0100
@@ -77,6 +77,10 @@
 condition1 = $yes>=2*$no
 condition2 = $yes>=50
 
+# Datei mit Musterwahlschein, wie er im CfV geposted wurde. Wird fuer
+# Vergleich mit ankommenden Wahlscheinen per "diff" genutzt.
+sampleballotfile = ballot.sample
+
 # Ergebnisdatei, in der alle Einzelergebniss zusammengeschrieben werden
 # (wird bei jedem Programmlauf neu erstellt!)
 resultfile = ergebnis.alle
@@ -208,6 +212,9 @@
 # Windows-Verzeichnis kopieren (URL siehe README-Datei)
 pager = less
 
+# Shellbefehl fuer Dateivergleich
+diff = diff
+
 # Datei mit diversen Meldungen und Textfragmenten (Resourcendatei)
 messagefile = messages.cfg
 
@@ -274,6 +281,10 @@
 # Achtung, sollte auch in den Templates im Bestaetigungstext angepasst werden
 ann_stimme = A\s*N\s*N\s*U\s*L\s*L\s*I\s*E\s*R\s*U\s*N\s*G
 
+# RegExp fuer Bestaetigung der Datenschutzklause (case-insensitive)
+# Standardmaessig wird nur JA erkannt
+bdsg_confirm = JA
+
 # Template files (these files are in the template directory defined above)
 tpl_mailheader = "mailheader"            # generally used mail header
 tpl_bouncelist = "bouncelist"            # used by uvbounce.pl
diff -r -u usevoteger-4.11/uvballot.pl usevoteger-4.12/uvballot.pl
--- usevoteger-4.11/uvballot.pl	2012-09-25 20:20:07.000000000 +0200
+++ usevoteger-4.12/uvballot.pl	2014-01-19 19:39:49.664188000 +0100
@@ -1,8 +1,8 @@
 #!/usr/bin/perl -w
 
 ###############################################################################
-# UseVoteGer 4.11 Wahlscheingenerierung
-# (c) 2001-2012 Marc Langer <uv@marclanger.de>
+# UseVoteGer 4.12 Wahlscheingenerierung
+# (c) 2001-2014 Marc Langer <uv@marclanger.de>
 # 
 # This script package is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Public License as published by the
diff -r -u usevoteger-4.11/uvbounce.pl usevoteger-4.12/uvbounce.pl
--- usevoteger-4.11/uvbounce.pl	2012-09-25 20:20:11.000000000 +0200
+++ usevoteger-4.12/uvbounce.pl	2014-01-19 19:39:57.931407000 +0100
@@ -1,8 +1,8 @@
 #!/usr/bin/perl -w
 
 ###############################################################################
-# UseVoteGer 4.11 Bounce-Verarbeitung
-# (c) 2001-2012 Marc Langer <uv@marclanger.de>
+# UseVoteGer 4.12 Bounce-Verarbeitung
+# (c) 2001-2014 Marc Langer <uv@marclanger.de>
 # 
 # This script package is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Public License as published by the
diff -r -u usevoteger-4.11/uvcfv.pl usevoteger-4.12/uvcfv.pl
--- usevoteger-4.11/uvcfv.pl	2012-09-25 20:20:14.000000000 +0200
+++ usevoteger-4.12/uvcfv.pl	2014-01-19 19:40:02.311614000 +0100
@@ -1,8 +1,8 @@
 #!/usr/bin/perl -w
 
 ###############################################################################
-# UseVoteGer 4.11 Personalisierte Wahlscheine
-# (c) 2001-2012 Marc Langer <uv@marclanger.de>
+# UseVoteGer 4.12 Personalisierte Wahlscheine
+# (c) 2001-2014 Marc Langer <uv@marclanger.de>
 # 
 # This script package is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Public License as published by the
diff -r -u usevoteger-4.11/UVconfig.pm usevoteger-4.12/UVconfig.pm
--- usevoteger-4.11/UVconfig.pm	2012-09-25 22:18:44.000000000 +0200
+++ usevoteger-4.12/UVconfig.pm	2014-02-16 20:25:41.307469000 +0100
@@ -18,7 +18,7 @@
 $VERSION = "0.18";
 
 # Usevote version
-$usevote_version = "UseVoteGer 4.11";
+$usevote_version = "UseVoteGer 4.12";
 
 sub read_config {
 
@@ -27,6 +27,7 @@
   # Default configuration options (overwritten in usevote.cfg)
   %config = (votefile             => "votes",
              votename             => "unkonfiguriertes Usevote",
+             sampleballotfile     => "ballot.sample",
              resultfile           => "ergebnis.alle",
              rulefile             => "usevote.rul",
              badaddrfile          => "mailpatterns.cfg",
@@ -57,6 +58,7 @@
              mailcc               => "",
              sleepcmd             => "sleep 1",
              clearcmd             => "clear",
+             diff                 => "diff",
              pager                => "less",
              pop3                 => 0,
              pop3server           => "localhost",
@@ -90,8 +92,9 @@
              nein_stimme          => '(N\s*E\s*I\s*N|N|(D\s*A\s*)?G\s*E\s*G\s*E\s*N)',
              enth_stimme          => '(E|E\s*N\s*T\s*H\s*A\s*L\s*T\s*U\s*N\s*G)',
              ann_stimme           => 'A\s*N\s*N\s*U\s*L\s*L\s*I\s*E\s*R\s*U\s*N\s*G',
+             bdsg_confirm         => 'JA',
              condition1           => '$yes>=2*$no', # twice as many yes as no
-             condition2           => '$yes>=60',    # min 60 yes votes
+             condition2           => '$yes>=50',    # min 60 yes votes
              prop_formula         => '$yes/$no',
              tpl_ack_mail         => 'ack-mail',
              tpl_bouncelist       => 'bouncelist',
@@ -118,6 +121,7 @@
              tpl_rule_violated    => 'rule-violated',
              begin_divider        => 'Alles vor dieser Zeile bitte loeschen',
              end_divider          => 'Alles nach dieser Zeile bitte loeschen',
+             ballotintro          => 'WAHLSCHEIN fuer',
              nametext             => 'Dein Realname, falls nicht im FROM-Header:',
              nametext2            => 'Waehlername:',
              addresstext          => 'Waehleradresse:',
diff -r -u usevoteger-4.11/uvcount.pl usevoteger-4.12/uvcount.pl
--- usevoteger-4.11/uvcount.pl	2012-09-25 20:20:17.000000000 +0200
+++ usevoteger-4.12/uvcount.pl	2014-01-19 19:40:06.674085000 +0100
@@ -1,8 +1,8 @@
 #!/usr/bin/perl -w
 
 ###############################################################################
-# UseVoteGer 4.11 Stimmauswertung
-# (c) 2001-2012 Marc Langer <uv@marclanger.de>
+# UseVoteGer 4.12 Stimmauswertung
+# (c) 2001-2014 Marc Langer <uv@marclanger.de>
 # 
 # This script package is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Public License as published by the
diff -r -u usevoteger-4.11/UVmenu.pm usevoteger-4.12/UVmenu.pm
--- usevoteger-4.11/UVmenu.pm	2012-01-22 22:06:33.000000000 +0100
+++ usevoteger-4.12/UVmenu.pm	2014-02-16 20:26:54.595693000 +0100
@@ -60,6 +60,7 @@
   while (1) {
 
     system($config{clearcmd});
+    print "-> $config{votename} <-\n";
     print UVmessage::get("MENU_PROBLEMS") . "\n";
 
     foreach my $error (keys %errors) {
@@ -69,6 +70,12 @@
     my $menucaption = UVmessage::get("MENU_CAPTION");
     print "\n\n$menucaption\n";
     print "=" x length($menucaption), "\n\n";
+
+    # don't print this option if called from uvcfv.pl
+    unless ($mailonly) {
+      print "(0) ", UVmessage::get("MENU_DIFF_BALLOT"), "\n";
+    }
+
     print "(1) ", UVmessage::get("MENU_SHOW_MAIL"), "\n\n",
           UVmessage::get("MENU_CHANGE_PROPERTIES"), "\n",
           "(2) ", UVmessage::get("MENU_ADDRESS"), " [$voter_addr]\n";
@@ -95,7 +102,14 @@
     # only accept 1, 2, i and w if called from uvcfv.pl
     next if ($mailonly && $input !~ /^[12iw]$/i);
 
-    if ($input eq '1') {
+    if ($input eq '0') {
+      # ignore SIGPIPE (Bug in more and less)
+      $SIG{PIPE} = 'IGNORE';
+      open (DIFF, "|$config{diff} - $config{sampleballotfile} | $config{pager}");
+      print DIFF $$body, "\n";
+      close (DIFF);
+
+    } elsif ($input eq '1') {
       system($config{clearcmd});
       # ignore SIGPIPE (Bug in more and less)
       $SIG{PIPE} = 'IGNORE';
@@ -272,22 +286,6 @@
       }
 
     } elsif ($input eq '7') {
-      my $sel;
-      do {
-        print "[a] ", UVmessage::get("MENU_VOTING_CORRECT"), "\n",
-              "[b] ", UVmessage::get("MENU_VOTING_WRONG"), "\n\n",
-              UVmessage::get("MENU_PROMPT");
-        $sel = <STDIN>;
-      } until ($sel =~ /^[ab]$/i);
-
-      if ($sel =~ /^a$/i) {
-        delete $errors{NoVoting};
-        delete $errors{WrongVoting};
-      } else {
-        $errors{WrongVoting} = UVmessage::get("MENU_WRONGVOTING");
-      }
-
-    } elsif ($input eq '7') {
       my $sel;
       do {
         print "[a] ", UVmessage::get("MENU_VOTING_CORRECT"), "\n",
diff -r -u usevoteger-4.11/UVreadmail.pm usevoteger-4.12/UVreadmail.pm
--- usevoteger-4.11/UVreadmail.pm	2012-09-25 22:14:00.000000000 +0200
+++ usevoteger-4.12/UVreadmail.pm	2014-01-22 20:11:07.385491000 +0100
@@ -124,18 +124,31 @@
   # Mailbox / Maildir
   } else {
 
+    my $readfilename;
+
+    if ($caller==0) {
+      # called from uvvote.pl: use configured mailbox file
+      $readfilename = $config{votefile};
+    } else {
+      # else use filename provided in function call
+      $readfilename = $filename;
+      # and create backup archive filename
+      $filename .= '.processed';
+    }
+
     my $mgr = Mail::Box::Manager->new;
     my $folder;
 
     eval{
-      $folder = $mgr->open( folder => $config{votefile},
+      $folder = $mgr->open( folder => $readfilename,
                 create => 0,
                 access => 'rw',
                 type   => $config{mailboxtype},
                 expand => 'LAZY',
+                remove_when_empty => 0,
               );
     };
-    die UVmessage::get("READMAIL_NOMAILFILE", (FILE => $config{votefile})) . "\n\n" if $@;
+    die UVmessage::get("READMAIL_NOMAILFILE", (FILE => $readfilename)) . "\n\n" if $@;
 
     # Iterate over the messages.
     foreach (@$folder) {
@@ -149,7 +162,7 @@
       } else {
         $fromline .= 'foo@bar.invalid';
       }
-      $fromline .= ' ' . localtime() . "\n";  #strftime ('%a %b %d %H:%M:%S %Y', localtime) . "\n";
+      $fromline .= ' ' . localtime($_->timestamp()) . "\n";
       push (@mails, $fromline . $mail);
     }
   }
diff -r -u usevoteger-4.11/uvvote.pl usevoteger-4.12/uvvote.pl
--- usevoteger-4.11/uvvote.pl	2012-09-25 22:07:39.000000000 +0200
+++ usevoteger-4.12/uvvote.pl	2014-02-16 11:58:19.722047000 +0100
@@ -1,8 +1,8 @@
 #!/usr/bin/perl -w
 
 ###############################################################################
-# UseVoteGer 4.11 Wahldurchfuehrung
-# (c) 2001-2012 Marc Langer <uv@marclanger.de>
+# UseVoteGer 4.12 Wahldurchfuehrung
+# (c) 2001-2014 Marc Langer <uv@marclanger.de>
 # 
 # This script package is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Public License as published by the
@@ -231,9 +231,9 @@
   }
 
   # correct voting?
-  if ($$body =~ /\Q$config{ballotintro}\E\s+(.+?)[^\S\n]*\n([>:|]*?[\t ]+(\S+.+)\s*$)?/m) {
+  if ($$body =~ /\Q$config{ballotintro}\E\s+(.+?)\s*\n([>:|]*?[\t ]+(\S+.+)\s*$)?/m) {
     $voting = $1;
-    $voting .= " $3" if defined($3);
+    $voting .= " $3" if (defined($3) and $3 !~ /\Q$config{nametext}\E/);
     push (@errors, 'WrongVoting') if ($config{votename} !~ /^\s*\Q$voting\E\s*$/);
   } else {
     push (@errors, 'NoVoting');
@@ -319,7 +319,7 @@
     # Should read like this: #a [ STIMME ] Text
     # (Text is configurable in usevote.cfg)
     unless ($$body =~ /$bdsg_regexp/s &&
-            $$body =~ /#a\W*?\[\W*?$config{ja_stimme}\W*?\]\W*?$bdsg2_regexp/is) {
+            $$body =~ /#a\W*?\[\W*?$config{bdsg_confirm}\W*?\]\W*?$bdsg2_regexp/is) {
 
       push (@errors, 'InvalidBDSG');
     }
