Martin Wodrich <[EMAIL PROTECTED]> wrote on 05.10.04:
> Michael Heydekamp <[EMAIL PROTECTED]> schrieb am 04.10.04 um 18:09:
>> Der Bug liegt, wenn man den Code liest, so klar vor einem wie nur
>> was. Manchmal kann man sich nur wundern, wie so etwas �ber 10 Jahre
>> lang unentdeckt bleiben konnte.
> Indem genau der Bug eben in der Praxis total selten auftrat. Solange
> man keinen Codereview macht, sieht man sowas einfach nicht.
> Genau soclhe Stellen sind es aber unter Umst�nden die eben eventuell
> doch mal echte Probleme machen. Nicht direkt diese Stelle, aber eben
> solche Stellen, die eben bei Tests �bersehen werden.
Eine "Kunst" beim Programmieren liegt halt auch darin, an (m�glichst)
alle F�lle zu denken.
Es ist aber auch wirklich zum K*tzen und ich scheine sowas irgendwie
anzuziehen: Eigentlich wollte ich nur dem "Date:"-Header die �bliche
Angabe des Wochentags spendieren, prompt sto�e ich erstmal auf den
obigen Bug. Ok, der war nicht so schwer zu fixen.
Aber *danach* bin ich im selben Bereich noch auf mehr Dinge gesto�en,
und die haben wieder dazu gef�hrt, da� ich praktisch alles komplett neu
schreiben mu�te, was mit der Erzeugung von Headern zusammenh�ngt, die
Angaben �ber Datum/Zeit/Zeitzone enthalten.
Einiges davon kann man hier vielleicht tats�chlich mal zur Diskussion
stellen, denn einige Fragen sind da durchaus noch offen.
Da ich mit der Dokumentation der bisherigen �nderungen gerade eben
fertig geworden bin, quote ich die nachfolgend einfach mal einzeln und
schreibe ein paar Kommentare und Fragen dazu:
----------8<----------
> 3. Die "From_"-Zeile von UUCP-Mails enth�lt nicht mehr Erstellungs-
> datum und -uhrzeit der Nachricht im RFC-Format (wie es im "Date:"-
> Header steht), sondern es wird eine Zeile mit dem *aktuellen*
> Datum/Uhrzeit im sog. "asctime()"-Format erzeugt:
> Jetzt : From my Wed Oct 6 19:08:33 2004 remote from freexp.de
> Bisher: From my 06 Oct 2004 19:08:33 +0200 remote from freexp.de
> Das RFC-Format ist sowohl laut der Beispiele in RFC976 als auch in
> der Praxis beim UUCP-Austausch an dieser Stelle zumindest un�blich,
> m�glicherweise sogar falsch.
----------8<----------
Das Format habe ich tats�chlich anhand realer UUCP-Messages verifiziert,
die mir von zwei verschiedenen Seiten zugeschickt wurden.
Dabei hat sich aber nicht nur das andere Format best�tigt, sondern auch,
da� nicht wie bisher die Erstellungszeit in den Header geh�rt, sondern
die aktuelle Zeit (wie sie auch in den "Received:"-Header geschrieben
wird.
Ich denke, das ist soweit eindeutig, es sei denn, jemand wei� mehr
dar�ber als ich sehen und recherchieren konnte.
Jetzt was Umfangreicheres, es geht um die Zeitzonenangaben:
----------8<----------
> 4. Bei Headern, die das aktuelle Datum/Uhrzeit enthalten ("Received:",
> "From_"-Zeile bei UUCP-Mails), wird die Zeitzone nicht mehr blind
> vom Erstellungsdatum der Nachricht �bernommen, da dies im Fall, da�
> Erstellungs- und Konvertierdatum in unterschiedlichen Zeitperioden
> liegen (Beispiel: Nachricht wird am Abend des letzten Tages der
> Sommerperiode erzeugt, aber erst in der Nacht oder am n�chsten
> Morgen konvertiert und versandt), zu einer falsch deklarierten
> Zeitzone f�hren w�rde - bzw. in der Vergangenheit auch konkret dazu
> gef�hrt hat.
> Stattdessen wird jetzt gepr�ft, ob Erstellungs- und aktuelles Datum
> in derselben Zeitperiode liegen. Ist dies nicht der Fall, wird die
> Zeitzone des aktuellen Datums aus der Zeitzone des Erstellungs-
> datums errechnet, indem je nach Konstellation 1 Stunde addiert
> (Winter => Sommer) bzw. subtrahiert (Sommer => Winter) wird. Liegen
> Erstellungs- und aktuelles Datum in derselben Zeitperiode, wird die
> Zeitzone aus dem Erstellungsdatum - wie bisher - unver�ndert �ber-
> nommen.
> Ma�gebend f�r die Definition der Zeitperioden ist ausschlie�lich
> die aktuell f�r die EU geltende Regelung, deren Algorithmus auch
> bei der automatischen Zeitumstellung in FreeXP verwendet wird. Die
> Angabe "S" bzw. "W" im ZConnect-Header ist unzuverl�ssig und wird
> wie bisher ignoriert.
> Das obige Verfahren funktioniert daher in allen F�llen zuverl�ssig,
> in denen die Konvertierung in einem Land stattfindet, in dem a)
> eine mit der in der EU g�ltigen Regelung identische Winter-/Sommer-
> zeitregelung angewandt wird, und b) dessen Zeitzone identisch ist
> mit dem Land, in dem die Nachricht erstellt wurde (was nahezu immer
> der Fall sein d�rfte). Mit anderen Worten: Bisher stimmte die Zeit-
> zonenangabe bei dem geschilderten Szenario praktisch nie, jetzt
> stimmt sie praktisch immer.
----------8<----------
Ich hoffe, das ist soweit verst�ndlich beschrieben. Wir (wie alle
anderen UUZs auch) haben also in bestimmten F�llen schlicht eine falsche
Zeitzone deklariert. Das funktioniert jetzt alles sehr sch�n wie oben
beschrieben und ist IMO umfassend getestet.
Was aber evtl. noch etwas st�rt, ist, da� man dabei an die
Winter-/Sommerzeitregelung der EU gebunden ist. Zwar wird FreeXP eher
wenig User in Marokko oder Australien haben ;), aber man k�nnte daran
denken, wie bei der Winter-/Sommerzeitumstellung in FreeXP selbst auch
im UUZ die TZ-Variable auszuwerten: Ist sie gesetzt, w�rde in jedem Fall
die sich daraus ergebende Zeitzone genommen und die im EDA:-Header
deklarierte Zone f�r die Erstellungszeit zwar f�r den "Date:"-Header,
nicht aber mehr f�r die aktuelle Zeitzone des Versands in "Received:"
bzw. "From_" (UUCP) verwendet.
Damit w�re man v�llig unabh�ngig und es g�be einen sinnvollen Weg, den
Default "EU" zu overriden. Was haltet Ihr davon?
Zwei andere Ideen dazu habe ich verworfen:
- Zeitzone vom Betriebssystem �bernehmen. W�re zwar unter Win2K/XP
mittels XP_NTVDM.DLL sicher m�glich, aber eben nur da. Win9x und DOS
w�ren au�en vor, Linux Dosemu/DOSBOX und OS/2 wohl auch. K�me
h�chstens als weitere optionale M�glichkeit zur TZ-Variablen in
Betracht. Meinungen bitte.
- Zeitzone aus der XPOINT.CFG auslesen. Da diese zur Laufzeit des UUZ
statisch ist, sie sich aber w�hrend eines Konvertiervorgangs �ndern
kann, best�nde in diesem Fall wieder die Gefahr, eine falsche Zeitzone
zu deklarieren (w�hrend die oben beschriebene L�sung einen Wechsel der
Zeitperiode zur Laufzeit ber�cksichtigt, da Lokalzeit und Zeitzone
f�r jede Nachricht neu kalkuliert werden). Au�erdem wird gerade der
UUZ auch gerne in Umgebungen verwendet, in denen keine XPOINT.CFG
verf�gbar ist.
Von diesem Standpunkt w�rde ich ungerne abr�cken m�ssen. ;)
Die �brigen �nderungen nur zur Info, da sehe ich eigentlich keinen
Diskussionsbedarf:
----------8<----------
> 1. Die Header "Date:", "Received:", "From_" (nur UUCP-Mails) und der
> MIME-Parameter "modification-date=" enthalten neben Datum, Uhrzeit
> und Zeitzone jetzt auch den Wochentag in dem in RFC2822 definierten
> Format ("Mon, ", "Tue, " usw.).
> 2. Der "Date:"-Header wird nicht mehr als allererster Header, sondern
> im Anschlu� an den "Subject:"-Header geschrieben (Anpassung an
> �bliche Gepflogenheiten).
[...]
> 5. Enth�lt der EDA:-Header keine Zeitzonenangabe, gelten automatisch
> jetzt MEZ (=CET, =UTC+1, Winter) bzw. MESZ (=CEST, =UTC+2, Sommer)
> als Defaultwerte, da die Angabe einer Zeitzone im "Date:"-Header
> gem�� RFC2822 Pflicht ist und die bisherige Angabe von "?0000" (mit
> einem beliebigen und zufallsabh�ngigen Zeichen als "Vorzeichen")
> unbrauchbar war.
> 6. Ist der EDA:-Header leer bzw. existiert �berhaupt nicht, wird statt
> eines ung�ltigen "Date:"-Headers mit dem Inhalt " Jan :: 0000"
> jetzt ein g�ltiger Header mit dem aktuellen Datum/Uhrzeit und der
> Zeitzone MEZ/MESZ im korrekten Format erzeugt (da der Header
> Pflicht ist, war der totale Verzicht keine Option).
> 7. Bei der Datums-/Zeitangabe von Dateien (Quelle: DDA:-Header) im
> MIME-Parameter "modification-date=" wird als Zeitzone nicht mehr
> "+0000", sondern "-0000" deklariert. Das negative Vorzeichen signa-
> lisiert gem�� RFC2822, da� keine Information �ber eine Zeitzone
> vorliegt, w�hrend "+0000" signalisiert, da� es sich exakt um die
> Zeitzone "UTC" handelt.
> 8. Bei allen anderen Zeitzonenangaben wird eine evtl. als "W-0" oder
> "S-0" im EDA:-Header deklarierte Zeitzone zu "+0000" korrigiert und
> konvertiert.
> 9. (Zu sp�ter) Y2K-Fix: Bei einer Nachricht, die am ersten Tag eines
> neuen Jahrhunderts zu einer Uhrzeit erzeugt wurde, zu der das kor-
> respondierende Datum in UTC-Zeitrechnung noch im alten Jahrhundert
> lag (in unserer Zeitzone also am 01.01.2000 zwischen 00:00 und
> 00:59 Uhr, in Australien zwischen 00:00 und 11:59 Uhr), dann wurde
> bei der Konvertierung - und zwar unabh�ngig davon, wann und wo
> diese stattfand - f�lschlicherweise das Jahr "1900" statt "2000"
> deklariert, weil aus der den lokalen Zeitstempel (und nur ein zwei-
> stelliges Jahr) enthaltenden Variable 'hd.datum' das Jahrzehnt "00"
> und aus der den UTC-Zeitstempel (und ein vierstelliges Jahr) ent-
> haltenden Variable 'hd.zdatum' das Jahrhundert �bernommen und so zu
> "1900" zusammengesetzt wurde. Dieser Fall wird jetzt korrekt behan-
> delt, was sich in der Praxis aber erst wieder in gut 95 Jahren
> positiv bemerkbar machen wird, wenn der letzte FreeXP-User kurz
> nach Silvester tapfer seine Neujahrsgr��e verfa�t. ;-)
----------8<----------
Ich h�nge im Followup zu diesem Posting mal die zentralen neuen Routinen
f�r das ganze Ged�nse an.
Michael
------------------------------------------------------------------------
FreeXP Entwickler-Mailingliste
[EMAIL PROTECTED]
http://www.freexp.de/cgi-bin/mailman/listinfo/dev-list