+- UUZ_ENH.TXT ----------------------------------------------+
|                                                            |
|  Vollständige Dokumentation aller Änderungen               |
|  des "Enhanced UUZ" seit dem 30.08.2003                    |
|  (c) 2003-2006 FreeXP <support@freexp.de>                  |
|                                                21.01.2006  |
+------------------------------------------------------------+

+-----------------------------------------------------+
|  28.09.2004-21.01.2006  (Release E-UUZ/II v3.40.2)  |
+-----------------------------------------------------+

MY:
- Relevante Bugfixes (u.a. MIME-Decodierung, Speicherlecks, fehlerhafte
  LEN:-Header), neue Importschnittstellen für "mbox"- und "raw"-Format,
  bessere Absicherung gegen defekte RFC-Puffer, neue und erweiterte
  Funktionen (u.a. Erzeugung des Headers "User-Agent:", Unterstützung
  langer und gefalteter RFC-Headerzeilen in MAIL.RFC und NEWS.RFC, Para-
  meterübergabe via UUZ.OPT).
========================================================================

MY:
- Fix (-uz): Logik-Bug in der MIME-Decodierung behoben
  ----------------------------------------------------------------------
  In dem in der täglichen Praxis bisher nicht eingetretenen Fall, daß
  bei zwei unmittelbar aufeinanderfolgenden 'encoded words' die Anzahl
  der sich zwischen diesen 'encoded words' befindlichen (und daher zu
  entfernenden) Leerzeichen größer/gleich der Anzahl der für die MIME-
  Delimiter ("=?US-ASCII?Q?...?=") des ersten 'encoded word' verwendeten
  Zeichen war, entstand ein Arithmetik-Überlauf, in dessen Folge es
  nicht nur zu einem fehlerhaft decodierten Header, sondern zu allen
  erdenklichen und unkalkulierbaren Folgen bis hin zu einer völlig
  unbrauchbaren Nachricht oder gar einem (theoretischen, weil bisher
  in der Praxis nicht vorgekommenem) Absturz kommen konnte.
  Der Bug wurde vom Autor rein zufällig anläßlich eines von ihm selbst
  zu Testzwecken im Bereich Headerfolding erstellten Postings entdeckt
  (siehe Message-ID <9Ha5ICFQCHB@my.freexp.de> in der Newsgroup
  de.comm.software.newsserver).
  MIMEDEC.PAS

MY:
- Diverse Erweiterungen, Anpassungen und Korrekturen bei RFC-Headern,
  die Datums-/Uhrzeit-/Zeitzonenangaben enthalten (-zu):
  ----------------------------------------------------------------------
  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).
  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:
     ------------------------------------------------------------------
     - Bisher: From my 06 Oct 2004 19:08:33 +0200 remote from freexp.de
     - Jetzt : From my Wed Oct  6 19:09:24 2004 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.
     Unklar (weil in RFC976 nicht geregelt) ist bisher, ob dort Lokal-
     zeit oder UTC erwartet wird. Momentan verwendet der UUZ dort die
     Lokalzeit, wie es auch aus einigen Praxisbeispielen ersichtlich
     war.
  4. Bei Headern, die Datum/Uhrzeit des Zeitpunkts der Konvertierung
     enthalten ("Received:", "From_"-Zeile bei UUCP-Mails), wird die
     Zeitzone nicht mehr blind aus dem Erstellungsdatum im EDA:-Header
     der Nachricht übernommen, da dies im Fall, daß Erstellungs- und
     Konvertierzeitpunkt in unterschiedlichen Zeitperioden liegen, zu
     einer falsch deklarierten Zeitzone führen würde - bzw. in der
     Vergangenheit auch konkret dazu geführt hat. (Beispiel: Nachricht
     wird am Abend des letzten Tages der Sommerperiode erzeugt, aber
     erst in der Nacht oder am nächsten Morgen konvertiert und
     versandt.)
     Stattdessen wird die aktuelle Zeitzone jetzt mit zwei alternativen
     Methoden ermittelt:
     a) Wenn die TZ-Variable - wie es im Normalbetrieb mit XP der Fall
        ist - nicht (oder nicht im korrekten Format) gesetzt ist, ist
        die im EDA:-Header deklarierte Zeitzone des Erstellungsdatums
        zwar nach wie vor die entscheidende Grundlage, jedoch wird jetzt
        zusätzlich geprüft, ob Erstellungs- und aktuelles Datum in der-
        selben 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 Zeit-
        periode, wird die Zeitzone wie bisher aus dem Erstellungsdatum
        unverändert übernommen.
        Maßgebend für die Definition der Zeitperiode ist ausschließlich
        die aktuell für die EU geltende Regelung, deren Algorithmus auch
        bei der automatischen Zeitzonenumstellung in FreeXP verwendet
        wird. Die Angabe "S" bzw. "W" im ZConnect-Header ist unzuverläs-
        sig und wird wie bisher ignoriert.
        Das obige Verfahren funktioniert daher in allen Fällen zuverläs-
        sig, in denen die Konvertierung in einem Land stattfindet, in
        dem a) eine mit der in der EU geltenden Regelung identische
        Winter-/Sommerzeitregelung angewandt wird, und b) dessen Zeit-
        zone 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 Zeitzonenangabe im geschilderten Fall
        praktisch nie, jetzt stimmt sie praktisch immer.
     b) Durch das Setzen der Umgebungsvariablen "TZ" im Format
        -------------------------------------------------
          set TZ=CET-1CEST,3,-1,0,7200,10,-1,0,10800,3600
        -------------------------------------------------
        kann das in a) beschriebene Verfahren neutralisiert werden;
        stattdessen wird dann die in der TZ-Variablen deklarierte Zeit-
        zone in jedem Fall und völlig unabhängig von der im EDA:-Header
        deklarierten Zeitzone des Erstellungsdatums übernommen.
        Das obige Beispiel gilt für Mitteleuropa und würde in der
        Winterperiode die Zeitzone "+0100" (ZConnect: W+1) und in der
        Sommerperiode die Zeitzone "+0200" (ZConnect: S+2) zurückgeben.
        Für andere Länder sind die Werte entsprechend anzupassen, eine
        ausführliche Erläuterung zur TZ-Variablen befindet sich in der
        FreeXP-Hilfe zum Menüpunkt C/O/N/Umstellung.
        Durch die Auswertung der TZ-Variablen ist der UUZ daher in der
        Lage, in allen Ländern mit einer beliebigen (oder gar keiner)
        Winter-/Sommerzeitregelung die korrekte Zeitzone des aktuellen
        Datums zu deklarieren.
        Zwingend erforderlich ist die Verwendung der TZ-Variablen im
        Grunde dann, wenn der UUZ als Gate-Konvertierer eingesetzt wird:
        Dort können Nachrichten aus beliebigen Zeitzonen vorkommen (aus
        denen ohne TZ-Variable unterschiedliche lokale Zeitzonen berech-
        net würden), während dem UUZ im Standardbetrieb mit XP nur Nach-
        richten aus einer einzigen Zeitzone (nämlich der des Users)
        vorgelegt werden.
  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"
     wegen des beliebigen zufallsabhängigen Zeichens als "Vorzeichen"
     ungültig 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), wurde bei
     der Konvertierung - und zwar unabhängig davon, wann diese statt-
     fand, also auch noch Tage oder Wochen später - fälschlicherweise
     das Jahr "1900" statt "2000" deklariert, weil aus der den lokalen
     Zeitstempel (und eine nur zweistellige Jahresangabe) enthaltenden
     Variable 'hd.datum' das Jahrzehnt "00" und aus der den UTC-Zeit-
     stempel (sowie ein vierstelliges Jahr) enthaltenden Variable
     'hd.zdatum' das Jahrhundert übernommen und so zu "1900" zusammen-
     gesetzt wurde. Dieser Fall wird jetzt korrekt behandelt, was sich
     in der Praxis aber erst wieder in gut 94 Jahren positiv bemerkbar
     machen wird, wenn der letzte noch aktive FreeXP-User kurz nach
     Silvester tapfer seine Neujahrsgrüße verfaßt. ;-)
  UUZ.PAS, UUZ0.PAS

MY:
- Änderung (-zu): Bei der ZC=>RFC-Konvertierung von Postings mit dem
  Schalter "-client" (= NNTP-Betrieb) wird - sofern nicht durch die
  Existenz der Datei 'ADDGATE' gleichzeitig ein Gatebetrieb signalisiert
  wird - kein "Path:"-Header mehr erzeugt. Gründe:
  1. Der Header wird von den großen Newsservern (news.t-online.de,
     news.individual.de) ohnehin mit "not-for-mail" überschrieben und
     ist i.d.R. schon von daher überflüssig. Manche Newsserver wie
     news.individual.de "sichern" den ursprünglichen "Path:"-Header
     dabei als "X-Orig-Path:" (siehe dazu auch Punkt 3.).
  2. Es besteht beim clientseitigen Einliefern eines Postings beim
     Newsserver keine technische Notwendigkeit für diesen Header; er
     wird daher auch von keinem (dem Autor bekannten) Newsreader
     generiert.
  3. Der Header enthält die Mailadresse im Format "do.main!user". Usern,
     die zum Zweck der Spam-Vermeidung ihre Absenderadresse bei Postings
     mittels eines Ausgangsfilters ändern, wird i.d.R. nicht bewußt
     sein, daß sie den ZConnect-Header ROT: ebenfalls anpassen müssten,
     wenn sie über einen Server posten, der den "Path:"-Header nicht
     überschreibt (wie z.B. news.freexp.de) oder der ihn zwar über-
     schreibt, den ursprünglichen Header aber als "X-Orig-Path:"
     sichert. Es würde daher unbewußt und ungewollt über den "Path:"-
     Header eine Mailadresse preisgegeben werden, was mit dem Ändern der
     Absenderadresse gerade vermieden werden sollte.
  4. Beim Posten von vom UUZ erzeugten RFC-Postings in technische
     Newsgroups kommt es seitens der Teilnehmer bisweilen zu Fehlinter-
     pretationen und Mißverständnissen hinsichtlich des "Path:"-Headers
     und infolgedessen zu Fragen an den User, die oft nicht (oder nicht
     korrekt) beantwortet werden können.
  UUCP-Postings sind von der Änderung nicht betroffen und enthalten wie
  bisher einen "Path:"-Header in der bekannten Form.
  UUZ.PAS

MY:
- Änderung (-zu): Bei der RFC=>ZC-Konvertierung von UUCP-Mails mit einer
  mit dem String "From_" beginnenden ersten Zeile wird die Bildschirm-
  ausgabe des Envelope-Absenders "from user@do.main" hinter dem Datei-
  namen dann nicht mehr erzeugt, wenn ein solcher aus der "From_"-Zeile
  gar nicht ermittelt werden konnte (bisher wurde in diesem Fall dennoch
  "from_" ohne Adresse ausgegeben, was "broken" wirkte).
  UUZ.PAS

MY:
- Interne Änderung: Anzahl der Zeichen, die sich nach dem Aufruf von
  'ReadString' mindestens noch im Puffer befinden müssen, von 4 auf 5
  erhöht (Vorbereitung für mbox-Unterstützung).
  UUZ0.PAS

MY:
- Anpassungen und Korrekturen in der Routine 'ReadRFCheader' (auch im
  Vorgriff auf mbox-Unterstützung, siehe nächster Abschnitt, -uz):
  ----------------------------------------------------------------------
  1. Die Routine prüft jetzt - ähnlich wie bisher schon 'ReadRfcBody' -
     bei der RFC=>ZC-Konvertierung von SMTP- und mbox-Mails anhand der
     einschlägigen Merkmale (".", "From_") "vorausschauend" auf das Ende
     der Nachricht. Wird festgestellt, daß die Mail in der nächsten
     Zeile beendet ist (bzw. im Falle mbox, daß mit der nächsten Zeile
     eine neue Mail beginnt), wird das Lesen des Headers abgebrochen.
  2. Ungültige RFC-Headerzeilen mit einem Bezeichner, der Leerzeichen
     oder andere ungültige Zeichen außerhalb des zulässigen Bereichs
     33d-126d enthält, werden jetzt verworfen. Solche Header könnten
     sonst dazu führen, daß der Puffer nicht verarbeitet werden kann.
     Außerdem bestünde bei RFC-Puffern, die mehrere Nachrichten enthal-
     ten, die Gefahr, daß z.B. die eine mbox-Nachricht einleitende
     "From_"-Zeile mit einem RFC-Header verwechselt wird, weil sie oft
     Doppelpunkte in einer Uhrzeitangabe enthält.
  3. Nicht mehr verworfen hingegen werden Zeilen mit/ohne Leerzeichen
     oder Doppelpunkten, die sich *nach* einer *unmittelbar* auf die
     Schlüsselzeilen "DATA" (SMTP), "From_" (UUCP/mbox) oder "#! rnews"
     (Newsbatch) folgenden Leerzeile befinden. Diese Zeilen werden jetzt
     als Body betrachtet, obwohl (bzw. weil) eine so beschaffene Mail
     per Definition gar keinen RFC-Header enthält. Es wird dann eine
     Nachricht mit den (überwiegend leeren) ZConnect-Pflichtheadern und
     einem Body erzeugt.
  4. ASM-Routine 'LoZZ' entsorgt und durch 'LoString(zz)' ersetzt.
     'LoZZ' konnte zu einem RTE 204 oder zu defekten Nachrichten führen,
     wenn der übergebene String leer war (was z.B. vorkommt, wenn eine
     Zeile im Header keinen Doppelpunkt - und also keinen Bezeichner -
     enthält).
  Alle beschriebenen Maßnahmen dienen dazu,
  a) auch dann formal halbwegs korrekte und sauber lesbare Resultate zu
     produzieren, wenn der zu konvertierende RFC-Puffer fehlerhaft ist
     (ohne jegliche Header, mit oder ohne Body), statt wie bisher in
     solchen Fällen zu mitunter (zufälligen) fatalen Folgen wie
     Abstürzen, Endlosschleifen oder defekten ZConnect-Puffern zu
     führen, und
  b) Anfang und Ende jeder Nachricht in Puffern mit mehreren Nachrichten
     unter allen (un)denkbaren Umständen sicher und korrekt zu erkennen,
     auch wenn der Bereich zwischen den jeweiligen Schlüsselzeilen
     ("DATA" und "." beim SMTP-, mit "From_" beginnende Zeilen beim
     UUCP/mbox- und "#! rnews" beim Newsbatch-Format) nicht den erwarte-
     ten standardkonformen (oder auch gar keinen) Inhalt hat. Damit
     werden jetzt z.B. auch bei einem BSMTP-Puffer wie ...
     ----------------------------
       HELO freexp.de
       MAIL FROM:<theo@tester.de>
       RCPT TO:<my@freexp.de>
       DATA
       .
       MAIL FROM:<theo@tester.de>
       RCPT TO:<my@freexp.de>
       DATA
       .
       QUIT
     ----------------------------
     ... trotz des Fehlens aller Header und des Body zwei (natürlich
     leere) Nachrichten erzeugt. Ein mbox-Puffer wie ...
     ---------------------------------
       From - Sun Sep 26 08:04:46 2004
       From - Mon Sep 27 09:05:47 2004
       From - Tue Sep 28 10:06:48 2004
     ---------------------------------
     ... wird zu drei (ebenfalls leeren) Nachrichten konvertiert.
  Im Zusammenhang mit der neu implementierten mbox-Unterstützung war ein
  Teil dieser Maßnahmen ohnehin schlicht notwendig, da mbox-Mails anders
  als (B)SMTP-Mails kein definiertes Ende (sondern nur einen definierten
  Anfang) haben.
  UUZ.PAS, UUZ0.PAS

MY:
- Neue Importschnittstelle "mbox" implementiert (-uz):
  ----------------------------------------------------------------------
  1. Der Enhanced UUZ/II unterstützt neben UUCP- und (B)SMTP-Mails jetzt
     auch Mailpuffer im mbox-Format. Damit können mbox-Puffer, die von
     den meisten Mailreadern beim Export erzeugt werden und beliebig
     viele Nachrichten enthalten können, in das ZConnect-Format konver-
     tiert und anschließend nach XP importiert werden. Das erleichtert
     den Datenaustausch mit diesen Programmen erheblich und es lassen
     sich damit auch Mailinglistenarchive, die im mbox-Format zum Down-
     load angeboten werden (z.B. Pipermail), komfortabel konvertieren.
  2. Von den insgesamt vier existierenden mbox-Formaten werden die
     beiden gängigsten explizit unterstützt:
     -----------------------------------------
     - mboxo  (irreversibles ">From_ quoting")
     - mboxrd (reversibles ">From_ quoting")
     -----------------------------------------
     Da der Anfang jeder mbox-Mail ausschließlich an einer mit "From_"
     (wobei der Unterstrich für ein Leerzeichen steht) beginnenden Zeile
     zu erkennen ist, wird beim mbox-Format allen Zeilen in Header und
     Body, die ebenfalls mit "From_" beginnen, das Quotezeichen ">"
     vorangestellt, damit diese nicht mit dem Beginn einer neuen Mail
     verwechselt werden können.
     Bei einer Konvertierung sind diese Quotezeichen daher wieder zu
     entfernen. Der Unterschied beider Formate liegt darin, daß bei
     "mboxo" nur mit "From_" beginnenden Zeilen ein ">" vorangestellt
     wird, während dies bei "mboxrd" auch bei den Zeilen geschieht, die
     vor dem "From_" bereits eine beliebige Anzahl von Quotezeichen
     (ohne jedes Leerzeichen dazwischen!) besitzen.
     Entsprechend unterschiedlich ist beim Ent-Quoten zu verfahren:
     -------------------------------------------------------------------
     - mboxo:  Das ">From_ quoting" des mboxo-Formates ist nicht voll-
               ständig reversibel, weil Zeilen, die schon von vornehe-
               rein mit ">From_" beginnen, nicht von denen zu unter-
               scheiden sind, die mit "From_" begannen und erst beim
               Schreiben des Formats mit einem Quotezeichen versehen
               wurden. Es kann also bei mboxo-Mails im Unterschied zum
               mboxrd-Format im Einzelfall vorkommen, daß Quotezeichen
               vor Zeilen entfernt werden, bei denen sie eigentlich
               nicht hätten entfernt werden sollen. Dies ist prinzip-
               bedingt nicht zu vermeiden.
     - mboxrd: Die meisten Mailreader dürften allerdings inzwischen das
               mboxrd-Format verwenden. Dort existiert dieses Problem
               nicht, weil eine ursprünglich mit ">From_" beginnende
               Zeile beim Schreiben des mbox-Puffers zu ">>From_" umge-
               wandelt (und vom UUZ wieder zu ">From_" zurückgewandelt)
               wird. Da sich beim mboxrd-Format theoretisch beliebig
               viele ">" vor einer mit "From_" beginnenden Zeile befin-
               den können, wird auch der Fall abgefangen, daß die Anzahl
               der ">" größer ist als die maximale Länge eines Pascal-
               Strings. Auch wenn dem String "From_" z.B. 741 Quote-
               zeichen ">" vorangehen sollten und/oder sich die String-
               grenze mitten in einem "From_" befindet, wird dies
               korrekt erkannt und genau ein ">" entfernt.
     -------------------------------------------------------------------
     Leider geben die meisten Programme keinerlei Auskunft darüber,
     welches mbox-Format sie unterstützen bzw. generieren, so daß im
     Zweifel nur Ausprobieren (d.h. gezielter Export von Testmails, die
     entsprechende Zeilen enthalten) hilft.
     Wem das zu aufwendig ist oder wer keine Möglichkeit dazu hat,
     sollte vom mboxo-Format als kleinstem gemeinsamen Nenner ausgehen.
  3. Da auch der Anfang einer UUCP-Mail an einer mit "From_" beginnenden
     Zeile zu erkennen ist, gibt es leider keine Möglichkeit, UUCP-Mails
     programmseitig sicher und zuverlässig von mbox-Mailpuffern zu
     unterscheiden. Zwar können sich nie mehrere UUCP-Mails in einer
     Datei befinden und es findet dort auch kein ">From_ quoting" statt,
     aber weder muß ein mbox-Mailpuffer mehrere Mails enthalten noch ist
     die Existenz von weiteren mit "From_" beginnenden Zeilen nach der
     einleitenden "From_"-Zeile garantiert (sondern man kann eher meist
     vom Gegenteil ausgehen). Eine Erkennung über den in der ersten
     "From_"-Zeile von UUCP-Mails meistens vorkommenden String "remote
     from" ist nicht zuverlässig genug, außerdem läge selbst dann immer
     noch keine Information darüber vor, *welches* mbox-Format konver-
     tiert werden soll.
     Es war daher nicht zu vermeiden, für die jeweiligen mbox-Formate
     eigene Kommandozeilenparameter zur Verfügung zu stellen und die
     Verantwortung für deren korrekte Verwendung dem User aufzuerlegen:
     -----------------------------------------------------------------
     - Parameter "-mboxo" für das mboxo-Format;
     - Parameter "-mboxrd" bzw. schlicht "-mbox" (weil Quasi-Standard)
       für das mboxrd-Format.
     -----------------------------------------------------------------
     Bei beiden Formaten wird als Netztyp "41" (= RFC/Client) in den
     XP-Header "X-XP-NTP:" geschrieben. Der Dateiname ist wie bei allen
     anderen Nachrichtenformaten beliebig.
  4. Die letzte Leerzeile am Ende einer mbox-Mail wird entfernt, da sie
     beim Schreiben des mbox-Mailpuffers zusätzlich erzeugt wurde (bzw.
     erzeugt worden sein sollte - das Format sieht vor, daß sich vor
     jeder eine Mail einleitenden "From_"-Zeile eine Leerzeile befindet,
     worauf sich der E-UUZ/II aber hinsichtlich der Erkennung des
     Anfangs einer Mail nicht verläßt).
  5. Infolge der im vorherigen Abschnitt beschriebenen Anpassungen in
     der Routine 'ReadRFCheader' sowie der prinzipiellen Gleichbehand-
     lung von (B)SMTP- und mbox-Nachrichten beim Lesen des Body in der
     Routine 'ReadRfcBody' ist gewährleistet, daß alle in diesem
     Dokument an anderer Stelle ausführlich beschriebenen Fixes und
     Korrekturen für die Decodierung und Konvertierung von qp/base64-
     und/oder UTF-7/8-codierten Nachrichten (Stichworte 'start_of_UTF',
     'end_of_UTF' und 'maxUTFLen') in gleicher Weise auch für Mails im
     mbox-Format gelten und dort greifen.
  6. Eine Envelope-From-Adresse in der "From_"-Zeile wird erkannt und in
     den WAB:-Header übernommen. (Dazu wird die im Zuge dieser Änderun-
     gen ebenfalls deutlich verbesserte Routine 'mailstring' aus
     XPOVL.PAS verwendet, die jetzt auch Kommentare, quoted-strings,
     quoted-pairs und Domain-Literale gemäß RFC2822 unterstützt).
  7. Die Formate "mboxcl" und "mboxcl2", die sich von den obigen durch
     die Existenz eines Content-Length-Headers unterscheiden, werden
     zwar nicht explizit unterstützt, können aber - mit geringfügigen
     Einschränkungen - dennoch mit der vorliegenden Fassung des E-UUZ/II
     konvertiert werden (bei beiden Formaten ist *ausschließlich* der
     Parameter "-mboxo" zu verwenden!):
     -------------------------------------------------------------------
     - mboxcl:  Verwendet dasselbe irreversible ">From_ quoting" wie das
                mboxo-Format und daher gelten hierfür auch dieselben
                Hinweise. Obwohl der Content-Length-Header vom UUZ nicht
                ausgewertet wird, sollte die Konvertierung ansonsten
                genauso fehlerfrei sein wie beim mboxo-Format.
     - mboxcl2: Verwendet (leider) gar kein ">From_ quoting" und verläßt
                sich stattdessen ganz auf die - wenn man den verwendeten
                Quellen glauben darf, allerdings unzuverlässige -
                Größenangabe im Content-Length-Header. Es kann daher
                passieren, daß bei der Konvertierung fälschlicherweise
                der Beginn einer neuen Nachricht erkannt wird, wenn im
                Body eine mit "From_" beginnende Zeile vorkommen sollte.
                Sorry, nicht zu vermeiden - allerdings wird das Format
                zum Glück auch selten bis gar nicht verwendet.
     -------------------------------------------------------------------
     Der Aufwand für eine "richtige" Unterstützung für diese seltenen
     mbox-Formate wäre momentan nicht zu rechtfertigen.
  8. Die mbox-Unterstützung wurde mit großer Sorgfalt entwickelt und
     so intensiv wie möglich getestet. Zum Abschluß wurde ein mbox-
     Puffer mit über 23.000 Mails fehlerfrei konvertiert. :-)
     Des weiteren wurde sichergestellt, daß die vorgenommenen Änderungen
     im Source nicht zu neuen Problemen bei der Konvertierung "normaler"
     Mails und Postings in den schon bisher unterstützten Formaten
     führen können.
  9. Quellen, die für die Entwicklung der mbox-Unterstützung als Grund-
     lage dienten:
     http://www.qmail.org/qmail-manual-html/man5/mbox.html
     http://homepages.tesco.net/~J.deBoynePollard/FGA/mail-mbox-formats.html
  UUZ.PAS, UUZ0.PAS

MY:
- Fix (-uz): Bei RFC-Puffern > 16384 Zeichen konnte es um diese Position
  herum (oder einem ganzzahligen Vielfachen davon) zum Überschreiben
  bzw. Überlagern von (und damit zur Ausgabe falscher) Zeichen kommen,
  wenn folgende Randbedingungen erfüllt waren:
  a) Die Routine 'ReadString' befand sich weniger als die Anzahl der
     Zeichen (bisher 4, jetzt 5), die sich nach ihrem Aufruf mindestens
     noch im Lesepuffer befinden müssen, vor dem absoluten Pufferende
     (=> 'add2buf' wird aufgerufen, liest bis zu 4 nächste Zeichen ein
     und stellt den gesamten Restpuffer von 5 Zeichen an den Anfang des
     Arrays);
  b) In diesem Restpuffer befindet sich ein Zeilenende (=> 'add2buf'
     liest nach dem Zeilenende ein weiteres Mal bis zu 4 fehlende
     Zeichen ein, ohne daß zwischenzeitlich die Prozedur 'reload'
     durchlaufen wurde, die den Lesepuffer vollständig bzw. bis zum
     Dateiende gefüllt hätte).
  Beim zweiten Durchlauf von 'add2buf' im Fall b) konnte die im Fall a)
  unkritische Reihenfolge der Anweisungen (blockread() -> fastmove() ->
  move()) zum Überschreiben/Überlagern von Zeichen im Lesepuffer führen.
  Je nach Position der Zeilenenden im Puffer konnte zudem ein falscher
  LEN:-Header die Folge sein. Reihenfolge der Anweisungen korrigiert in
  move() -> blockread() -> fastmove().
  Das beschriebene Problem konnte nur in den Testversionen v3.40.1a/b
  auftreten, weil erst dort die Routine implementiert wurde, die sicher-
  stellt, daß sich immer eine bestimmte Mindestanzahl von Zeichen im
  Lesepuffer befindet.
  UUZ0.PAS

MY:
- Diverse Fixes beim Parsen von Mail-Adressen (-uz):
  ----------------------------------------------------------------------
  1. Bei einer RFC2822-konform gestalteten Adresse wie
     -------------------------------------------------------------------
       "Maikel \"Tank, the Hatchet\" Lehr" <send_me_spam@shadowport.net>
     -------------------------------------------------------------------
     wurde der Realname dann nicht korrekt behandelt, wenn sie die erste
     in einem Header vorkommende Adresse war (inhaltlich sinnloser Test
     auf eine zumal zu diesem Zeitpunkt nicht initialisierte Variable,
     der zur Nichtbeachtung der quoted-pairs und damit zur Fehlinterpre-
     tation des Komma-Delimiters führte).
  2. Bei Group-Adressierung wie
     -----------------------------------------------------------------
       Group1: <my@freexp.de>, <mw@freexp.de>; Group2: <theo@test.de>;
     -----------------------------------------------------------------
     wird bei der Suche nach dem die Group abschließenden Semikolon
     jetzt berücksichtigt, ob es sich inmitten eines Kommentars, quoted-
     strings oder einer Adresse befindet (bisher wäre in einem solchen
     Fall das Semikolon fälschlicherweise für den Abschluß der Group
     gehalten worden). Anschließend werden die Group-Adressen ein
     zweites Mail durchlaufen, um evtl. vorhandene RFC822-Route-Adressen
     wie
     -------------------------------------------------
       <@machine1.tld,@machine2.tld: mary@example.net>
     -------------------------------------------------
     zu entfernen.
  3. Logikfehler beim Ermitteln und Entfernen von RFC822-Route-Adressen
     beseitigt: Statt nach dem Entfernen die Position zurückzusetzen und
     den Header ab der korrekten Position weiterzulesen, wurde die
     Schleife überflüssigerweise an einer zu späten Position fortgesetzt
     (kein sichtbarer Bug hierzu bekannt).
  MIMEDEC.PAS

MY:
- Speicherlecks und benachbarte Bugs im Zusammenhang mit der
  Konvertierung von "Received:"- in ROT:-Header beseitigt (-uz):
  ----------------------------------------------------------------------
  1. Wenn beim Zusammenbau des ROT:-Headers aus den in den "Received:"-
     Headern einer Mail eingetragenen Mailservern die resultierende
     Gesamtlänge des ROT:-Headers größer als die max. Stringlänge wurde,
     wurde ein "langer" Header im dafür vorgesehenen char-Array angelegt
     und der dafür notwendige Speicher reserviert. Wenn sich anschlies-
     send aber herausstellte, daß der hinter dem Schlüsselwort "by "
     eingetragene Server bereits identisch mit dem letzten Eintrag im
     ROT:-Header ist und daher gar nicht übernommen werden soll/darf,
     wurde jedoch nicht der ursprünglich reservierte Speicher freigege-
     ben, sondern ein um die Stringlänge+1 des hinter "by " stehenden
     Mailservers reduzierter Wert. Darüber hinaus wurde in diesem Fall
     das char-Array für den langen Header evtl. unnötigerweise angelegt,
     denn der hinter dem Schlüsselwort "from " stehende Server hätte
     alleine meistens noch in den String gepaßt.
     Durch diese fehlerhafte Vorgehensweise fragmentierte der zur Verfü-
     gung stehende Hauptspeicher und es kam bei der Konvertierung extrem
     großer Mailpuffer (= mehrere tausend Nachrichten) zu einem kontinu-
     ierlichen Speicherverlust, der in einen RTE 203 (Heap-Überlauf)
     münden konnte, wenn der Mailpuffer entsprechend viele solcher Nach-
     richten enthielt, auf die dieselben Randbedingungen zutrafen. Der
     Bug wirkte sich bisher nur in reinen Testumgebungen aus, da im
     Normalbetrieb mit XP weder die Menge der Nachrichten noch die
     durchschnittliche Anzahl der "Received:"-Header pro Mail erreicht
     wird, um zu diesem Resultat führen zu können.
  2. Wenn der String eines hinter dem Schlüsselwort "by " im
     "Received:"-Header eingetragenen Mailservers identisch war mit dem
     rechten Teil des aktuell letzten (und gleichzeitig längeren)
     Eintrags im ROT:-Header, dann wurde dieser Server fälschlicherweise
     als vermeintlicher Dupe verworfen. Beispiel:
     -------------------------------------------------------------------
       Aktuell letzter Eintrag in ROT:     sf-list2.mail.sourceforge.net
       Eintrag hinter "by " in "Received":          mail.sourceforge.net
     -------------------------------------------------------------------
     In diesem Fall fehlte der zweite Mailserver anschließend im ROT:-
     Header (Uralt-Bug in allen UUZ-Versionen). Es werden jetzt nur noch
     die Mailserver als Dupe verworfen, die auch wirklich welche sind.
  3. Der hinter "from " eingetragene Server wird wegen real vorkommender
     Header wie
     -------------------------------------------------------------------
      Received: from kboks.kruemel.org (kboks.kruemel.org [192.168.1.1])
       by kboks.kruemel.org (Weasel v1.73) for [...]
     -------------------------------------------------------------------
     jetzt ebenfalls einem Dupecheck gegen den im selben Header befind-
     lichen und hinter "by " stehenden Server unterzogen. Bisher wurde
     in einem solchen Fall der Server doppelt in den ROT:-Header über-
     nommen.
  4. Wegen ebenfalls real vorkommender Header wie
     -------------------------------------------------------------------
      Received: from  by localhost (amavisd-new, port ) id XXO6TU4B for
     -------------------------------------------------------------------
     werden vermeintlich hinter dem Schlüsselwort "from " stehende Server
     mit dem Namen "by" verworfen.
  5. Wenn bei real vorkommenden Headern wie
     -------------------------------------------------------------------
      Received: from ruby ( [217.118.66.232])
       by mx.gmail.com with ESMTP id c28sm204201nfb.2005.10.28.11.42.41;
       Fri, 28 Oct 2005 11:42:52 -0700 (PDT)
     -------------------------------------------------------------------
     der rechte Teil des Servernamens hinter dem Schlüsselwort "from "
     (in diesem Fall "ruby") zufällig identisch war mit dem Schlüssel-
     wort "by ", dann wurde nicht der hinter "by " stehende Server in
     den ROT:-Header übernommen, sondern das Schlüsselwort "by" als
     vermeintlicher Server selbst (bzw. es würde aufgrund der unter 4.
     beschriebenen Änderung jetzt verworfen werden). Es wird jetzt
     geprüft, ob sich das Schlüsselwort ganz am Anfang des Headers oder
     anderenfalls ein Leerzeichen davor befindet. Falls nicht, wird die
     Suche nach dem Schlüsselwort hinter der ersten Fundstelle fort-
     gesetzt und so der in diesem Beispiel bisher fehlende Server
     "mx.gmail.com" korrekt in den ROT:-Header aufgenommen.
  6. In der Routine 'GetReceived', in der dieser Zusammenbau des ROT:-
     Headers stattfindet, wurde bei der Prüfung, ob der resultierende
     Header noch in einen Pascal-String paßt oder bereits ein char-Array
     für einen langen Header angelegt werden muß, auf einen zu hohen
     (253 statt 248 Zeichen) geprüft, weil die Länge des Bezeichners
     "ROT: " nicht berücksichtigt wurde. Dies konnte bei ROT:-Headern,
     deren resultierende Gesamtlänge (ohne Bezeichner) zwischen 249 und
     253 Zeichen lag, zu einem Zeichenverlust am Ende des Headers führen
     (der Verlust trat jedoch dann nicht ein, wenn die Routine im Falle
     des unter Punkt 1. beschriebenen Szenarios unnötigerweise bereits
     ein char-Array angelegt hatte).
  7. Befand sich nach dem letzten "Received:"-Header der Nachricht noch
     ein "Path:"-Header (kommt z.B. bei in Mailinglisten gegatete
     Postings aus Newsgroups vor, siehe FreeXP-Supportforen), dann wurde
     der vorher aus diesen "Received:"-Headern gebildete ROT:-Header
     durch den Pfad im "Path:"-Header komplett überschrieben.
     Befand sich der "Path:"-Header vor oder inmitten der "Received:"-
     Header, wurden die Mailserver in den vor dem "Path:"-Header
     befindlichen "Received:"-Headern unterschlagen und die Mailserver
     in allen folgenden "Received:"-Headern an den "Path:"-Header
     angehängt und in den resultierenden ROT:-Header übernommen.
     Da dieses Verhalten weder bei Mail noch bei News wünschenswert und
     korrekt ist, wird jetzt wie folgt verfahren:
     - Bei Mails wird ein "Path:"-Header hinsichtlich des ROT:-Headers
       jetzt grundsätzlich ignoriert (dafür im Unterschied zu früher
       aber als "U-Path:" in den ZConnect-Header geschrieben).
     - Analog werden bei News jetzt "Received:"-Header hinsichtlich des
       ROT:-Headers ignoriert (und wie schon bisher als "U-Received:" in
       den ZConnect-Header geschrieben).
  8. Im Zuge dieser Fixes wurde die Routine komplett neugeschrieben und
     verarbeitet jetzt direkt die Daten aus dem char-Array 'HdrLine',
     statt wie bisher sowohl jeden "Received:"-Header selbst als auch
     jeden aus einem "Received:"-Header herausoperierten Mailserver in
     einem String zwischenzulagern. Dadurch sind jetzt folgende
     Beschränkungen aufgehoben, die trotz der Unterstützung eines
     beliebig langen ROT:-Headers und des Schreibens des originalen
     "Received:"-Headers als "U-Received:" in ebenfalls beliebiger Länge
     immer noch bestanden:
     - Es würden jetzt auch Mailserver korrekt ausgewertet werden, die
       sich jenseits des 253. Zeichens im "Received:"-Header befinden.
     - Die Länge des Namens eines Mailservers ist nicht mehr auf 255
       Zeichen begrenzt.
     Zugegebenermaßen ist dies nicht sonderlich praxisrelevant, jeden-
     falls konnte bei Testpuffern mit insgesamt über 3.000 Mails kein
     Fall festgestellt werden, in dem sich das ausgewirkt hätte.
  9. Zum Zweck der einfacheren Auswertung/Verarbeitung von Strings in
     char-Arrays (auch in anderen Routinen) neue Hilfsroutine
     'posLong()' implementiert, mit der sich Existenz und Position eines
     Strings in einem char-Array vom Typ 'LongHdrP' (bzw. einem Teil
     davon) ermitteln läßt.
  UUZ.PAS, MIMEDEC.PAS

MY:
- Speicherleck beseitigt (-uz): Wenn die im "Followup-To:"-Header einge-
  tragene Newsgroup identisch mit der Newsgroup im "Newsgroups:"-Header
  war, dann wurde zwar wie beabsichtigt kein überflüssiger ZC-Header
  Diskussion-in: erzeugt, gleichzeitig aber auch der für diesen Header
  reservierte Speicher nicht wieder freigegeben. Ähnlich wie bei dem in
  Punkt 1. des vorstehenden Abschnitts beschriebenen Szenario hätte dies
  in Extremfällen zu einem kontinuierlichen Speicherverlust mit
  anschließendem RTE 203 führen können (dazu hätte der Newspuffer je
  nach Länge des Namens der Newsgroup und dem beim Start des E-UUZ zur
  Verfügung stehenden Hauptspeichers ca. 150 Postings enthalten müssen,
  auf die diese Randbedingung zutrifft).
  UUZ.PAS, UUZ0.PAS

MY:
- Interne Änderung (-uz): Das via 'allocMem' in einem Dummy-Array reser-
  vierte Speicherminimum für lange ZC-Header wird jetzt nach der Konver-
  tierung jeder Nachricht komplett freigegeben und vollständig neu
  reserviert (statt nur für die Header den Speicher neu zu reservieren,
  die in der vorherigen Nachricht vorkamen). Dies dient der Vermeidung
  einer theoretisch möglichen Fragmentierung des Hauptspeichers.
  Des weiteren prüft 'allocMem' jetzt zusätzlich auf die Verfügbarkeit
  des Speichers für das anschließend anzulegende char-Array 'HdrLine',
  in das jede RFC-Headerzeile eingelesen wird, und bricht im Falle, daß
  dieser Speicher nicht verfügbar ist, die Verarbeitung kontrolliert ab
  (dieser Fall kann nur bei Programmstart oder neuen bzw. bisher nicht
  entdeckten Speicherlecks eintreten).
  UUZ.PAS, UUZ0.PAS

MY:
- Interne Änderung (-uz): Bei allen Prüfungen auf verfügbaren Haupt-
  speicher via 'MaxAvail', bei denen mittels Addition auf mehrere
  Elemente gleichzeitig geprüft, anschließend der Hauptspeicher aber
  für jedes Element einzeln angefordert wird, wird mittels der neuen
  Subroutine 'GetMemAmount' vor der Addition der tatsächlich von BP
  angeforderte Speicher (der immer ein Vielfaches von 8 beträgt) berech-
  net. Theoretisch hätte es sonst passieren können, daß die Prüfung auf
  den verfügbaren Speicher positiv ausfällt, der angeforderte Speicher
  anschließend aber gar nicht zur Verfügung steht. Beispiel: Bei 16
  verfügbaren Bytes wäre eine Prüfung auf 3+4+8=15 Bytes positiv
  ausgefallen. Angefordert worden wären aber anschließend 8+8+8=24
  Bytes.
  UUZ.PAS, UUZ0.PAS

MY:
- Fehlerlog für Speicherlecks implementiert (-uz): Der E-UUZ/II prüft
  jetzt vor und nach der Konvertierung jeder einzelnen Nachricht die
  Menge des verfügbaren Hauptspeichers ('maxavail' und 'memavail') und
  erzeugt im Falle von Differenzen einen Eintrag in der Fehlerlogdatei
  UUZ_ERR.LOG (unter Angabe der MsgID der diesen Fehler auslösenden
  Nachricht). An eine ggf. bereits existierende Logdatei wird immer
  angehängt. Seit den oben beschrieben Fixes konnte bisher jedoch kein
  Fehlerlog mehr gesichtet werden. :)
  UUZ.PAS, UUZ0.PAS

MY:
- Angabe problematischer Dateinamen für Quell- und Zieldatei abgefangen
  (-uz/-zu): Sämtliche Dateinamen, die UUZ-intern eine spezielle Bedeu-
  tung haben und von ihm ausgelesen, benutzt oder selbst erzeugt werden,
  sind jetzt nicht mehr als Name einer Quell- oder Zieldatei zulässig.
  Dies sind:
  --------------------------------------------------------------------
  UUZ.SWP, UUZ.TMP, UUZ.OPT, UUZ_ERR.LOG, MAIL.RFC, NEWS.RFC, ADDPATH,
  ADDGATE, XP_NTVDM.DLL
  --------------------------------------------------------------------
  Bisher wurde z.B. bei Angabe von MAIL.RFC als Quelldatei versucht, aus
  dieser Datei die zusätzlichen Header auszulesen, die in zu-Richtung in
  die RFC-Nachricht geschrieben werden sollen. Bei Angabe von MAIL.RFC
  als Zieldatei wurde eine diese RFC-Header enthaltende Datei umbenannt
  bzw. gar gelöscht.
  Die Routine prüft nur auf den reinen Kommandozeilen-String und läßt
  sich durch Angabe eines absoluten oder relativen Pfades vor dem
  Dateinamen gewaltsam austricksen. Ein höherer Aufwand wäre an dieser
  Stelle nicht gerechtfertigt, weil hier nur versehentliche Fehler im
  Test- oder Externbetrieb abgefangen werden sollen, die im Normalbe-
  trieb mit FreeXP oder XP2 ohnehin nicht auftreten können.
  UUZ0.PAS

MY:
- Interne Änderung (-uz): Die Dateien MAIL.RFC, NEWS.RFC und ADDPATH,
  die die in zu-Richtung zusätzlich in die RFC-Nachricht zu schreibenden
  Header bzw. einen voranzustellenden Pfad enthalten, werden in
  uz-Richtung jetzt nicht mehr überflüssigerweise eingelesen bzw.
  geprüft.
  UUZ0.PAS

MY:
- Optik-Fixes (-uz): Bei der Konvertierung großer RFC-Puffer mit mehr
  als 99.999 Nachrichten versagte die Anzeige der Anzahl der aktuell
  konvertierten Nachrichten und der Bildschirm wurde mit Zeichenmüll
  gefüllt. Anzeige von bisher fünf- auf jetzt sechsstellige Zahlenwerte
  ausgelegt (max. 10 Stellen wären möglich, sieht aber auch blöd aus).
  Bei der Ausgabe der Gesamtanzahl der konvertierten Mails und News am
  Ende der Verarbeitung ist die Stellenanzahl nicht mehr ein fester Wert
  von 5, sondern richtet sich nach dem höheren der beiden Werte (dadurch
  werden sowohl größere Werte korrekt dar- als auch keine überflüssigen
  Leerzeichen mehr vorangestellt).
  UUZ.PAS

MY:
- Optik-Fix (-zu): Anzeige der aktuellen und gesamten Anzahl von News
  und Mails rechtsbündig ausgerichtet und auf 6 Stellen ausgelegt.
  UUZ.PAS

MY:
- Fixes und Erweiterungen bei der Verarbeitung zusätzlicher
  RFC-Headerzeilen in den Dateien MAIL.RFC und NEWS.RFC (-zu):
  ----------------------------------------------------------------------
  Bei der Verarbeitung der in den Dateien MAIL.RFC und NEWS.RFC
  enthaltenen und zusätzlich in die RFC-Nachricht zu schreibenden
  Headerzeilen bestanden bisher folgende Beschränkungen bzw. Probleme:
  - Die Zeilen durften nicht länger als 253 Zeichen sein (längere Zeilen
    wurden abgeschnitten).
  - Gefaltete (d.h. mit einem Leer- oder TAB-Zeichen beginnende) Header-
    zeilen wurden, wenn sie nicht zufällig bis Pos. 3 einen Doppelpunkt
    enthielten, nicht unterstützt, sondern als "Illegal Line" betrachtet
    und die Verarbeitung der Datei wurde komplett abgebrochen.
  - Andererseits fand nur eine völlig unzureichende Prüfung auf gültige
    RFC-Headerzeilen statt (Doppelpunkt bis Pos. 3 war ausreichend, um
    eine Headerzeile als gültig zu betrachten).
  - Es konnten max. 10 Headerzeilen verarbeitet werden.
  Alle diese Beschränkungen/Probleme bestehen nicht mehr. :-) Es werden
  jetzt beliebig lange und auch gefoldete Headerzeilen unterstützt,
  wobei hinsichtlich der Gültigkeit einer RFC-Headerzeile folgende
  Regeln gemäß RFC2822 gelten:
  - Die Headerzeile darf nicht länger als 998 Zeichen sein (längere
    Zeilen müssen gefoldet werden).
  - Auf die für Mails empfohlene max. Zeilenlänge von 78 Zeichen wird
    nicht geprüft (weil eben "nur" empfohlen).
  - Der Bezeichner ('field name') und der Inhalt ('field body') des
    Headers dürfen nur zulässige Zeichen enthalten (d.h. insbesondere
    keine 8bit-Zeichen, aber es gelten je nach Kontext weitere und
    unterschiedliche Beschränkungen).
  - Der Inhalt einer Headerzeile ('field body') darf weder leer sein
    noch nur aus Leer- oder TAB-Zeichen bestehen.
  - Die Gültigkeit einer evtl. vorhandenen MIME-Codierung wird nicht
    überprüft und liegt in der Verantwortung des Users.
  - Die Routine verarbeitet sowohl Dateien mit CRLF- als auch solche mit
    LF-Zeilenenden.
  - Die Anzahl der Headerzeilen in MAIL/NEWS.RFC ist nicht mehr be-
    grenzt. Die einzige Beschränkung, die im Sinne der Vermeidung
    übertrieben großer RFC-Header besteht, ist die Gesamtgröße der Datei
    (max. 65500 Bytes, was für einen RFC-Header eindeutig schon zuviel
    wäre).
  - Evtl. vorhandene Leerzeilen werden nicht als ungültig zurückgewie-
    sen, beim Schreiben der Header aber ignoriert (eine Leerzeile leitet
    per Definition den Body der Nachricht ein).
  Wird in der Datei eine ungültige Zeile festgestellt, wird die gesamte
  Datei wie bisher nicht verarbeitet. Wurden alle Zeilen als gültig
  erkannt, werden sie "as is" geschrieben (d.h. keiner weiteren Ver-
  arbeitung wie MIME-Codierung o.ä. unterzogen), außer daß ein evtl.
  versehentlich vorangestelltes Prefix "U-" entfernt wird. Die zusätz-
  lichen Headerzeilen werden jetzt an einer früheren Stelle geschrieben
  (vor "X-RFC-Converter:" statt wie bisher hinter "Lines:").
  Soll ein RFC-Header MIME-codiert und/oder gefoldet werden, läßt sich
  der E-UUZ dafür als Tool einsetzen:
  a) Dummy-ZC-Puffer erstellen,
  b) gewünschten Headerinhalt in die BET:-Zeile schreiben,
  c) ZC-Puffer mit "uuz -zu -client <Quelldatei> .\" konvertieren,
  d) Inhalt des "Subject:"-Headers aus der erzeugten Datei (*.OUT) in
     den eigenen Header übernehmen.
  Da für Mail und News unterschiedliche Regeln hinsichtlich des Foldens
  gelten, ist dabei darauf zu achten, daß der ZC-Puffer einen passenden
  Empfänger (Mailadresse oder Newsgroup) enthält. Wenn der Bezeichner
  ('field name') des eigenen Headers in MAIL.RFC kürzer oder länger als
  "Subject:" ist, ist das Folding ggf. manuell anzupassen und dabei auf
  korrekte Zeilenlängen zu achten (max. 78, wenn die Zeile kein 'encoded
  word' enthält, max. 76, wenn sie eines enthält). Sofern es sich bei
  dem eigenen Header um einen strukturierten Header handelt, der Mail-
  adressen o.ä. enthält, darf nicht die BET:-Zeile, sondern müssen z.B.
  EMP: oder KOP: für die Erstellung eines RFC-konformen Headers heran-
  gezogen werden.
  UUZ.PAS, UUZ0.PAS

MY:
- Workaround Für VSoup-Software-Header analog zum schon seit längerem
  existierenden Workaround für UKA_PPP-Software-Header, weitere Details
  siehe dort (-uz):
  VSoup fügt dem vom UUZ erzeugten Software-Header zusätzlich den Header
  "User-Agent:" hinzu, so daß bei der uz-Konvertierung der Inhalt des
  die XP-Version enthaltenden Headers meist überschrieben wurde (es sei
  denn, auf dem Transportweg wurde die Reihenfolge der Header verändert,
  dann wurde u.U. der VSoup-Header überschrieben).
  Der Inhalt des VSoup-Headers wird jetzt mit "via" an den XP-Header
  angehängt, unabhängig von der Reihenfolge des Auftretens. Dieser
  Workaround unterstützt *keine* beliebig langen Zeilen. Sollte die
  Zeile durch die Stringaddition länger werden als ein Pascal-String,
  wird der VSoup-Header verworfen.
  UUZ.PAS

MY:
- Software-Header "User-Agent:" implementiert (-zu):
  ----------------------------------------------------------------------
  Statt der experimentellen Software-Header "X-Newsreader:" (News) und
  "X-Mailer:" (Mails) erzeugt der E-UUZ/II für fast alle Inkarnationen
  von ZConnect-MAILER:-Headern der unter der "alten" SLizenz weiterent-
  wickelten CrossPoint-Versionen jetzt den längst zum Quasi-Standard
  gewordenen RFC-Header "User-Agent:", wie er im USEFOR-Draft (Nachfol-
  geentwurf zu RFC1036) beschrieben und definiert ist. Die Syntax des
  Headers ist an die dort niedergelegten Regeln gebunden und er kann
  daher nicht völlig wahlfrei gestaltet werden. Der vom E-UUZ/II gene-
  rierte "User-Agent:"-Header hat für alle Inkarnationen/XP-Versionen
  die folgende einheitliche Form:
  ------------------------------------------------------------------------
  <XP> (CrossPoint)/<ver> ["<nick>"] ([<R>;] [<cOS>/<rOS> <ovr>;] [<dat>])
  ------------------------------------------------------------------------
  Die eckigen Klammern zeigen an, daß die Angabe optional ist bzw. nicht
  in allen MAILER:-Headern zwingend vorkommen muß, die in "<>" einge-
  schlossenen Platzhalter haben folgende Bedeutung:
  ----------------------------------------------------------------------
  <XP>  : Der Name des weiterentwickelten XP-Derivats, also "OpenXP",
          "OpenXP/16", "XP2", "FreeXP" usw. Es werden alle beliebigen
          Namen unterstützt außer denen, die unzulässige Zeichen enthal-
          ten (wobei unzulässige Schrägstriche wie bei "OpenXP/16" auto-
          matisch entfernt werden), sowie "UKAW" und "Agent", die
          erkennbar keine XP-Versionen sind, als "CrossPoint/UKAW" und
          "CrossPoint/Agent" real aber vorkommen.
  <ver> : Die Versionsnummer (v3.31.006, v3.40 usw.) ohne "v" und ggf.
          mit der durch einen Bindestrich angehängten "Statusbezeich-
          nung" wie "alpha", "beta", "RC3" usw.
  <nick>: Der "Rufname" (z.B. "Halloween") einer Version. Klammerzusätze
          bei älteren XP2-Versionen wie "(www.xp2.de)" sind keine
          Rufnamen, daher werden bei allen XP-Versionen außer FreeXP nur
          die Begriffe als Rufnamen gewertet, die innerhalb der Klam-
          mern zusätzlich in Anführungszeichen eingeschlossen sind. Bei
          FreeXP gelten alle in Klammern eingeschlossenen Strings außer
          "(XMS)" und "(EMS)" als Rufnamen, etwaig fehlende Anführungs-
          zeichen werden ergänzt.
  <R>   : Die Registrierungsnummer (z.B. "R/C816" oder auch "R/Free").
          Org- und Kom-Registrierungen werden berücksichtigt.
  <cOS> : Die Betriebssystemplattform, für die die jeweilige XP-Version
          compiliert wurde (z.B. "DOS16" oder "W32"). Bei XP2-Versionen
          wird diese immer aus dem MAILER:-Header ausgelesen (wobei
          Schrägstriche entfernt werden), bei OpenXP und OpenXP/16 wird
          sie im Falle der Versionen v3.2x-v3.4x sowie bei FreeXP immer
          fest mit "DOS16" definiert. Bei allen anderen (bisher unbe-
          kannten) XP-Derivaten würde die Angabe weggelassen werden.
  <rOS> : Die Kurzbezeichnung der Betriebssystemplattform bzw. -version,
          unter der XP bzw. der UUZ aktuell läuft. Diese wird vom UUZ
          zur Laufzeit ermittelt, unterstützt werden dabei DOS, Win3.x,
          Win95/98/Me, WinNT/2K/2K3/XP/Vista, Linux/DOSEMU und DOSBox.
          WinNT, Win2K(3), WinXP und WinVista können nur voneinander
          unterschieden werden, wenn die XP_NTVDM.DLL von FreeXP im UUZ-
          Verzeichnis liegt, anderenfalls würden sie als "WinNT" zusam-
          mengefaßt werden. Darüber hinausgehende Informationen über die
          OS-Version (wie z.B. die unter X/S/S angezeigte Build-/Revisi-
          onsnummer) werden im "User-Agent:"-Header nicht ausgegeben.
          Bei nativen XP2-Compilaten für die Plattform Linux (so es
          solche jemals geben sollte, in den Quelltexten ist sie jeden-
          falls vorgesehen) würde die Angabe weggelassen werden, da ein
          solches Compilat ohnehin nur unter dieser Plattform lauffähig,
          sie daher redundant (weil bereits in <cOS> enthalten) und der
          E-UUZ/II auch gar nicht in der Lage wäre, die genaue Linux-
          Distribution und -Version zu ermitteln.
  <ovr> : Angabe, ob der Overlay-Cache im EMS oder im XMS angelegt
          wurde (kann derzeit nur bei OpenXP/16 und FreeXP vorkommen).
          Der String wird immer in eckige Klammern eingeschlossen, es
          sei denn, es liegen weder eine Registrierungsnummer noch ein
          Compilierdatum noch weitere betriebssystemspezifische Angaben
          vor.
  <dat> : Datums- und Zeitstempel, an dem die Version compiliert wurde
          (üblicherweise hinter einem "@" stehend, kann derzeit nur bei
          OpenXP, OpenXP/16 und FreeXP vorkommen).
  ----------------------------------------------------------------------
  Typische "User-Agent:"-Header für FreeXP und XP2 würden also wie folgt
  aussehen können (Compilierdatum wegen der Zeilenlänge hier unterschla-
  gen):
  ----------------------------------------------------------------------
    User-Agent: FreeXP (CrossPoint)/3.40-RC3 (R/C816; DOS16/Win98 [XMS])
    User-Agent: XP2 (CrossPoint)/3.31.006-Beta (R/C816; DOS16/WinXP)
  ----------------------------------------------------------------------
  Weiterführende und ergänzende Anmerkungen/Hinweise zum "User-Agent:"-
  Header:
  1. Er wird nur bei den zur CrossPoint-Familie gehörenden XP-Versionen
     (= alte SLizenz) erzeugt, und dort nur bei denen (das sind aller-
     dings die weitaus meisten), deren MAILER:-Header mit
       "CrossPoint/<XP>"   oder
       "CrossPoint [<XP>]" beginnen, oder die mit
       "CrossPoint "       beginnen und auf " (www.xp2.de)" enden
                           (ältere XP2-Versionen haben sich seltsamer-
                           weise nicht mit "XP2" zu erkennen gegeben,
                           sondern durch die Angabe des URL am Ende des
                           Headers).
     Von OpenXP-Versionen (GPL) erzeugte MAILER:-Header, die nicht wie
     oben beschrieben gestaltet sind, würden also z.B. nicht angetastet
     (und die von allen anderen Programmen erzeugten Header sowieso
     nicht).
  2. Selbst wenn die unter 1. genannten Voraussetzungen vorliegen, wird
     dennoch kein "User-Agent:"-Header erzeugt, falls
     a) der ursprüngliche MAILER:-Header länger als 255 Zeichen ist,
        oder
     b) der resultierende "User-Agent:"-Header länger als 254 Zeichen
        werden würde, wobei Informationen über Betriebssystemplattfor-
        men, die nicht Bestandteil des originalen MAILER:-Headers sind,
        bei der Berechnung unberücksichtigt bleiben und daher ggf. unter
        den Tisch fallen würden, oder
     c) durch die Existenz einer nicht-leeren Textdatei ADDGATE ein
        Gatebetrieb signalisiert wird (Ausnahme siehe Punkt 3.).
     In diesen Fällen wird der MAILER:-Header wie bisher unverändert und
     in voller Länge nach "X-Mailer:" bzw. "X-Newsreader:" übernommen.
     Der Aufwand, in den Fällen a) und b) auch längere Header zu unter-
     stützen, ist angesichts der gänzlich fehlenden Praxisrelevanz zu
     hoch.
  3. Im Falle einer Konvertierung in uz- und unmittelbar anschließend
     wieder in zu-Richtung erkennt die Routine, ob es sich bereits um
     einen von ihr selbst im USEFOR-konformen Format generierten
     XP-Header handelt, übernimmt in diesem Sonderfall den Inhalt unver-
     ändert und stellt ihm den Headernamen "User-Agent:" voran. Dies
     gilt auch für den Gatebetrieb.
     Bei von allen anderen Programmen und XP-Versionen erzeugten Headern
     wird wie bisher "X-Mailer:" bzw. "X-Newsreader:" erzeugt, weil
     diese nicht an eine bestimmte Syntax gebunden sind und der UUZ
     nicht die Syntax der von anderen Programmen erzeugten Header prüfen
     kann und will. Anderenfalls würde u.U. der Originalinhalt der von
     Fremdprogrammen erzeugten Header verändert werden (müssen).
  4. Die oben beschriebene Gestaltung (erst der Name des XP-Derivats,
     dann "CrossPoint" in Klammern, dann Versionsnummer) war deshalb
     notwendig, weil zum einen nicht direkt an einen Kommentar
     (= Klammerzusatz) angrenzende Leerzeichen sowie ausgerechnet die
     von fast allen XP-Versionen verwendeten Zeichen "[", "]" und "/" im
     "User-Agent:"-Header außerhalb eines Kommentars unzulässig sind
     bzw. eine spezielle Bedeutung haben (hinter "/" steht per Defini-
     tion immer die Versionsnummer). Zum anderen ist nur so gewährlei-
     stet, daß die jeweiligen XP-Derivate in Newsreader-Statistiken auch
     unter ihrem eigenen "Produktnamen" (statt alle gemeinsam unter
     "CrossPoint") aufgeführt und dabei gleichzeitig die Auflagen der
     alten SLizenz hinsichtlich der Namensgebung des Programms beachtet
     werden.
     Die Gestaltung des Headers ist bereits am 02.01.2006 rein vorsorg-
     lich mit dem Lizenzgeber Peter Mandrella einvernehmlich abgestimmt
     worden.
  5. Die Routine berücksichtigt (soweit bekannt) Sonderfälle wie die
     "DOSBOX-Edition" von FreeXP, die nicht durch allgemeingültige
     Routinen zu behandeln waren. Bei der Ermittlung des Rufnamens, der
     Versionsnummer und der "Statusbezeichnungen" werden wegen früherer
     etwas unglücklich gestalteter Header wie
     --------------------------------------------------------
       MAILER: CrossPoint/OpenXP v3.40myRC3@0601021904 R/C816
     --------------------------------------------------------
     Heuristiken angewendet, die bei allen bisher bekannten und geteste-
     ten Inkarnationen von MAILER:-Headern einwandfrei funktionieren
     (und auch bei schrägen Testkonstrukten, die real bisher so nicht
     vorgekommen sind). Auch seltene (aber real vorkommende) Anhängsel
     wie bei
     --------------------------------------------------------------------
       MAILER: CrossPoint [OpenXP/16] v3.40 RC3 @ 2804022000 R/C816- CS R
     --------------------------------------------------------------------
     bringen die Routine nicht ins Schleudern. Die Reihenfolge der
     einzelnen Elemente im Header spielt (nahezu) keine Rolle, vom
     Bereich Versionsnummer/Statusbezeichnung mal abgesehen.
     Soweit die MAILER:-Header dem von der jeweiligen XP-Version erzeug-
     ten Originalformat entsprechen, erfolgt die Umwandlung in das
     USEFOR-konforme Format verlustfrei. Benutzerspezifische Ergänzungen
     und Veränderungen werden, soweit sie die Struktur des Headers nicht
     bis zur Unkenntlichkeit zerstört haben, ebenfalls berücksichtigt
     (ein "CrossPoint/MeinXP R/C816 V6 v3.31.90rcRC  1" würde vollstän-
     dig und korrekt als "MeinXP (CrossPoint)/3.31.90rc-RC1 (R/C816)" in
     den "User-Agent:"-Header übernommen werden).
  6. Als Begriffe für "Statusbezeichnungen" werden - in beliebiger
     Schreibweise - unterstützt: "alpha", "beta", "Pre", "RCn" (weitere
     sind bisher nicht gesichtet worden).
  7. Die Gestaltung des "User-Agent:"-Headers kann benutzerseitig durch
     folgende UUZ-Kommandozeilenparameter beeinflußt werden:
     -------------------------------------------------------------------
     "-OSfamily": Statt der verwendeten Version des Betriebssystems
                  ("DOS-6.22", "Win98", "WinXP") wird nur die Familie
                  ausgegeben, zu der das Betriebssystem gehört ("DOS",
                  "Win9x", WinNT"). Nur wirksam, wenn weder "-privacy"
                  noch "-noUAgent" angegeben wurden.
     "-privacy" : Sämtliche Informationen über das Betriebssystem (dazu
                  gehören alle der weiter oben beschriebenen Platzhalter
                  <cOS>, <rOS> und <ovr>) werden unterdrückt, selbst
                  wenn sie bereits Bestandteil des originalen MAILER:-
                  Headers waren. Nur wirksam, wenn "-noUAgent" nicht
                  angegeben wurde.
     "-noUAgent": Es wird kein "User-Agent:"-Header erzeugt, der Inhalt
                  des MAILER:-Headers wird wie bisher unverändert und
                  ungekürzt nach "X-Mailer:" bzw. "X-Newsreader:" über-
                  nommen.
     -------------------------------------------------------------------
     Um Kommandozeilenparameter des UUZ auch dann nutzen zu können, wenn
     die jeweilige XP-Version keine entsprechenden Dialogoptionen zur
     Verfügung stellt, können diese jetzt über die Parameterdatei
     UUZ.OPT übergeben werden, mehr dazu im übernächsten Abschnitt.
  8. Sofern nach den obigen Regeln ein "User-Agent:"-Header erzeugt
     wird, wird bei Mails gleichzeitig eine Kurzform davon (ohne sämt-
     liche Kommentare, d.h. alle in Klammern stehenden Zusätze) für den
     vom UUZ ebenfalls erzeugten "Received:"-Header verwendet. Bisher
     wurde immer der komplette String aus den im Laufe der Jahre immer
     umfangreicher gewordenen MAILER:-Headern in den "Received:"-Header
     übernommen, jetzt würde die verschlankte Fassung z.B. so aussehen
     (Datum wegen Zeilenlänge gekürzt):
     --------------------------------------------------------------------
     Received: by freexp.de (FreeXP/3.40-RC3); 25 Dec 2005 18:07:15 +0100
     --------------------------------------------------------------------
     Informationen wie Rufnamen, Betriebssystem, Compilierdatum u.ä.
     sind in einem reinen Transport-Header wie "Received:" schlicht
     überflüssig und unangebracht.
  ----------------------------------------------------------------------
  9. WICHTIGER Hinweis für alle Benutzer von UKAW und UKAD:
     UKAW/UKAD verändern in allen Versionen der letzten Jahre (seit
     v2.43/v1.65 von April 2001) die Software-Header ("X-Newsreader:",
     "X-Mailer:", "User-Agent:") aller ausgehenden Nachrichten, um sich
     dort mit dem Zusatz "/Agent" selbst zu verewigen und Anhängsel wie
     "via NNTP" oder "via BSMTP" zu erzeugen. Davon abgesehen, daß dies
     für sich schon eine kaum zu tolerierende Unsitte ist, ignorieren
     UKAW/UKAD im Falle "User-Agent:" dabei, daß der Header nicht völlig
     wahlfrei gestaltet werden kann und produzieren dadurch Header in
     einer ungültigen Syntax, die nicht mit der Spezifikation im USEFOR-
     Draft konform ist. Im Falle der hier beschriebenen Form des "User-
     Agent:"-Headers unterschlagen sie dabei zusätzlich nahezu alle im
     originalen Header enthaltenen Informationen und verstümmeln ihn
     (offenbar mangels eines tauglichen Parsers) zu:
     -------------------------------------------------
       User-Agent: CrossPoint/Agent [FreeXP], via NNTP
     -------------------------------------------------
     Abgesehen von der ungültigen Syntax sind also Versionsnummer,
     Registrierungsnummer, sämtliche betriebssystemspezifischen Infor-
     mationen und das Compilierdatum vernichtet worden. Stattdessen
     definiert sich "Agent" als die Versionsnummer von CrossPoint. Wer
     UKAW/UKAD in einer dieser Versionen zusammen mit dem E-UUZ/II von
     FreeXP einsetzt, *muß* daher handeln, um keine ungültigen Software-
     Header zu erzeugen.
     FreeXP hat - ursprünglich aus ganz anderem Anlaß - bereits im Juni
     2005 ein Patch-Tool zur Verfügung gestellt, mit dem sich alle
     bekannten und aktuell im Einsatz befindlichen UKAW-Versionen so
     patchen lassen, daß u.a. Software-Header generell nicht mehr
     verändert werden. Als (unbeabsichtigter) Nebeneffekt werden auch
     die von UKAW bisher zusätzlich erzeugten Header "X-Nntp-Client:"
     und "X-BSmtp-Client:" nicht mehr erzeugt. Mit demselben Tool läßt
     sich der Patch auch wieder rückgängig machen, Weitere Details siehe
     in UKAWP.TXT (wie das Patchtool UKAWP.EXE selbst Bestandteil des
     Archivs, in dem auch diese Dokumentation liegt). Das Tool ist
     separat zum Download verfügbar unter:
     -----------------------------------------------
       ftp://ftp.freexp.de/freexp/clients/ukawp.zip
       http://www.freexp.de/freexp/clients/ukawp.zip
     -----------------------------------------------
     Nicht der Spezifikation entsprechende "User-Agent:"-Header werden
     von Dritten (aus verständlicher Unkenntnis heraus, aber dennoch
     unberechtigt) sicher nicht UKAW, sondern primär der verwendeten
     XP-Version, sekundär evtl. auch dem E-UUZ/II, angelastet werden,
     obwohl diese daran völlig unschuldig sind. Nicht nur deshalb sollte
     der Patch bei Einsatz des E-UUZ/II von FreeXP unbedingt angewendet
     werden.
     Im Interesse sauberer, von unnötigem Ballast befreiter und unverän-
     derter Header ist der Einsatz des Patch-Tools aber auch dann sinn-
     voll und empfehlenswert, wenn ein anderer UUZ als der E-UUZ/II von
     FreeXP eingesetzt wird, der keinen "User-Agent:"-Header erzeugt.
     Außerdem wird er auch noch wegen eines kapitalen Bugs in UKAW v3.50
     und UKAD v2.50 benötigt, mehr dazu im nächsten Abschnitt.
  ----------------------------------------------------------------------
  UUZ.PAS, UUZ0.PAS

MY:
- Änderung (-zu): Header "X-XP-Version:" wird nicht mehr in allen Fällen
  erzeugt und kann nun auch komplett deaktiviert werden
  ----------------------------------------------------------------------
  Der vom E-UUZ erzeugte Header "X-XP-Version:" ist ein Workaround für
  das oben beschriebene Verhalten von UKAW/UKAD, die Software-Header zu
  verändern. Er wird jetzt nur noch dann erzeugt, wenn der Name des
  Programms den String "CrossPoint" in beliebiger Schreibweise enthält
  (war im Falle einer unmittelbar aufeinanderfolgenden uz- und zu-Kon-
  vertierung bei von anderen Programmen als XP erzeugten Nachrichten
  schlicht unzutreffend...).
  Mit dem Kommandozeilenparameter "-noXPver" läßt er sich nun auch
  komplett deaktivieren. Im Falle der Anwendung des oben beschriebenen
  Patch-Tools ist er überflüssig und die Deaktivierung in diesem Fall
  daher auch die unbedingt empfohlene Verfahrensweise.
  In folgenden Fällen sollte er jedoch aktiviert bleiben:
  a) Es wird UKAW bis v2.95 oder UKAD bis v1.95 in ungepatchter Fassung
     eingesetzt und der Header "User-Agent:" ist mit dem Schalter
     "-noUAgent" deaktiviert worden (UKAW/UKAD verändern in diesen
     Versionen nur Nachrichten mit den Headern "X-Newsreader:" oder
      "X-Mailer:").
  b) Es wird UKAW v3.00-v3.38 oder UKAD v2.00-v2.38 in ungepatchter
     Fassung eingesetzt (UKAW/UKAD verändern in diesen Versionen alle
     Software-Header).
  Unbedingt und in jedem Fall deaktiviert werden sollte er allerdings
  beim Einsatz von UKAW v3.50 bzw. UKAD v2.50, auch wenn die Version
  ungepatcht ist. Während der Testphase zum oben beschriebenen Header
  "User-Agent:" hat sich nämlich ein kritischer Bug in diesen Versionen
  herausgestellt, der dazu führen kann, daß ausgehend wie eingehend
  Header zerstört und Nachrichten deshalb z.B. nicht mehr korrekt
  decodiert werden können. Dies hängt mit dem destruktiven Bemühen von
  UKAW/UKAD, alle mit "X-XP-" und "X-RFC-" beginnenden Header zu
  vernichten (was auf die vom E-UUZ erzeugten Header "X-XP-Version:" und
  "X-RFC-Converter:" abzielt) sowie der dabei völlig fehlenden Berück-
  sichtigung gefalteter Headerzeilen zusammen. Weitere Details dazu
  siehe UKAWP.TXT.
  Alles in allem sollte man schon aufgrund dieses Bugs in UKAW/UKAD die
  Versionen v3.50 (UKAW) bzw. v2.50 (UKAD) gar nicht in ungepatchtem
  Zustand betreiben. Dann werden die besagten Header nicht mehr entfernt
  und es kann daher auch nicht zu den erwähnten Folgen kommen. Da aber
  gleichzeitig auch keine Software-Header mehr verändert werden, sollte
  dann natürlich "X-XP-Version:" ebenfalls deaktiviert werden.
  UUZ.PAS, UUZ0.PAS

MY:
- Parameterdatei UUZ.OPT implementiert (-uz/-zu):
  ----------------------------------------------------------------------
  Über die Parameterdatei UUZ.OPT können dem UUZ jetzt Kommandozeilen-
  optionen übergeben werden. Dies ist sinnvoll (und im Zusammenhang mit
  den neuen Optionen zum "User-Agent:"-Header sogar notwendig), wenn die
  jeweilige XP-Version keine Möglichkeit vorsieht, die gewünschten
  Optionen per Konfigurationsdialog im Programm zu setzen, oder wenn
  aufgrund der Länge der verwendeten Pfad- und Dateinamen die Gesamt-
  länge der Kommandozeile an die Grenzen stößt, die das jeweilige
  Betriebssystem vorgibt.
  Beim Anlegen von UUZ.OPT sind folgende Regeln zu beachten:
  1. Die Datei muß im UUZ-Verzeichnis (i.d.R. identisch mit dem
     XP-Verzeichnis) liegen.
  2. Die Datei wird vor den auf der Kommandozeile angegebenen Parametern
     ausgewertet. Dadurch haben direkt auf der Kommandozeile angegebene
     Parameter Priorität. Da Kommandozeilenparameter aber nicht umkehr-
     bar sind, wäre dies im Moment nur für die Optionen
       -mbox[o|rd]
       -bBoxname
       -uUser
     relevant, weil nur hier ein auf der Kommandozeile angegebener Wert
     einen ggf. davon abweichend in UUZ.OPT gesetzten Wert überschreiben
     würde.
  3. Die Datei muß pro Zeile genau einen Parameter enthalten. Die Optio-
     nen sind genauso einzutragen wie auf der Kommandozeile (d.h. mit
     führendem "-").
  4. Es werden nur mit einem führenden "-" versehene Parameter (im UUZ-
     Jargon "Switches") ausgewertet. D.h., es können keine Datei- und
     Verzeichnisnamen, Sites, Domains etc. übergeben werden. Der Grund
     liegt darin, daß dann eine bestimmte Reihenfolge beim Vornehmen der
     Einträge in UUZ.OPT einzuhalten gewesen wäre, unterschiedliche
     Bereiche für uz- und zu-Konvertierung (Sections) in UUZ.OPT vorge-
     sehen und ausgewertet sowie außerdem die Einträge in UUZ.OPT mit
     den Optionen auf der Kommandozeile "irgendwie" zu einem sinnvollen
     Ganzen hätten verschmolzen werden müssen.
  5. Die Parameter "-uz" und "-zu" (also die Konvertierungsrichtung)
     können nur über die Kommandozeile gesetzt werden.
  6. Bei den Parametern
       -client
       -LFN
       -xp2
     kann optional durch Voranstellen von "uz:" bzw. "zu:" definiert
     werden, für welche Konvertierungsrichtung die Option gelten soll.
     Alle übrigen Parameter werden automatisch nur für die Richtung
     ausgewertet, für die sie gültig sind, ein etwaiges "uz:" oder "zu:"
     vor diesen Optionen wird ignoriert.
  7. Leerzeilen und nicht den obigen Regeln entsprechende Einträge in
     UUZ.OPT werden ohne Fehlermeldung ignoriert.
  8. Die via UUZ.OPT übergebenen Parameter gelten naturgemäß global,
     box-spezifische Differenzierungen sind daher nicht möglich.
  9. Die Verwendung von Umgebungsvariablen ist nicht möglich.

MY:
- Interne Änderung: Das via 'InitWinVersion' reservierte Handle für die
  XP_NTVDM.DLL wird jetzt via 'DestructWinVersion' auch wieder sauber
  freigegeben.
  UUZ.PAS

MY:
- Behandlung des UUZ-Suchpfades korrigiert/optimiert: UUZ erzeugt und
  erwartet seine intern verwendeten Dateien wie MAIL.RFC, NEWS.RFC,
  UUZ.OPT, UUZ_ERR.LOG etc. jetzt auch dann in seinem eigenen Verzeich-
  nis ("OwnPath"), wenn er von einem anderen Verzeichnis aus mit relati-
  vem oder voll qualifiziertem Pfad aufgerufen wurde. Bisher wurden
  die Dateien in diesem Fall im aktuellen Verzeichnis ("ShellPath")
  erzeugt bzw. erwartet und konnten dann nicht gefunden werden.
  Diese Änderung ist nur relevant für den Extern- oder Testbetrieb. Im
  Normalbetrieb mit FreeXP und XP2 wurden die Dateien auch bisher schon
  in dem Verzeichnis erzeugt und erwartet, in dem sich der UUZ selbst
  befand.
  UUZ.PAS, UUZ0.PAS, TYPEFORM.PAS

MY:
- Behandlung von Mailadressen in "Newsgroups:"- und "Followup-To:"-
  Headern korrigiert/optimiert (-uz):
  ----------------------------------------------------------------------
  Zwar dürfen weder in "Newsgroups:"- noch in "Followup-To:"-Headern
  Mailadressen vorkommen, bisweilen tun sie das aber trotzdem. Diesem
  Umstand tragen die nachfolgenden Änderungen Rechnung:
  1. Bei einer oder mehreren Mailadressen in einem "Newsgroups:"-Header
     werden diese jetzt nicht mehr wie bisher als vermeintliches Brett
     behandelt und mit durch "/" ersetzten Punkten in einen EMP:-Header,
     sondern als echte Mailadresse in einen OEM:-Header übernommen.
     Newsgroup-Namen werden wie bisher ausschließlich in EMP:-Header
     übernommen.
     Dadurch wird anders als bisher bei einer öffentlichen Antwort auf
     ein solches Posting nicht mehr eine zusätzliche Mail an eine ungül-
     tige Mailadresse wie
     --------------------------------------------------
       EMP: +t-online:/theo/tester@test/de
     --------------------------------------------------
     erstellt, und bei einer PM-Antwort stehen die Mail-Adressen aus den
     Headern "Newsgroups:" und "Followup-To:" jetzt im korrekten Format
     zur Verfügung.
     Enthält der "Newsgroups:"-Header ausschließlich eine oder mehrere
     Mailadressen, wird die erste in einen EMP:- und die übrigen in
     OEM:-Header übernommen (ansonsten würde ein ZConnect-Puffer ohne
     EMP:-Header erzeugt werden).
  2. Kommen Mailadressen in einem "Followup-To:"-Header vor, wird der
     Header nicht mehr wie bisher komplett verworfen, sondern die News-
     groups in Diskussion-in:- und die Mailadressen in ANTWORT-AN:-
     Header geschrieben.
  In beiden Fällen durchlaufen die Mailadressen - unabhängig von dem
  Format, in dem sie vorliegen - dieselbe Behandlung wie Adressen im
  "To:"- oder "Reply-To:"-Header (d.h. insbesondere, daß Kommentare
  sowie überflüssige quoted-strings und quoted-pairs entfernt werden).
  Etwaige Realnames werden dabei berücksichtigt, analog zu Adressen im
  "To:"- oder "Reply-To:"-Header aber anschließend verworfen.
  UUZ.PAS, UUZ0.PAS, MIMEDEC.PAS

MY:
- Erzeugung des "Received:"-Headers bei Mails geändert/korrigiert (-uz):
  Der Header wird jetzt nicht mehr wie bisher mittels einer Stringaddi-
  tion zusammengesetzt, sondern dessen einzelne Bestandteile durchlaufen
  separat die Routine 'EncodeFoldQuote'. Praktische Konsequenzen:
  1. Es können keine Zeichen mehr durch einen Stringüberlauf verloren-
     gehen (z.B. im Falle eines langen Software-Strings und/oder einer
     langen Adresse des Envelope-Empfängers).
  2. Der Header wird nicht mehr fest verdrahtet vor einem etwaigen
     Envelope-Empfänger sowie dem Datum gefaltet, sondern nur noch dann
     (und an der spätestmöglichen Position), wenn die Gesamtlänge des
     Headers dies erfordert. Vergleich vorher/nachher:
  ---------------------------------------------------------------------
  Received: by freexp.de (FreeXP/3.40);
          Mon, 09 Jan 2006 23:52:45 +0100
  Received: by freexp.de (FreeXP/3.40); Mon, 09 Jan 2006 23:56:45 +0100
  ---------------------------------------------------------------------
  3. Wird durch die Existenz der Datei ADDGATE ein Gatebetrieb signali-
     siert, entfällt die Angabe des Mailprogramms im "Received:"-Header.
  UUZ.PAS

MY:
- Behandlung von Cancel/Supersedes- und Control-Nachrichten überarbeitet
  (-uz):
  ----------------------------------------------------------------------
  1. Cancel- und Supersedes-Nachrichten werden nur noch dann als solche
     behandelt, wenn es sich entweder um Postings (News) oder um Mails
     in eine Mailingliste handelt. Als Mailinglisten-Nachrichten gelten
     Mails dann, wenn sie einen der folgenden RFC-Header enthalten:
     -------------------------------------------------------
       "List-Help:"            (RFC2369)
       "List-Subscribe:"       (RFC2369)
       "List-Unsubscribe:"     (RFC2369)
       "List-Post:"            (RFC2369)
       "List-Owner:"           (RFC2369)
       "List-Archive:"         (RFC2369)
       "List-Id:"              (RFC2919)
       "X-List-Administrivia:" (proprietärer Mailman-Header)
     -------------------------------------------------------
     Im Falle von Mails, die diese Voraussetzungen nicht erfüllen, werden
     die RFC-Header "Control: cancel <MsgID>" und "Supersedes: <MsgID>"
     ignoriert.
  2. Im XP2-Modus wird eine Nachricht mit einem "Control:"-Header nur
     noch dann als Cancel-Nachricht behandelt, wenn der Headerinhalt
     auch tatsächlich den String "cancel " enthält. Bisher wäre auch bei
     "Control:"-Headern mit ganz anderem Inhalt blind das Cancel-Flag
     gesetzt worden (was allerdings i.d.R. keine Auswirkungen gehabt
     hätte, weil es an der Message-ID der zu cancelnden Nachricht
     gefehlt hätte). Die bisherige Logik entsprach dem Verhalten des UUZ
     von XP2, jetzt ist sie mit der Logik des E-UUZ im Standard-Modus
     identisch. Die XP2-spezifische und sich von FreeXP unterscheidende
     Behandlung von Cancel-Nachrichten (Cancel-Flag statt der ZC-Header
     "STAT: CTL" und "CONTROL: cancel MsgID") wird nach wie vor berück-
     sichtigt.
  3. Bei allen "Control:"-Headern, die keinen Cancel-Befehl enthalten,
     wird der Inhalt nur noch dann in den ZC-Header CONTROL: übernommen,
     wenn es sich um ein Posting handelt (also auch nicht bei Mails in
     eine Mailingliste). Im XP2-Modus wird wie bisher grundsätzlich kein
     CONTROL:-Header erzeugt.
  Die beschriebenen Änderungen dienen dazu, technisch bisher durchaus
  mögliches Canceln/Superseden privater Mails zu unterbinden.
  UUZ.PAS, UUZ0.PAS

MY:
- Neue Importschnittstelle für das "raw"-Format implementiert:
  ----------------------------------------------------------------------
  Der E-UUZ/II kann jetzt auch Mails im sog. "raw"-Format (Mailformat,
  wie es von einer POP3-Mailbox ausgeliefert wird) direkt konvertieren,
  ohne wie bisher auf die üblichen Schlüsselzeilen ("HELO" bei SMTP-
  Mails, "From_" bei UUCP/mbox-Mails) am Anfang der Mail angewiesen zu
  sein. Naturgemäß kann eine Datei im raw-Format immer nur eine einzige
  Mail enthalten.
  Das Format wird automatisch erkannt. Eine Datei wird vom E-UUZ dann
  als Mail betrachtet, wenn die erste Zeile einen syntaktisch gültigen
  RFC-Headerbezeichner enthält.
  Ansonsten gelten hinsichtlich der Auswertung von RFC-Headerzeilen
  sowie der Erkennung und Behandlung von Header und Body exakt dieselben
  Regeln, wie sie in diesem Dokument bereits an früherer Stelle
  ('ReadRFCheader') ausführlich behandelt wurden.
  UUZ.PAS, UUZ0.PAS


- Beteiligte Entwickler an dieser UUZ-Version:
  ----------------------------------------------------------------------
  MY - Michael Heydekamp (Programmierung und Dokumentation)
  MW - Martin Wodrich    (Erweiterung der Windows-Versionserkennung)


- Credits für diese UUZ-Version:
  ----------------------------------------------------------------------
  Hans-Jürgen Tänzer - Umfassende Massentests, wertvolle Anregungen
                       und intensive Fachdiskussionen
                   -+
  Johann Addicks    |
  Oliver Gampe      |
  Reinhard Irmer    |
  Franklin Schiftan +- Praxistests (FreeXP/XP2)
  Alfred Schröder   |
  Jörg Tewes        |
  Martin Wodrich    |
                   -+


+--------------------------------------------------------------+
|  26.09.2003-07.08.2004  (Testversionen E-UUZ/II v3.40.1a/b)  |
+--------------------------------------------------------------+

MY:
- Erneut umfassende Umbauten, Änderungen, Fixes und Erweiterungen,
  speziell in den Bereichen Zeichensatzunterstützung und Decodierung
  (base64, quoted-printable, UTF-7/8) von Nachrichtentexten und
  teilweise Headern sowie der Auswertung und Deklaration von
  MIME-Nachrichten ("Enhanced UUZ" => "Enhanced UUZ/II")
========================================================================

MY:
- Neue Zeichensätze implementiert:
  ----------------------------------------------------------------------
  Da FreeXP bzw. der Enhanced UUZ seit Erscheinen der letzten Version
  nur noch explizit unterstützte Zeichensätze konvertiert (statt wie
  früher *alle* ISO-Zeichensätze blind auf Basis der mitunter unzutref-
  fenden Tabelle für ISO-8859-1 "kaputtzukonvertieren"), wurden zu den
  bisherigen neun die folgenden zehn zusätzlichen Zeichensätze imple-
  mentiert:
   1. ISO-8859-3   (alias "Latin 3",     Süd-Europa/Türkei)
   2. ISO-8859-4   (alias "Latin 4",     Nord-Europa/Baltikum)
   3. ISO-8859-10  (alias "Latin 6",     Nord-Europa)
   4. ISO-8859-13  (alias "Latin 7",     Nord-Europa/Baltikum)
   5. ISO-8859-14  (alias "Latin 8",     West-Europa/Gälisch)
   6. ISO-8859-16  (alias "Latin 10",    Ost-Europa, mit Euro)
   7. Windows-1250 (alias "Win Latin 2", Ost-Europa, mit Euro)
   8. Windows-1254 (alias "Win Turkish", Türkei, mit Euro)
   9. Windows-1257 (alias "Win Baltic",  Nord-Europa/Baltikum, mit Euro)
  10. Mac OS Roman (alias "MacRoman",    West/Nord-Europa, mit Euro)
  Diese Zeichensätze kommen in Mails und auch in den de.* Newsgruppen
  tatsächlich vor (vermutlich nicht selten infolge einer fehlerhaften
  Konfiguration). Es werden wie schon bei den bisherigen alle bei der
  IANA registrierten Aliasnamen dieser neu implementierten Zeichensätze
  unterstützt.
  Damit unterstützt FreeXP jetzt *alle* Latin-Zeichensätze der ISO-8859-
  Reihe (einschließlich der erst jüngst zugelassenen wie ISO-8859-16),
  alle vier in den USA und Europa gängigen Win-Latin-Codepages, die
  Macintosh-Codepage (ab Mac OS 8.5 mit Euro-Symbol), die DOS-Codepages
  850 und 858 sowie die Unicode-Codierungen UTF-7/8.
  Immerhin 10 dieser nunmehr insgesamt 19 unterstützten Zeichensätze
  bzw. Codierungen enthalten das Euro-Symbol.
  MIMEDEC.PAS

MY:
- Detailkorrekturen bei der Konvertierung einzelner Zeichen:
  ----------------------------------------------------------------------
  1. CP437 => ISO-8859-1:
     Das Steuerzeichen #7 (BEL, optisch identisch mit einem "Bullet")
     wird jetzt in ein "*" konvertiert (bisher: "Middle Dot" #183).
  2. ISO-8859-2 => CP437:
     Zeichen #208 wird jetzt nach "D" konvertiert (bisher: "T"). Es
     handelt sich hier nicht wie in ISO-8859-1 um das an derselben
     Position befindliche und identisch aussehende Zeichen "Latin
     Capital Letter Eth" (Unicode U+00D0), sondern um das Zeichen "Latin
     Capital Letter D with Stroke" (Unicode U+0110).
  3. ISO-8859-9 => CP437:
     a) Zeichen #208 wird jetzt nach "G" konvertiert (bisher: "T").
     b) Zeichen #221 wird jetzt nach "I" konvertiert (bisher: "Y").
     c) Zeichen #254 wird jetzt nach "s" konvertiert (bisher: "t").
  4. Windows-1252/1250/1254/1257 => CP437:
     a) Nicht definierte Zeichen werden jetzt in ein Leerzeichen
        konvertiert (statt in das Zeichen #177, das als Platzhalter
        für unkonvertierbare Zeichen verwendet wird).
     b) Zeichen #130 ("single low-9 quotation mark") wird jetzt in einen
        Apostroph #39 konvertiert (bisher: Komma #44).
     c) Das Zeichen #149 ("Bullet") wird jetzt in das Zeichen "*" #42
        konvertiert (bisher: "Black Square" #254).
  5. Mac OS Roman => CP437:
     Tabelle komplett überarbeitet und an die schon seit der letzten
     Version umfassend geänderten Konvertierregeln der ISO- und Win-
     Zeichensätze angeglichen. (Anmerkung: Eine Konvertiertabelle für
     Mac OS Roman war schon immer in XP enthalten, wurde aber bisher nur
     bei Fido-Nachrichten verwendet).
  6. UTF-7/8 => CP437 (Sonderfall):
     Das Unicode-Zeichen U+03B5 (kleines griechiches Epsilon, identisch
     mit dem Zeichen #238 "ε" in CP437) wird *nicht* in das eigentlich
     richtige Zeichen "ε" konvertiert, sondern in ein "e". Da das
     Zeichen "ε" zukünftig für das Euro-Symbol reserviert ist, würde
     FreeXP sonst bei UTF-7/8-codierten Nachrichten, die das Zeichen "î"
     enthalten, dieses nicht von einem Euro-Symbol unterscheiden können
     und daher beide miteinander verwechseln. Diese Vorsichtsmaßnahme
     ist allerdings eher theoretischer Natur, denn im wirklichen Leben
     wird das Zeichen "ε" - im Unterschied zum Euro-Symbol - so gut wie
     nie verwendet.
  7. Bei allen Zeichensätzen, die das Zeichen "Macron" enthalten (ein
     hochstehender waagerechter Strich, der ähnlich wie die Umlautpunkte
     oberhalb von Zeichen stehen kann und eigentlich nicht einzeln vor-
     kommt), wird dieses jetzt in einen Bindestrich #45 konvertiert
     (bisher: Rahmengrafikzeichen #196).
  MIMEDEC.PAS

MY:
- Unterstützung von Zeichensatz-Aliasnamen erweitert:
  ----------------------------------------------------------------------
  Zusätzlich zu den offiziell bei der IANA registrierten (und somit für
  MIME-Nachrichten einzig zulässigen) Zeichensatz-Aliasnamen werden
  jetzt auch die Aliasnamen aus der primär auf Linux-Systemen verwende-
  ten Library "GNU libc iconv" unterstützt. Es tauchten immer wieder
  Postings in Newsgruppen sowie Mails auf, die den Zeichensatz mit
  einem dieser eigentlich nicht zulässigen Aliasnamen wie "iso8859-1"
  (richtig wäre z.B. "iso-8859-1") deklarierten; diese Nachrichten
  wurden dann nicht konvertiert, was jetzt trotz fehlerhafter Deklara-
  tion der Fall ist.
  MIMEDEC.PAS

MY:
- UTF-7/8-Konvertierung nochmals erweitert:
  ----------------------------------------------------------------------
  Alle 165 Zeichen, die außerhalb von ISO-8859-1 in einem der übrigen
  von FreeXP unterstützten ISO-, Win-, Mac- oder DOS-Latin-Zeichensätze,
  nicht aber in CP437 enthalten sind (z.B. typographische Anführungs-
  zeichen, große und kleine Zeichen mit "Macron", "Ogonek" usw.), wurden
  bisher nur dann konvertiert bzw. transliteriert, wenn die Nachricht
  auch in einem dieser Zeichensätze vorlag und deklariert war. Kamen
  dieselben Zeichen jedoch in einer UTF-7/8-codierten Nachricht vor,
  wurden sie inkonsequenterweise durch das Zeichen #177 als unkonver-
  tierbar repräsentiert. Jetzt umfaßt die UTF-7/8-Decodierung exakt
  denselben Zeichenvorrat wie die Summe aller von FreeXP unterstützten
  Latin-Zeichensätze.
  MIMEDEC.PAS

MY:
- Header-Variablen 'charset' (= Inhalt des ZC-Headers CHARSET:) und
  'ccharset' von bisher 7 Zeichen auf jetzt 30 Zeichen vergrößert, um
  zukünftig auch beliebige und nicht ZC-konforme Charset-Bezeichner
  in zu-Richtung unterstützen und auswerten zu können.
  UUZ0.PAS

MY:
- Bei defekten ausgehenden Newspuffern ohne oder mit leerem EMP:-Header
  (i.d.R. verursacht durch einen fehlerhaften Eingabepuffer) wird jetzt
  keine zweckfreie (eben weil defekte) Ausgangsdatei *.OUT mehr erzeugt.
  UUZ.PAS

MY:
- Fix (-zu): Bei einem fehlerhaften Eingabepuffer wird eine zwischen-
  zeitlich bereits angelegte Temporärdatei 'UUZ.TMP' nach der Erkennung
  des Fehlers jetzt gelöscht.
  UUZ.PAS

MY:
- Interne Änderung: Das Setzen der MIME-Information bei ausgehenden
  Nachrichten über 'SetMimeData' erfolgt bei Mails jetzt nicht mehr
  doppelt. Dies verbessert geringfügig die Performance, war aber vor
  allem wegen der verbesserten Zeichensatzbehandlung im Externbetrieb
  und der Behandlung des Headers "U-Content-Type:" (siehe weiter unten)
  schlicht notwendig.
  UUZ.PAS, UUZ0.PAS

MY:
- Umfassende Fixes, Änderungen und Erweiterungen bei der ZC=>RFC-Konver-
  tierung von Nachrichten, die einen oder mehrere der Header "CHARSET:",
  "X-Charset:" und/oder "U-Content-Type:" enthalten:
  ----------------------------------------------------------------------
  1. Fix: Bei der Konvertierung von Nachrichten, die einen Header
     "U-Content-Type:", jedoch keinen Header CHARSET: oder X-Charset:
     enthielten, wurde bei gleichzeitiger Nichtverwendung des Schalters
     "-chkbody" (der sich von XP aus nicht setzen läßt) die Nachricht
     zwar IBM=>ISO-konvertiert, aber statt des korrekten Zeichensatzes
     ISO-8859-1/15 der Zeichensatz deklariert, der sich im Header
     "U-Content-Type:" befand (das konnte z.B. auch "UTF-8" sein). Dies
     führte nicht selten zu einer fehlerhaften Deklaration, denn dabei
     handelte es sich zwar um den Zeichensatz, in dem sich die originale
     RFC-Nachricht vor der Konvertierung in den IBM-Zeichensatz befunden
     hatte, nicht aber zwingend um den Zeichensatz, in den sie danach
     beim Versand wieder rekonvertiert wurde (nämlich ISO-8859-1/15).
     Bei Nachrichten, die sich im Originalzustand ohnehin bereits im
     Zeichensatz ISO-8859-1/15 befunden hatten, wirkte sich dieser
     Fehler nicht aus. Darüber hinaus waren FreeXP-User von dem Problem
     ohnehin nicht betroffen, weil von FreeXP erzeugte Nachrichten immer
     einen Header CHARSET: oder X-Charset: enthalten, der dem UUZ mit-
     teilt, in welchem Zeichensatz sich die Nachricht bereits befindet
     und daher nicht konvertiert werden darf (CHARSET:) bzw. in welchen
     Zeichensatz sie konvertiert werden soll, mit dem sie dann auch zu
     deklarieren ist (X-Charset:).
     Das Problem konnte also nur im Externbetrieb bei gate-typischen
     Szenarien entstehen, bei denen eine RFC=>ZC-Konvertierung und
     unmittelbar anschließend eine ZC=>RFC-Konvertierung durchgeführt
     wurde. Bei Verwendung des in diesen Fällen ohnehin zu empfehlenden
     Parameters "-chkbody" wurde der Fehler schon bisher vermieden.
     Der "charset"-Parameter im Header "U-Content-Type:" wird jetzt in
     allen Fällen ignoriert. Ist weder der Header X-Charset: noch der
     Header CHARSET: enthalten, setzt der UUZ mangels Charset-Angabe
     jetzt intern den Schalter "-chkbody", prüft somit den Nachrichten-
     text auf das Vorkommen von 8bit-Zeichen und erzeugt eine korrekt
     konvertierte und deklarierte Nachricht (wobei er per Definition wie
     bisher davon ausgeht, daß die Nachricht im IBM-Zeichensatz vorliegt
     und nach ISO-8859-1/15 zu konvertieren ist). Die Deklaration der
     Transportcodierung im neu erzeugten RFC-Header "Content-Transfer-
     Encoding:" (7/8bit) richtet sich dabei wie bisher nach dem ermit-
     telten Zeichensatz.
  2. ZC-Nachrichten, die einen Header CHARSET: enthalten (mit XP kann so
     eine Konstellation in einer ZConnect-Box erzeugt werden, indem der
     Schalter "ZConnect: ISO-Zeichensatz" unter C/O/E/V aktiviert wird),
     fand auch bisher schon keine Zeichensatzkonvertierung statt, wenn
     der Header eine ZC-konforme Zeichensatzbezeichnung ("ISO1" bis
     "ISO9") enthielt - das ist beabsichtigt und korrekt und wird daher
     auch so bleiben.
     Da inzwischen aber unkonvertierte ZConnect-Puffer aufgetaucht sind
     (offenbar von Gates erzeugt oder aus OpenXP exportiert), die nicht
     im IBM-Zeichensatz vorliegen und deren im Header CHARSET: dekla-
     rierter Zeichensatz sowohl hinsichtlich des verwendeten Zeichen-
     satzes selbst ("UTF-8") als auch hinsichtlich der Bezeichnung
     ("ISO-8859-15") nicht mehr den ZConnect-Spezifikationen entspre-
     chen, wurde dieses Verhalten für alle vom Enhanced UUZ unterstütz-
     ten und nicht unterstützten Zeichensätze erweitert, ohne dabei die
     Kompatibilität mit anderen XP-Versionen aufzugeben:
     a) Existiert ein Header CHARSET:, wird die Nachricht ungeachtet
        der verwendeten Zeichensatzbezeichnung nicht konvertiert - mit
        einer Ausnahme: Wenn ein im Sinne von XP lokaler Zeichensatz
        enthalten ist (also US-ASCII oder IBM437), wird die Nachricht
        trotzdem in den entsprechenden ISO-Zeichensatz konvertiert.
     b) Bei allen vom Enhanced UUZ eingehend unterstützten Latin-
        Zeichensätzen (inkl. UTF-7/8) sowie bei den nicht unterstützten
        Non-Latin-Zeichensätzen der ISO-8859-Reihe (ISO-8859-5 bis -8
        und -11) wird dabei jeder IANA-registrierte oder in der weiter
        oben erwähnten iconv-Library enthaltene Aliasname in den
        jeweiligen "preferred MIME name" übersetzt ("IBM819" wird zu
        "ISO-8859-1", "csIsoLatinArabic" zu "ISO-8859-6"). Bei der
        Erkennung lokaler Charsets (siehe Punkt 2. a)) werden ebenfalls
        alle Aliasnamen (wie z.B. "cspc8codepage437") unterstützt und
        ausgewertet.
     c) Gehört der deklarierte Zeichensatz weder zu einem der vom UUZ
        unterstützten noch zu einem der fünf nicht unterstützten Non-
        Latin-Zeichensätze aus der ISO-8859-Reihe und ist daher gänzlich
        unbekannt, wird die Zeichensatzbezeichnung aus dem CHARSET:-
        Header 1:1 übernommen.
     d) Eine automatische Überprüfung des Nachrichtentextes findet bei
        Existenz des CHARSET:-Headers wie bisher nicht statt. Diese läßt
        sich aber nach wie vor im Externbetrieb mit der Kommandozeilen-
        option "-chkbody" erzwingen; dabei würde dann ein evtl. 8bit-
        Zeichensatz nach "US-ASCII" korrigiert werden, wenn die Nach-
        richt nur 7bit-Zeichen enthält.
     e) Eine angeblich im Zeichensatz "UTF-7" vorliegende Nachricht wird
        per Definition immer mit "7bit" deklariert - selbst dann, wenn
        der Schalter "-chkbody" verwendet und die Nachricht 8bit-Zeichen
        enthalten sollte. Der Enhanced UUZ kann dann nicht entscheiden,
        welches der tatsächliche Zeichensatz ist und hält sich daher
        strikt an die Angabe im CHARSET:-Header, obwohl damit eine ein-
        deutig fehlerhaft deklarierte Nachricht erzeugt wird (weil schon
        der Eingabepuffer eindeutig fehlerhaft ist). Man kann halt nicht
        alles reparieren, eine halbwegs seriöse Heuristik für diesen
        Fall existiert nicht, und auch die sonst recht treffsichere
        Glaskugel des Enhanced UUZ hat ihre Grenzen.
  3. Nachrichten mit dem Header X-Charset: (zulässig sind hier nur die
     Zeichensätze US-ASCII, ISO-8859-1 und ISO-8859-15, aber jetzt auch
     mitsamt aller ihrer registrierten und unregistrierten Aliasnamen)
     liegen per Definition im IBM-Zeichensatz vor und werden daher wie
     bisher in den angegebenen ISO-Zeichensatz konvertiert und mit
     diesem Zeichensatz deklariert.
     a) Mit dem Schalter "-chkbody" läßt sich extern nach wie vor eine
        Überprüfung des Body erzwingen und so ggf. eine Korrektur eines
        fehlerhaft deklarierten Zeichensatzes herbeiführen (z.B. bei
        Nachrichten, die fälschlicherweise als US-ASCII deklariert sind,
        aber wie im Falle des Paragraphenzeichens "" nach der ISO-Kon-
        vertierung 8bit-Zeichen enthalten - siehe auch den Abschnitt
        weiter unten zur Kompatibilität des Enhanced UUZ mit XP2).
     b) Sollte der Header X-Charset: einen "unerwünschten" lokalen
        Zeichensatz (z.B. IBM437, kann im Betrieb mit FreeXP nicht
        vorkommen) enthalten, wird er ignoriert, intern der Schalter
        "-chkbody" gesetzt und so eine korrekt konvertierte und dekla-
        rierte Nachricht im entsprechenden ISO-Zeichensatz erzeugt.
  4. Im rein theoretischen Fall, daß sowohl ein Header CHARSET: als auch
     ein Header X-Charset: existieren, besitzt der Header CHARSET:
     Priorität.
  Alle beschriebenen Änderungen gelten ausschließlich für die Behandlung
  des Nachrichtentextes (Header liegen per Definition immer im IBM-Zei-
  chensatz vor und sind daher immer zu konvertieren).
  MIMEDEC.PAS, UUZ.PAS, UUZ0.PAS, XPMAKEHD.INC

MY:
- Konvertierung von Nachrichten mit nicht unterstützten Zeichensätzen
  verbessert (-uz):
  ----------------------------------------------------------------------
  Bei Nachrichten in einem von FreeXP eingehend nicht unterstützten
  Zeichensatz wird dieser jetzt in den ZConnect-Header CHARSET:
  geschrieben (und die Nachricht wie bisher *nicht* konvertiert). Dabei
  wird, soweit möglich und vorhanden, der Name des Zeichensatzes in die
  ZConnect-spezifische Bezeichnung ("ISO1" bis "ISO9") oder alternativ
  in den "preferred MIME name" gemäß IANA umgewandelt. Ist beides nicht
  möglich, wird der Name des Zeichensatzes, wie er im Header "Content-
  Type:" deklariert ist, unverändert übernommen.
  Dieses Vorgehen hat in Verbindung mit den oben beschriebenen Änderun-
  gen, durch die es überhaupt erst ermöglicht und sinnvoll wird, den
  Vorteil, daß bei einer unmittelbar anschließenden Konvertierung in
  zu-Richtung a) der korrekte Zeichensatz deklariert und b) die Nach-
  richt 1:1 und ohne Zeichenverlust weiterversandt werden kann.
  Es ist weniger für XP-User, sondern eher für Anwender interessant und
  von Bedeutung, die den Enhanced UUZ im Gate- oder Externbetrieb ein-
  setzen und ist für diesen Fall deshalb gerechtfertigt und notwendig,
  weil ansonsten keine Möglichkeit bestünde, Nachrichten mit nicht
  unterstützten Zeichensätzen unmittelbar hintereinander in beide
  Richtungen korrekt zu konvertieren und weiterzuversenden.
  Die neue Verfahrensweise unterscheidet sich zu der von OpenXP insbe-
  sondere dadurch, daß *unterstützte* Zeichensätze nach wie vor nach
  CP437 konvertiert werden. Daher ist sie auch mit früheren XP-Versionen
  (die genau wie alle aktuellen XP-Versionen Nachrichten in nicht unter-
  stützten Zeichensätzen weder konvertiert noch unkonvertiert lesbar
  darstellen können) 100%ig kompatibel, während OpenXP sich offenbar
  dazu entschlossen hat, diese Kompatibilität aufzugeben und den Zei-
  chensatz von RFC-Nachrichten überhaupt nicht mehr zu konvertieren,
  wodurch die von OpenXP erzeugten ZConnect-Puffer für andere XP-
  Versionen, sofern sie 8bit-Zeichen enthalten, mitunter unbrauchbar
  sind (FreeXP wird jedoch in einer der nächsten Versionen - möglicher-
  weise sogar in der nächsten - ebenfalls solche unkonvertierten Single-
  part-Nachrichten mit beliebigen unterstützten Zeichensätzen im
  CHARSET:-Header korrekt darstellen können).
  UUZ0.PAS

MY:
- Fix für einen relativ kapitalen Bug bei der ZC=>RFC-Konvertierung, der
  erstaunlicherweise bisher entweder nicht aufgetreten oder nicht
  aufgefallen ist:
  Wenn die Nachricht zwar einen CHARSET:-Header, jedoch *keine* Header
  "U-Content-Type:" und "U-Content-Transfer-Encoding:" enthielt (absolut
  realistisches Szenario, das in einer ZConnect-Box auftreten kann, wenn
  der Schalter "ZConnect: ISO-Zeichensatz" unter C/O/E/V gesetzt ist),
  dann wurde die Nachricht nicht konvertiert (was korrekt ist), aber es
  wurden auch nicht die zwingend erforderlichen Header "Content-Type:"
  und "Content-Transfer-Encoding:" neu erzeugt. Bisher wurde nur auf den
  Header X-Charset: geprüft und nicht berücksichtigt, daß auch Nachrich-
  ten, die wegen des CHARSET:-Headers nicht konvertiert werden dürfen,
  diese Header trotzdem benötigen.
  Bei in einer RFC-Box erstellten Nachrichten oder bei Verwendung des
  Parameters "-chkbody" trat der Bug nicht zutage.
  UUZ0.PAS

MY:
- Fix: Wenn ein Header Zeichen enthielt, die durch die IBM=>ISO-Konver-
  tierung von einem 8bit- in ein 7bit-Zeichen transliteriert wurden
  (z.B. Gamma "â" => "G") und gleichzeitig keine weiteren 8bit-Zeichen
  enthielt, aufgrund derer der Header hätte MIME-codiert werden müssen,
  dann hat der Enhanced UUZ zwar korrekt erkannt, daß keine Codierung
  erforderlich ist, hat dann aber nicht den nach ISO-8859-x konvertier-
  ten 7bit-String in den Header geschrieben, sondern den unkonvertierten
  8bit-String im IBM-Zeichensatz. :-(
  In dieser seltenen Konstellation konnten also theoretisch uncodierte
  8bit-Zeichen in Header gelangen. Der Fall konnte nur bei Rahmengrafik-
  und einigen griechischen Zeichen aus CP437 eintreten, die in der
  Praxis so gut wie nie in Headern verwendet werden - vermutlich deshalb
  ist der Bug auch nie aufgetreten und gemeldet worden.
  UUZ.PAS

MY:
- Charset-Fallback implementiert (-uz):
  ----------------------------------------------------------------------
  Es kommt nicht selten vor, daß Nachrichten im Zeichensatz ISO-8859-x
  deklariert sind, in Wirklichkeit aber im Zeichensatz Windows-125x
  vorliegen (typischer Fehler von OjE). Bei den meisten Zeichen ist das
  kein Problem (speziell nicht im Fall ISO-8859-1 und Windows-1252, weil
  diese Zeichensätze im Bereich 0xA0 bis 0xFF identisch sind), aber wenn
  die Nachricht Zeichen aus dem Bereich 0x80 bis 0x9F enthielt, wurden
  diese bisher nicht korrekt (bzw. gar nicht) konvertiert, weil dieser
  Bereich bei allen ISO-Zeichensätzen für Steuerzeichen reserviert ist.
  Bei Windows-Zeichensätzen hingegen liegen dort z.B. typographische
  Anführungszeichen, verlängerte Bindestriche, das Euro-Symbol usw.,
  also durchaus Zeichen, die auch oft Verwendung finden und konvertier-
  bar sind.
  Der Enhanced UUZ prüft jetzt bei allen Nachrichten, die mit einem der
  unterstützten ISO-Zeichensätze deklariert sind, ob sie Zeichen aus dem
  Bereich 0x80 bis 0x9F enthalten. Ist das der Fall, schließt der UUZ
  daraus, daß die Deklaration "ISO-8859-x" offenbar falsch ist und nimmt
  ein "Fallback" auf den verwandtesten Windows-Zeichensatz vor (das ist
  der, der in der Region, wo der ursprünglich deklarierte ISO-Charset am
  ehesten verwendet wird, Standard ist). Dabei gilt folgende Zuordnung:
    ISO-8859-1  => Windows-1252  (West-Europa)
    ISO-8859-2  => Windows-1250  (Ost-Europa)
    ISO-8859-3  => Windows-1254  (Süd-Europa/Türkei)
    ISO-8859-4  => Windows-1257  (Nord-Europa/Baltikum)
    ISO-8859-9  => Windows-1254  (Türkei)
    ISO-8859-10 => Windows-1257  (Nord-Europa)
    ISO-8859-13 => Windows-1257  (Nord-Europa/Baltikum)
    ISO-8859-14 => Windows-1252  (West-Europa/Gälisch)
    ISO-8859-15 => Windows-1252  (West-Europa)
    ISO-8859-16 => Windows-1250  (Ost-Europa)
  Da die Zeichensätze ISO-8859-1 und Windows-1252 sowie ISO-8859-9 und
  Windows-1254 im Bereich 0xA0 bis 0xFF jeweils identisch sind, wurden
  sie jeweils zu einer einzigen Tabelle zusammengefaßt (da passiert das
  Fallback also quasi automatisch).
  Sofern der UUZ ein Charset-Fallback für den Nachrichtentext vorgenom-
  men hat, vermerkt er das im Header "X-Fallback-Charset:", läßt aber
  die originale Charset-Deklaration im Header "U-Content-Type:" unange-
  tastet.
  Außer im Nachrichtentext funktioniert das Fallback auch in MIME-
  codierten Headern beliebiger Länge (bis 65500 Zeichen). Allerdings
  wird dann *kein* gesonderter Header "X-Fallback-Charset:" erzeugt,
  weil in Headern mehrere Zeichensätze gleichzeitig vorkommen können und
  man nicht für jedes einzelne encoded word einen eigenen Header erzeu-
  gen kann, bei dem zudem die Zuordnung zum jeweiligen encoded word
  nicht eindeutig wäre.
  UUZ0.PAS, MIMEDEC.PAS

MY:
- Decodierungsroutinen für Header und Body (UTF-8, UTF-7, base64,
  quoted-printable) anläßlich eines Bugreports komplett renoviert,
  gefixt, erweitert und robuster gestaltet.
  Während der für das Beheben des gemeldeten Bugs notwendigen Tests
  stellten sich so viele weitere - bisher unbemerkte - Fehler heraus,
  daß umfassende und grundlegende Änderungen erforderlich waren. Die
  bisherigen Routinen für die Decodierung/Konvertierung speziell des
  Nachrichtentextes (Body) waren auf eine Multibyte-Decodierung teil-
  weise gar nicht oder unzureichend ausgelegt und gingen des weiteren
  davon aus, daß codierte Zeilen nie länger sein können als es in den
  einschlägigen RFCs vorgesehen ist bzw. als es die Längenbeschränkung
  von Pascal zuläßt - was aber nicht immer der Praxis entspricht (bei
  Headern bestand der größte Teil der Probleme seit Erscheinen der
  ersten Fassung des Enhanced UUZ nicht mehr, auch wenn der Auslöser im
  konkreten Fall ein Header war).
  Dieser Text richtet sich primär an Entwickler und interessierte
  Anwender und ist daher entsprechend ausführlich, weil das Verständnis
  der Materie für zukünftige Arbeiten am UUZ unerläßlich ist.
  ----------------------------------------------------------------------
  1. (Bugfixes für Decodierung ungültiger UTF-8-Sequenzen)
     Ein über 2 Jahre alter Bugfix in der UTF-8-Decodierung, der dazu
     diente, auch umbrochene bzw. sich über mehrere Teilstrings
     erstreckende Multibyte-Sequenzen decodieren zu können (so etwas
     kann z.B. bei zusätzlich base64- oder quoted-printable-codierten
     Zeilen vorkommen, aber auch bei Zeilen mit mehr als 253 Zeichen),
     führte im konkreten Fall, daß eine Nachricht im Zeichensatz
     ISO-8859-x vorlag, aber fälschlicherweise als UTF-8 deklariert war,
     dazu, daß ein falscher LEN:-Header erzeugt wurde. Der defekte
     Puffer wurde von FreeXP zwar problemlos eingelesen, konnte aber von
     externen Tools wie XPFILTER und XPBMF, die auf einen gültigen
     ZConnect-Puffer angewiesen sind, nicht mehr korrekt bearbeitet
     werden. Bei genauerer Prüfung stellte sich heraus, daß der besagte
     Fix weitere Probleme (möglicher Zeichenverlust, bei entsprechenden
     Konstellationen wurden sogar korrekt codierte Zeichen gar nicht
     mehr decodiert) verursachen konnte.
     Das grundlegende Problem des Fixes bestand darin, daß er keinerlei
     Fehler- und Plausibilitätsprüfungen vornahm und nur dann korrekt
     funktionieren konnte, wenn die zu decodierende UTF-8-Sequenz gültig
     war - was bei Nachrichten, die in Wirklichkeit gar nicht UTF-8-
     codiert sind, nicht der Fall ist (z.B. kann eine UTF-8-Sequenz nie
     7bit-Zeichen enthalten). Die Routine unterlag dann mitunter dem
     Irrtum, es müßten noch weitere Zeichen folgen, die zur aktuellen
     (angeblichen) UTF-8-Sequenz gehören, merkte sich die bereits
     empfangenen Zeichen in der lokalen Variablen 'sc_rest' und wartete
     auf den vermeintlich noch fehlenden Rest der Sequenz.
     Wenn man sich aber z.B. ohnehin bereits am Ende eines Headers
     befunden hatte, erfolgte der nächste Eintritt in die Routine u.U.
     erst dann, wenn man sich inzwischen bereits im Body derselben oder
     sogar irgendwo in einer der folgenden Nachrichten befand, ohne daß
     der Variableninhalt zwischenzeitlich zurückgesetzt worden wäre. In
     der Folge wurden "fremde" Bytesequenzen mit dem alten Variablen-
     inhalt verquickt und völlig unsinnig "decodiert" - es entstand eine
     Art "Bytesalat".
     Zur Entstehung des falschen LEN:-Headers kam es deshalb, weil genau
     so eine Konstellation vorlag und der Body jeder RFC-Nachricht zwei-
     mal gelesen wird - einmal, um die Länge des Nachrichtentextes für
     den LEN:-Header ermitteln und danach den ZConnect-Header komplett
     schreiben zu können, ein zweites Mal, um den Body selbst zu
     schreiben. Beim ersten Lesen wurde die sich noch aus dem fehlerhaft
     als "UTF-8" deklarierten Subject:-Header in der Variablen 'sc_rest'
     befindliche Sequenz aus 4 Bytes mit den ersten 2 Zeichen des Nach-
     richtentextes verquickt und "decodiert" - dies führte zum für eine
     Multibyte-Decodierung typischen Entfernen eines Zeichens und somit
     zur Ermittlung einer um 1 Byte zu geringen Länge. Bei dieser
     "Decodierung" wurde der Inhalt von 'sc_rest' zurückgesetzt, so daß
     beim zweiten Lesen keine fehlerhafte Decodierung mehr stattfand,
     somit auch kein Zeichen mehr entfernt und der Body daher in der
     korrekten Länge geschrieben wurde => tatsächliche und vorher
     ermittelte Länge stimmten nicht mehr überein. (Daß die Differenz im
     konkreten Fall genau 1 Byte betrug, war Zufall, es hätten in
     anderen Fällen auch bis zu 4 Bytes sein können.)
     Zur Vermeidung dieses sowie aller anderen in diesem Zusammenhang
     existierenden theoretischen und praktischen Probleme wurden daher
     folgende umfassende Gegenmaßnahmen ergriffen:
     a) Es werden nur noch UTF-8-Sequenzen decodiert, die nach den in
        "The Unicode Standard, Version 4.0" und RFC3629 von November
        2003 (das den bisher gültigen Standard RFC2279 von Januar 1998
        ersetzt) niedergelegten Regeln eine gültige UTF-8-Sequenz
        bilden. Das hat automatisch zur Folge, daß auch Sequenzen mit
        7bit-Zeichen, wie sie bei ISO-8859-x oder allen anderen Latin-
        Zeichensätzen zwangsläufig vorkommen, nicht mehr blind kaputt-
        decodiert und auch keine vermeintlich unvollständigen Sequenzen
        in der Variablen 'sc_rest' mehr abgelegt werden.
     b) Stattdessen werden 8bit-Zeichen, die sich in einer angeblichen
        und/oder ungültigen UTF-8-Sequenz befinden, der Standardkonver-
        tierung von Windows-1252 in den IBM-Zeichensatz CP437 unterzo-
        gen. Dadurch werden in den allermeisten Fällen die Zeichen in
        fälschlicherweise als UTF-8 deklarierten Nachrichten korrekt
        "erraten" und bei einer Antwort auf eine solche Nachricht
        korrekt wiedergegeben.
        Das Durchführen dieser Standardkonvertierung folgt demselben
        "robustness principle" wie es für Nachrichten gilt, bei denen
        gar kein Zeichensatz deklariert ist. Selbst wenn das "erratene"
        Zeichen ausnahmsweise falsch sein sollte (weil die Nachricht in
        einem völlig anderen Zeichensatz als Windows-1252 vorliegt), ist
        es innerhalb von XP immer genauso richtig wie ein gar nicht kon-
        vertiertes Zeichen (nämlich falsch ;-)).
     c) Um nicht fälschlicherweise zufällig gültige, aber unvollständige
        UTF-8-Bytesequenzen am Ende eines Teilstrings vom einen Header
        zum anderen bzw. bis zum Body oder gar vom Body zu einem Header
        der nächsten Nachricht mitzuschleppen und dort mit - zufällig
        ebenfalls gültigen - UTF-8-Bytesequenzen am Anfang des jeweils
        nächsten Headers oder Body zu verquicken und damit eine zwar
        technisch gültige, aber inhaltlich fehlerhafte Decodierung
        durchzuführen, werden jetzt alle in Headern vorkommenden encoded
        words, alle einzelnen RFC-Headerzeilen, Gesamtheader und Body
        sowie die einzelnen Zeilen im Nachrichtentext über die globale
        Variable 'start_of_UTF' streng voneinander abgegrenzt. In allen
        diesen Fällen wird eine etwaige Restsequenz in 'sc_rest' jetzt
        verworfen.
        (Multibyte-Sequenzen dürfen sich gemäß RFC2047 weder über mehre-
        re encoded words noch über mehrere Zeilen im Body erstrecken und
        es sind aus der Praxis auch keine solchen Fälle bekannt. Wenn
        UTF-8-codierte Nachrichten zusätzlich base64/qp-codiert sind,
        dann können und dürfen sich Multibyte-Sequenzen hingegen durch-
        aus über mehrere codierte Zeilen erstrecken. Dies wird von der
        neuen Routine korrekt behandelt und unterstützt, siehe dazu auch
        Punkt 3.)
     d) So ein zu verwerfender Rest kann darüber hinaus jetzt aber gar
        nicht mehr entstehen, da über die an den entsprechenden Stellen
        gesetzte globale Variable 'end_of_UTF' geprüft wird, ob man sich
        am Ende eines encoded word, Headers oder einer Zeile im Body
        befindet. Sollte sich dort der gültige Anfang einer unvollstän-
        digen UTF-8-Bytesequenz befinden, wird diese trotzdem nicht in
        'sc_rest' abgelegt, weil keine zu dieser Sequenz gehörenden
        Daten mehr folgen können.
     e) Bei der Decodierung von Headern und Body werden jetzt nur noch
        Teilstrings mit einer Länge von max. 248 Zeichen (bisher: 253
        Zeichen) an die UTF-8-Routine übergeben. Damit wird verhindert,
        daß durch die Stringaddition der max. 3 Zeichen (bisher: 5
        Zeichen) langen Bytesequenz in 'sc_rest' ein Überlauf und damit
        Zeichenverlust entstehen kann (Variable 'maxUTFLen' in
        MIMEDEC.PAS eingeführt).
  2. (Erweiterung der UTF-7-Decodierung für beliebig lange Zeilen und
     Sequenzen)
     Die UTF-7-Decodierung besaß einen solchen Fix für die Decodierung
     umbrochener bzw. sich über mehrere Teilstrings erstreckender
     Sequenzen bisher nicht - vermutlich, weil es dort wegen der belie-
     bigen und undefinierten Länge der Sequenz (UTF-7 ist eine Variante
     der base64-Codierung) noch erheblich schwieriger zu implementieren
     gewesen wäre als bei UTF-8. ;)
     Dadurch konnte dort zwar das für UTF-8 beschriebene Problem mit der
     Erzeugung eines ungültigen LEN-Headers auch nicht auftreten, dafür
     kam es aber eben bei der Decodierung von gleichzeitig base64/qp-
     codierten Nachrichten oder bei Zeilen mit mehr als 253 Zeichen zu
     möglichen Problemen (je nachdem, ob sich die Schnittstelle zweier
     Teilstrings inmitten einer UTF-7-codierten Sequenz befunden hat
     und/oder das Ende der zu decodierenden Sequenz im aktuellen Teil-
     string nicht vorhanden war).
     Die UTF-7-Decodierung ist jetzt ebenfalls für beliebig lange
     Zeilen und Sequenzen in Headern und im Body ausgelegt (bisher:
     253 Zeichen) und berücksichtigt die Regeln und Besonderheiten der
     base64-Codierung (siehe auch Punkt 5.)
     Alle unter Punkt 1. a) bis e) für UTF-8 beschriebenen Maßnahmen
     gelten sinngemäß auch für die UTF-7-Decodierung, wobei die Prüfung
     auf ungültige Bytesequenzen dort gänzlich anderen (und weniger
     präzisen) Regeln unterliegt: Wenn nach dem eine UTF-7-Sequenz
     einleitenden "+" nicht mindestens 3 gültige 7bit-Zeichen folgen,
     wird die Decodierung der aktuellen Sequenz abgebrochen und das "+"
     sowie ein ggf. abschließendes "-" bleiben erhalten (bisher wären
     sie entfernt worden).
  3. (Berücksichtigung von Zeilenumbrüchen in base64/qp-decodierten
     Teilstrings)
     Als "Zeilen" im Sinne der vorhergehenden Punkte 1. und 2. gelten
     alle Zeichen in unbegrenzter Anzahl zwischen zwei Zeilenumbrüchen
     (CR/LF/CRLF, siehe auch Punkt 4.) bzw. in einem encoded word in
     einem RFC-Header *nach* einer etwaigen base64/qp-Decodierung.
     Daher mußte die base64/qp-Decodierung des Nachrichtentextes so
     angepaßt werden, daß Zeilenumbrüche im decodierten String sicher
     erkannt und nur Strings an eine evtl. nachfolgende UTF-7/8-Decodie-
     rungsroutine übergeben werden, die nicht über einen Zeilenumbruch
     hinausgehen (bisher konnten sich Zeilenumbrüche mitten im zu
     decodierenden String befinden). Anderenfalls wäre eine saubere
     Abgrenzung einzelner Zeilen im Nachrichtentext (und damit das
     korrekte Setzen der Variablen 'start_of_UTF' und 'end_of_UTF' für
     eine unmittelbar anschließende UTF-7/8-Decodierung) nicht möglich
     gewesen.
  4. Bei der Decodierung von base64/qp-codierten Texten (Content-Type
     text/*) werden einzelne im decodierten String vorkommende CR und LF
     jetzt durch CRLF ersetzt (bereits vorhandene CRLF bleiben unverän-
     dert erhalten).
  5. (Erweiterung der Transportdecodierung für beliebig lange Zeilen
     (Body) unter Berücksichtigung einer ggf. anschließenden Zeichen-
     satzdecodierung (UTF-7/8) für darin enthaltene, ebenfalls beliebig
     lange Zeilen, die wiederum beliebig lange codierte Bytesequenzen
     enthalten können (Header und Body))
     Bei der Decodierung der im Header "Content-Transfer-Encoding:"
     für den Nachrichtentext deklarierten Transportcodierung ("base64"
     oder "quoted-printable") wie auch bei der Zeichensatzdecodierung
     ("UTF-7" oder "UTF-8") von Headern und Body werden nur gültige und
     in sich abgeschlossene Teilstrings an die jeweiligen Subroutinen
     übergeben bzw. in diesen Subroutinen decodiert:
     "base64"           (Transport): Übergebene Stringlänge ist durch 4
                                     teilbar oder kleiner 4 (am Ende des
                                     Gesamtstrings).
     "quoted-printable" (Transport): Übergebener String endet mit einem
                                     uncodierten oder mit einem voll-
                                     ständigen codierten Zeichen wie
                                     "=E4" (nicht aber mit unvollstän-
                                     dig codierten wie "=E4=E").
     UTF-7            (Zeichensatz): Bearbeiteter String endet mit einem
                                     uncodierten Zeichen oder mit einer
                                     codierten Bytesequenz, deren Länge
                                     kleiner 4 oder durch 4 teilbar ist.
     UTF-8            (Zeichensatz): Bearbeiteter String endet mit einem
                                     uncodierten Zeichen oder mit einer
                                     codierten Bytesequenz, deren Länge
                                     durch das erste Zeichen der Sequenz
                                     definiert wird.
     Evtl. überhängende Reststrings, Restbytes oder unvollständige Byte-
     sequenzen, wie sie bei Zeilen > 248 Zeichen oder nach einer
     base64/qp-Decodierung entstehen können, werden zwischengespeichert
     und anschließend gemeinsam mit dem nachfolgenden Teilstring
     decodiert.
     Dies funktioniert auch bei doppelt codierten Headern oder Zeilen in
     Headern oder im Body (Transportcodierung "quoted-printable" oder
     "base64" im Body bzw. "Q" oder "B" im Header sowie Zeichensatz-
     deklaration "UTF-7" oder "UTF-8").
     Erst und nur durch dieses Verfahren ist es überhaupt möglich,
     beliebig lange und ggf. doppelt codierte Zeilen und Sequenzen
     trotz der Längenbeschränkungen von Pascal korrekt zu decodieren. Es
     erfordert allerdings ein peinlich genaues Vorgehen und die Berück-
     sichtigung aller (un)denkbaren Szenarien, um korrekt und robust
     funktionieren zu können.
     Bisher war speziell die Transportdecodierung des Nachrichtentextes
     - im Unterschied zu der von RFC-Headern - nicht für längere Zeilen
     ausgelegt (laut RFC2045 sind bei base64- und qp-Codierung max. 76
     Zeichen pro Zeile erlaubt, aber in der Praxis kommen auch deutlich
     längere Zeilen von mehreren hundert Zeichen vor) und arbeitete
     daher zwar meistens, aber eben nicht immer korrekt und robust.
     Eine ggf. anschließende Zeichensatzdecodierung funktionierte prak-
     tisch nur bei UTF-8-codierten Headern halbwegs zuverlässig, in
     allen anderen Fällen (UTF-8 im Body, UTF-7 in Header und Body) war
     das Ergebnis mitunter teilweise oder gänzlich unbrauchbar.
     Damit ist der Enhanced UUZ für alle sinnvollen und unsinnigen sowie
     zulässigen und unzulässigen Formen und Kombinationen von Transport-
     und Zeichensatzcodierung gerüstet und decodiert diese jetzt korrekt
     und robust:
     Auch eine durchgehende, z.B. 3.852 Zeichen lange und base64-codier-
     te Zeile im Nachrichtentext, aus der nach der base64-Decodierung
     eine ebenfalls durchgehende, 2.889 Zeichen lange und UTF-7-codierte
     Zeile resultiert, die ihrerseits aus einer einzigen durchgehenden
     UTF-7-Sequenz besteht (was wegen der doppelten base64-Codierung ein
     ebenso unsinniges wie aufgrund der Länge der Ursprungszeile unzu-
     lässiges Szenario wäre), bereitet dem Enhanced UUZ jetzt keinerlei
     Schwierigkeiten mehr.
  6. Bei der qp-Decodierung von Zeilen im Body mit mehr als 253 - bzw.
     jetzt 248 - Zeichen (die laut RFC2045 unzulässig sind, in der
     Praxis aber öfter als selten vorkommen) wurden u.U. Leerzeichen
     aus dem Text entfernt, weil die Routine als allererste Maßnahme
     alle rechten Leerzeichen im String entfernt hat. Zwar fordert
     RFC2045 genau das, aber das darf man natürlich auch nur am echten
     Zeilenende und nicht am Ende jedes einzelnen Teilstrings einer
     überlangen qp-codierten Zeile machen...
  7. Bei der qp-Decodierung wird das Zeichen 0x00 in Headern und Body
     jetzt decodiert (bisher behielt es die codierte Form "=00" bei).
     Offenbar wurde bisher angenommen, es könne sich bei qp-codierten
     Nachrichten nur um Textnachrichten handeln, die kein 0x00 enthalten
     können bzw. dürfen - aber auch Binärdaten können theoretisch
     qp-codiert sein, denn das ergibt sich nicht aus der Art der Codie-
     rung, sondern ausschließlich aus dem Header "Content-Type:" ...
     (siehe dazu auch weiter unten).
  8. Wie bisher schon bei Headerzeilen oder wenn sie uncodiert vorkamen,
     werden in Textnachrichten die codierten Zeichen 0x00 und 0x1A (#26,
     Ctrl-Z) nach der b64/qp- und Zeichensatz-Decodierung/Konvertierung
     jetzt durch ein Leerzeichen bzw. ein ">" ersetzt. Das Zeichen 0x1A
     würde sonst an einigen Stellen im Programm (z.B. im Editor) als EOF
     (Dateiende) fehlinterpretiert werden.
  ToDo: Da die Routinen für die UTF-7/8-Decodierung auch bei der Anzeige
        von MIME-Multiparts im Lister verwendet werden, sind diese neuen
        Änderungen noch auf Kompatibilität mit den bereits vorgenommenen
        Bugfixes für die Anzeige langer Zeilen > 255 Zeichen zu prüfen
        und die älteren Fixes ggf. anzupassen und/oder zu erweitern.
  UUZ.PAS, UUZ0.PAS, MIMEDEC.PAS, TYPEFORM.PAS

MY:
- Redundanten Code für das Lesen des Body aller Nachrichtentypen (UUCP-
  Mail, SMTP-Mail, Newsbatch) entrümpelt, in der neuen Routine
  'ReadRfcBody' zusammengefaßt und optimiert.
  UUZ.PAS, UUZ0.PAS

MY:
- Diverse notwendige Fixes für die zentrale Routine 'ReadString':
  ----------------------------------------------------------------------
  1. Die Routine liefert jetzt am Zeilenende für die Variable 'eol'
     (= Zeilenende erreicht) immer einen Wert von 2 zurück, und zwar
     jetzt auch dann, wenn die Zeile zufällig genauso lang ist wie die
     max. an die Stringvariable zurückzugebende Zeilenlänge (248 Zeichen
     eingehend, 253 Zeichen ausgehend). Bisher wurde in solchen Fällen
     ein Wert von 0 zurückgegeben (und daraus mitunter falsche Schlüsse
     gezogen).
  2. Am Dateiende wird jetzt ein Wert von 3 an 'eol' übergeben (auch,
     wenn dort kein Zeilenumbruch (CR/LF) vorhanden sein sollte). Diese
     Änderung hat den positiven Nebeneffekt, daß jetzt auch ZConnect-
     Puffer in zu-Richtung ohne abschließenden Zeilenumbruch korrekt
     konvertiert werden (bisher fehlte dann die letzte Zeile fast voll-
     ständig, lediglich das erste Zeichen dieser Zeile wurde nahtlos an
     das letzte Zeichen der vorherigen Zeile angehängt).
  Damit können Routinen, die 'ReadString' aufrufen, jetzt sicher davon
  ausgehen, daß bei 'eol=0' noch weitere Zeichen außer CR/LF in dersel-
  ben Zeile folgen werden. Diese Änderung ist wichtig sowohl für die
  oben im Zusammenhang mit UTF/base64/qp-Decodierung beschriebenen
  Fixes als auch für das korrekte Lesen und Schreiben von Puffern
  allgemein.
  3. Endlosschleife bei der Konvertierung von News-Puffern, die als
     Zeilenabschluß CR statt CRLF oder LF verwenden, behoben (zufällig
     beim Testen entdeckt und in der Praxis noch nicht aufgetreten,
     betrifft alle existierenden UUZs aller XP-Versionen). Der Enhanced
     UUZ akzeptiert jetzt auch alleinstehende CR als Zeilenabschluß.
  4. 'ReadString' hat schon bisher nur Teilstrings übergeben, die sauber
     an einer Wortgrenze getrennt waren. Dabei wird neben Leerzeichen,
     Komma und Semikolon jetzt auch das Tabulatorzeichen #9 als Trenn-
     zeichen akzeptiert.
  5. Damit Routinen, die 'ReadString' aufrufen, auch die nächsten im
     Lesepuffer, aber wegen des Erreichens der max. Stringlänge nicht
     mehr im aktuellen Teilstring befindlichen Zeichen prüfen können,
     stellt 'ReadString' jetzt sicher, daß immer mindestens vier Zeichen
     im Lesepuffer zur Verfügung stehen (sofern vorhanden). Ist das
     zufällig nicht der Fall, obwohl das Dateiende noch nicht erreicht
     ist, lädt 'ReadString' diese Zeichen nach. Diese Änderung ist
     relevant z.B. für die vorzeitige Erkennung des Endes einer SMTP-
     Mail (was wiederum notwendig für eine korrekte UTF-7/8-Decodierung
     ist) als auch für das korrekte Entfernen der XP-typischen zwei
     Leerzeichen am Ende jeder Zeile (siehe weiter unten), sowie für
     alle anderen (zukünftigen) Routinen, die einen "look ahead" auf die
     max. nächsten 5 Zeichen machen müssen.
  UUZ0.PAS

MY:
- Fix: Wenn sich nach der RFC=>ZC-Konvertierung einer eingegangenen
  Textnachricht (nicht bei Binärnachrichten!) kein Zeilenumbruch (CRLF)
  am Ende des Puffers befindet, wird dieser jetzt hinzugefügt (kann
  insbesondere bei base64-codierten Texten im Body vorkommen). Bisher
  wurde der EMP:-Header einer nachfolgenden Nachricht in diesem Fall
  nahtlos an das letzte Zeichen der vorherigen Nachricht angehängt. Der
  Fall, daß der Puffer nur mit einem einzelnen CR oder LF abgeschlossen
  ist, wird ebenfalls behandelt. Im Falle von SMTP-Mails (die mit den
  Zeilen "." und "QUIT" enden) mußte hierfür die Logik beim Lesen des
  Body dahingehend angepaßt werden, daß die Routine bereits den Inhalt
  der nächsten Zeile prüft, während die aktuelle Zeile noch bearbeitet
  wird (ansonsten könnte das Ende der Nachricht nicht "vorhergesehen"
  und außerdem auch nicht die für die UTF-7/8-Decodierung notwendigen
  Variablen 'start_of_UTF' und 'end_of_UTF' korrekt gesetzt werden,
  siehe weiter oben).
  UUZ0.PAS

MY:
- Fix (-uz): Zwei theoretisch mögliche (in der Praxis bisher nicht auf-
  getretene) Endlosschleifen bei unvollständig/defekt base64-codierten
  RFC-Headern, bei denen sowohl Header als auch das betreffende encoded
  word länger als 255 Zeichen waren, in 'UTF8ToIBM' und 'DecodeEW' beho-
  ben (letztere Schleife verbunden mit einem Crash, insofern nicht ganz
  "endlos" ;-)).
  In solchen Fällen wird der unvollständige Header jetzt soweit codiert
  wie möglich und die übrigbleibende Restsequenz verworfen.
  MIMEDEC.PAS

MY:
- Ausgehende Nachrichten (-zu) werden jetzt auch dann qp-codiert, wenn
  sie keine 8bit-Zeichen enthalten. Sinnvoll, um die max. Zeilenlänge im
  Body für den Transport einerseits auf 76 Zeichen begrenzen zu können
  und andererseits zu verhindern, daß extrem lange Zeilen nach der von
  RFC2822 definierten Grenze von 998 Zeichen - bzw. beim letzten Wort
  davor - zwangsumbrochen werden müssen (lange qp-codierte Zeilen
  enthalten 'soft line breaks', die Zeile wird bei der Decodierung
  wieder zusammengesetzt; daher sind qp-codierte Zeilen in decodierter
  Form prinzipiell nie längenbegrenzt).
  UUZ.PAS

MY:
- Fix (-uz): Wenn ein RFC-Header mit mehr als 255 Zeichen an der letzten
  Position des ersten zu decodierenden Teilstrings einen codierten
  Zeilenumbruch (CR oder LF) enthielt (der durch ein Leerzeichen ersetzt
  wurde) und der nächste Teilstring ebenfalls mit einem codierten
  Zeilenumbruch oder mit einem Leerzeichen begann, dann entstanden zwei
  Leerzeichen, obwohl ansonsten mehrere CR/LF hintereinander nur durch
  ein einziges Leerzeichen ersetzt bzw. ganz entfernt wurden, wenn sich
  links oder rechts davon bereits ein Leerzeichen befand. Dies ist ein
  Fix für ein ebenfalls theoretisches und bisher in der Praxis nicht
  aufgetretenes Szenario, weil Header keine codierten Zeilenumbrüche
  enthalten (dürfen) und die Entscheidung, mehrere CR/LF hintereinander
  durch nur ein Leerzeichen zu ersetzen bzw. ganz zu entfernen, ohnehin
  völlig willkürlich ist (*daß* sie in irgendeiner Form entfernt werden
  müssen, ist bei Headern allerdings zwingend und liegt in der Natur der
  Sache).
  MIMEDEC.PAS

MY:
- Fix (-uz): Der Header "X-XP-Version:", der bisher Priorität gegenüber
  allen anderen Software-Headern besaß, verliert diese jetzt, wenn ein
  anderer Software-Header existiert, dessen Beginn identisch mit dem
  Inhalt von "X-XP-Version:" ist und der darüber hinaus weitere Zeichen
  enthält. Damit bleiben Header, die Anhänge wie "via UKA_PPP x.xx",
  "via XPNews" o.ä. enthalten, aber gegenüber "X-XP-Version:" ansonsten
  unverändert sind, jetzt wieder erhalten.
  UUZ.PAS

MY:
- Workaround für UKA_PPP-Software-Header bei Usenet-Postings: UKA_PPP
  hat in einigen (allen?) Versionen beim Versenden von Postings die Ei-
  genschaft, dem vom UUZ erzeugten Header "X-Newsreader:" einen weiteren
  Header "X-Mailer:" mit dem Inhalt "NOS-BOX x.xx" oder "UKA_PPP x.xx"
  hinzuzufügen. Da der UUZ bei der Konvertierung eingehender Nachrichten
  im Falle mehrerer Software-Header immer den jeweils letzten in den
  ZConnect-Header MAILER: geschrieben hat, konnten die Empfänger dieser
  Postings oft nur den jeweiligen UKA_PPP-Eintrag sehen, nicht aber die
  verwendete CrossPoint-Version.
  Wenn ein Header "X-Mailer:" vorhanden ist, der mit "UKA_PPP" oder
  "NOS-BOX" beginnt, dann wird dieser jetzt an einen etwaig zusätzlich
  vorhandenen Software-Header mit dem Wort "via" angefügt, statt einen
  bereits gelesenen Header zu ersetzen oder durch einen nachfolgenden
  Haeder überschrieben zu werden. Damit wird derselbe String erzeugt,
  den auch UKA_PPP selbst bei Mails im UUCP-Format (nicht aber bei Mails
  im SMTP-Format) generiert.
  Obwohl UKA_PPP den Header "X-Mailer:" am Ende des Gesamtheaders hinzu-
  fügt und dieser daher immer erst *nach* dem Header "X-Newsreader:"
  vorkommen sollte, ist nicht ausgeschlossen (und in der Praxis auch
  schon vorgekommen), daß Clients oder Server die Reihenfolge der Header
  ändern. Daher wurde der Workaround so konzipiert, daß die Reihenfolge
  der Header in diesem Fall keine Rolle spielt.
  Dieser Workaround unterstützt *keine* beliebig langen Zeilen. Wenn die
  Summe aus dem UKA_PPP-Header und dem eigentlichen Software-Header
  länger ist als ein Pascal-String, wird der UKA_PPP-Header verworfen
  (wird aber in der Praxis nie vorkommen). Der Workaround ist zu unwich-
  tig und das Eintreten des Szenarios zu unwahrscheinlich, als daß ein
  höherer Aufwand zu rechtfertigen wäre.
  UUZ.PAS

MY:
- Workaround für Endlosschleife bei der ZC=>RFC-Konvertierung von
  defekten ZConnect-Puffern mit zu großem LEN:-Header: Alle bisher
  existierenden UUZ-Versionen laufen in eine Endlosschleife, wenn der
  LEN:-Header der einzigen oder letzten Nachricht im Puffer einen zu
  hohen Wert enthielt. In diesem Fall liest der Enhanced UUZ jetzt die
  Nachricht bis zum Dateiende und konvertiert sie somit korrekt.
  Enthalten auch etwaige vorherige Nachrichten im Puffer LEN:-Header mit
  zu hohen Werten, werden sie zwar konvertiert, aber wie bisher nicht
  korrekt. Ziel des Workarounds war nicht die Reparatur defekter LEN-
  Header (dafür gibt es den Puffer-Reparierer ZPR), sondern lediglich
  das Vermeiden der Endlosschleife.
  UUZ.PAS

MY:
- Behandlung von Leerzeichen am Zeilenende beim Schreiben des Nachrich-
  tentextes (Body) ausgehender RFC-Nachrichten komplett überarbeitet:
  ----------------------------------------------------------------------
  1. Es werden jetzt nur noch die XP-typischen zwei Leerzeichen am
     Zeilenende bei fortlaufend umbrochenen Absätzen entfernt, jedoch
     nicht mehr einzelne bzw. mehr als zwei Leerzeichen oder nur aus
     Leerzeichen bestehende Zeilen (der Signaturtrenner war davon ohne-
     hin auch bisher schon ausgenommen). Als "Zeile" gilt wie bisher
     jede Zeile beliebiger Länge.
  2. Dafür funktioniert das Entfernen der zwei Leerzeichen jetzt auch
     in allen Fällen korrekt (befanden sich die Leerzeichen an Pos. 253
     und 254, funktionierte es bisher z.B. nicht).
  3. Wird die Nachricht qp-codiert, wird das letzte Leerzeichen am
     absoluten Ende einer Zeile jetzt gemäß RFC2045 ebenfalls codiert
     (bisher ging der UUZ davon aus, daß gar keine Leerzeichen vorhanden
     sein können, was aber im Falle mehrerer Leerzeichen am Zeilenende
     ab Pos. 252/253 hintereinander auch bisher schon nicht gewährlei-
     stet war). Beim Signaturtrenner bestand dieses Problem aufgrund
     einer Sonderbehandlung nicht, diese ist durch die generelle
     Änderung jetzt aber überflüssig geworden und wurde daher entfernt.
  UUZ.PAS

MY:
- Der für den Transport von SMTP-Mails am Zeilenanfang im Body hinzuzu-
  fügende Punkt, wenn die Zeile selbst ebenfalls mit einem Punkt beginnt
  ("dot stuffing"), wird bei der Berechnung der max. zu schreibenden
  Zeichen pro Zeile (998 ohne Codierung, 76 bei qp-Codierung) jetzt
  ignoriert - die Zeilen können also in diesem Fall jetzt um jeweils 1
  Zeichen länger werden, da der Punkt beim Transport ohnehin entfernt
  wird.
  Dasselbe gilt für News-Postings, bei denen der Punkt vom Client hinzu-
  gefügt wird: Dort hat der UUZ deshalb bisher immer ein Zeichen Reserve
  gelassen, dies passiert jetzt nicht mehr.
  Das bisherige (und mit der ersten Fassung des Enhanced UUZ eingeführ-
  te) Vorgehen war nicht wirklich falsch oder schädlich, aber unnötig
  und ungewöhnlich.
  UUZ.PAS

MY:
- Fix: Als Seiteneffekt der oben beschriebenen Bugfixes wurde ein Bug
  behoben, der ebenfalls bisher weder aufgefallen noch aufgetreten ist:
  Beim Schreiben der ohnehin nur informativen Header mit dem Prefix
  "X-Orig-" (Kopie der jeweiligen originalen RFC-Headerzeile im
  ZConnect-Header) konnte es unter seltenen Umständen passieren, daß ein
  Leerzeichen zwischen zwei Worten entfernt wurde (die Decodierung des
  Headers und somit das Resultat im BET:-Header waren trotzdem korrekt).
  Unter welchen Umständen das genau passierte, wurde genauso wenig näher
  untersucht wie die Frage, welchem der o.a. Fixes die Behebung dieses
  Bugs zu verdanken ist. ;-)
  Beobachtet wurde das Verhalten jedenfalls bei zwei encoded words,
  wovon das erste exakt 254 Zeichen lang war (was in der Praxis ohnehin
  nur bei von OpenXP produzierten Headern vorkommen kann und zudem
  unzulässig ist).
  ???.PAS

MY:
- Logik beim Lesen des RFC-Headers etwas geändert, u.a. mit der konkre-
  ten - in der Praxis aber kaum relevanten - Folge, daß bei Headern, die
  mit einer beliebigen Anzahl vorlaufender Leerzeichen beginnen, diese
  jetzt unter allen Umständen vollständig entfernt würden (bisher nur
  die bis Pos. 253). Des weiteren hätte es in bestimmten - in der Praxis
  ebenfalls noch nicht aufgetretenen - Szenarien passieren können, daß
  die Routine falsche Schlüsse zieht und glaubt, sie befände sich am
  Anfang des nächsten Headers, obwohl sie sich noch in der Fortsetzung
  des aktuellen Headers befindet. Reine Vorsichtsmaßnahme.
  UUZ.PAS

MY:
- Fix (-uz): Bei Nachrichten mit einem "Content-Type:"-Header, dessen
  mehrere Parameter mit Semikolon, aber ohne anschließendes Leerzeichen
  separiert waren, wurde bisher der Zeichensatz nicht korrekt ausge-
  wertet, weil der unmittelbar nachfolgende Parameter für einen Teil des
  Zeichensatznamens gehalten wurde (Fehlermeldung "ERR: Unsupported
  character set: iso-8859-1;format=flowed"). In der Folge wurde der
  Nachrichtentext dann auch nicht konvertiert. :-(
  UUZ0.PAS

MY:
- Workaround: Einige Mail<=>News-Gates setzen offenbar Header in der
  "neuen" Form 'Real Name <local.part@do.main>' in die auch intern von
  XP verwendete "alte" Form 'local.part@do.main (Real Name)' um, verges-
  sen dabei aber mitunter, die auch bei der neuen Form oft ohnehin über-
  flüssig gesetzten Anführungszeichen vor und hinter dem Realname zu
  entfernen. Die Routine des UUZ entfernt daher diese Anführungszeichen
  gemäß RFC2822 bisher ebenfalls nicht (weil sog. quoted-strings in
  Kommentaren - ein Realname in Klammern ist technisch betrachtet ein
  Kommentar - eigentlich nicht als quoted-strings gelten).
  Bei Headern, die in der alten Form vorliegen, werden etwaige Anfüh-
  rungszeichen vor und hinter dem Realname jetzt trotzdem entfernt, wenn
  sie sich wirklich am Anfang und Ende des Realname befinden und wenn
  der Realname aus mindestens zwei Worten besteht (bei nur einem in
  Anführungszeichen eingeschlossenen Wort wird davon ausgegangen, daß es
  sich um einen "Nickname" o.ä. handelt, bei dem sie bewußt gesetzt
  wurden).
  MIMEDEC.PAS

MY:
- Geänderte Behandlung des ZConnect-Headers "Antwort-an:":
  ----------------------------------------------------------------------
  -uz: Seit dem Erscheinen des ersten Enhanced UUZ wurden mehrere
       Absender im From:-Header in mehrere ZConnect-Header ANTWORT-AN:
       geschrieben (weil mehrere ABS:-Header laut ZConnect-Spezifikation
       nicht zulässig sind, mehrere ANTWORT-AN:-Header aber schon). Die
       Großschreibung sollte zur späteren Unterscheidung in FreeXP von
       den "echten" Headern für Reply-To-Adressen in der bisherigen
       Schreibweise "Antwort-an" dienen und erreichen, daß nach der noch
       vorzunehmenden Erweiterung der Reply-To-All-Routine die Adressen
       in den Headern ANTWORT-AN: als Absender erkannt und angezeigt
       werden können. Da ANTWORT-AN: aber ausgerechnet der Standard-
       schreibweise im ZConnect-Raum entspricht, hätte das nicht korrekt
       funktioniert, wenn ZConnect-Puffer anderer Programme (z.B. von
       OpenXP) in FreeXP eingelesen worden wären, die diese Standard-
       schreibweise verwenden. FreeXP verwendet daher jetzt ebenfalls
       die Standardschreibweise "ANTWORT-AN:" für "echte" Reply-To-
       Adressen, für mehrere Adressen aus dem From:-Header jedoch jetzt
       stattdessen die Schreibweise "antwort-An:", die mit an Sicherheit
       grenzender Wahrscheinlichkeit von keinem anderen ZConnect-
       Programm verwendet wird. Die zukünftige Reply-To-All-Routine muß
       daher die genaue Schreibweise des Headers prüfen, um Absender-
       und Reply-To-Adressen voneinander unterscheiden zu können (d.h.
       auch, daß die frühere Schreibweise "Antwort-an:" und die aktuelle
       Schreibweise "ANTWORT-AN:" gleichbehandelt werden, was im Sinne
       der Abwärtskompatibilität sinnvoll und notwendig ist).
  -zu: Folgerichtig prüft der UUZ bei der Konvertierung in zu-Richtung
       jetzt die Schreibweise des Headers ANTWORT-AN: und erzeugt bei
       Headern in der Schreibweise "antwort-An:" nicht mehr einen Header
       "Reply-To:", sondern fügt die im Header enthaltene Adresse dem
       Header "From:" hinzu (i.d.R. ist durch den ZConnect-Header ABS:
       ja eine Absenderadresse bereits vorhanden), ein evtl. vorhandener
       Realname wird dabei übernommen. Dies funktioniert mit so vielen
       "antwort-An:"-Headern, wie in der Konstanten 'maxabs' als max.
       Anzahl von Absendern definiert ist (derzeit 50).
       Damit ist gewährleistet, daß sich nach einer unmittelbar aufein-
       anderfolgenden RFC=>ZC=>RFC-Konvertierung (typisches Gate-
       Szenario, das aber auch von XP-Anwendern praktiziert wird), sich
       die Adressen aus dem ursprünglichen From:-Header auch wieder im
       neu erzeugten From:-Header befinden.
  UUZ0.PAS, XPMAKEHD.INC

MY:
- Variable 'control' von 150 auf midlen+9 vergrößert: 'midlen' (max.
  Länge der Message-ID) hatte inzwischen eine Größe von 160 Zeichen,
  daher wäre beim Versuch, eine Nachricht mit einer Message-ID von mehr
  als 141 Zeichen Länge zu canceln, durch das Hinzufügen des Strings
  'cancel' und der beiden spitzen Klammern ein unvollständiger Subject:-
  Header erzeugt worden (in der Praxis ist dieser Fall offenbar bisher
  nicht vorgekommen).
  UUZ0.PAS

MY:
- Zeitzone "CEST" ergänzt (ausgerechnet die einzige korrekte Schreib-
  weise für die Mitteleuropäische Sommerzeit - "Central European Summer
  Time" - fehlte, falsche wie "MEST" hingegen wurden ausgewertet).
  UUZ0.PAS

MY:
- Bei Zeitzonenangaben im "Date:"-Header, die die Zeitzone nicht direkt
  über ein numerisches Offset, sondern über eine Abkürzung wie "CET"
  angeben, kann es zudem vorkommen, daß die Sommerzeit mit dem Zusatz
  "DST" (= "Daylight Saving Time") deklariert wird (scheint speziell bei
  älteren unixoiden Systemen häufiger vorzukommen). Bisher wurde diese
  Angabe ignoriert, jetzt erhöht der Enhanced UUZ das Offset in diesem
  Fall um +1 und errechnet so die korrekte Lokalzeit.
  UUZ0.PAS

MY:
- Fix (-uz): Der Kommandozeilenschalter "-graberec" (Adresse des
  Envelope-Empfängers aus "Received:"-Headern auslesen) funktionierte
  zwar intern noch, war aber nach außen ohne konkrete Wirkung, weil die
  die Adresse enthaltende Variable nur dann ausgewertet wurde, wenn
  gleichzeitig auch der Schalter "-UseEnvTo" angegeben worden war.
  "-graberec" ist jetzt auch wieder ohne "-UseEnvTo" benutzbar; darüber
  hinaus wird die aus dem "Received:"-Header ausgelesene Adresse jetzt
  auf Plausibilität geprüft und anschließend derselben Behandlung
  unterzogen (spitze Klammern, Kommentare usw. entfernen) wie alle
  anderen Header, die Mail-Adressen enthalten. Dadurch werden etwaige
  Strings nach dem Schlüsselwort "for", die gar keine Adressen sind
  (kein "@" enthalten), jetzt sofort verworfen und in den folgenden
  Received:-Headern weiter nach einer Adresse gesucht, statt nach dem
  ersten gefundenen String die Suche abzubrechen und erst später
  festzustellen, daß es sich gar nicht um eine Adresse handelt.
  Werden "-graberec" und "-UseEnvTo" gleichzeitig angegeben, besitzt
  "-graberec" jetzt niedrigere Priorität (auch, weil das Verfahren
  ohnehin recht fragwürdig ist). In diesem Fall würden die "echten"
  Envelope-Header (siehe Beschreibung der nächsten Änderung) Vorzug
  genießen, aber so ist es immerhin möglich, beide Schalter sinnvoll
  miteinander zu kombinieren und nur dann die aus den "Received:"-
  Headern ausgelesene Adresse zu verwenden, wenn keiner der übrigen vom
  UUZ unterstützten Envelope-Header vorhanden ist.
  UUZ.PAS, UUZ0.PAS, MIMEDEC.PAS

MY:
- Zusätzlich zu den bisher schon unterstützten RFC-Headern für Envelope-
  Empfänger ("Envelope-To:", "X-Envelope-To:", "Delivered-To:") werden
  jetzt noch "X-Original-To:" (Postfix) und "Original-Recipient:" (gemäß
  RFC2298) unterstützt. Bei letzterem wird ein etwaig vor der Adresse
  angegebener Adresstyp (z.B. "rfc822;") entfernt.
  Es "gewinnt" bei mehreren Headern immer der jeweils letzte vorkommen-
  de. Lediglich der Header "Delivered-To:" besitzt wie bisher eine
  niedrigere Priorität als die übrigen und wird nur verwendet, wenn
  kein anderer der unterstützten Envelope-Header vorkommt (hat aber
  immer noch Priorität gegenüber "-graberec", siehe oben).
  UUZ.PAS

MY:
- Hinweise für Benutzer von UKA_PPP (nur ZConnect-Box):
  Aus den bisherigen Erfahrungen mit dem Zusammenspiel von Enhanced UUZ
  und dem Betrieb von UKA_PPP in einer ZConnect-Box resultieren einige
  Empfehlungen, die nachfolgend zusammengefaßt sind und denen man folgen
  sollte:
  ----------------------------------------------------------------------
  1. Wie schon in der Dokumentation zur ersten Fassung des Enhanced UUZ
     erwähnt, sollte der Aufruf des Programms X_SPOOL.EXE mit dem
     Schalter "/xc" unmittelbar vor dem UUZ-Aufruf im Netcall-Script
     (i.d.R. heißt diese Datei "XPNEWS") entfernt bzw. auskommentiert
     werden. Damit wird die bisher mitunter fehlerhafte Deklaration von
     Zeichensatz und deren Codierung vermieden, da die Funktion von
     X_SPOOL.EXE nun stellvertretend und sehr viel besser vom Enhanced
     UUZ (über den Schalter "-chkbody", siehe auch Punkt 2. b)) übernom-
     men wird.
     Es sind neben der Änderung des UUZ-Aufrufs (siehe Punkt 2. a)) noch
     weitere Anpassungen am Script erforderlich; eine vollständige Über-
     sicht ist unter Punkt 3. zu finden - bitte unbedingt *alle* dort
     aufgeführten Änderungen vornehmen, um den korrekten Ablauf des
     Netcalls sicherzustellen.
  2. a) Der UUZ-Aufruf im Netcall-Script sollte nun wie folgt aussehen:
         exec $homedir+"\uuz.exe -zu -client -chkbody outfile.z .\SPOOL"
        Damit garantiert der Enhanced UUZ u.a., daß Headerzeilen mit
        8bit-Zeichen korrekt MIME-codiert werden (die früheren Schalter
        "-MIME" und "-1522" sind Default, nicht mehr abschaltbar und
        daher überflüssig).
        Bisher fehlte im Standardaufruf des UUZ im UKA_PPP-Script
        schlicht der Schalter "-1522", so daß bei Verwendung älterer
        UUZ-Versionen permanent Header mit uncodierten 8bit-Zeichen
        erzeugt und versandt wurden (sog. "Hullen-Syndrom"). :-(
     b) Der Schalter "-chkbody" (siehe auch Punkt 1.) stellt sicher, daß
        der Body der Nachricht auf das Vorkommen von 8bit-Zeichen unter-
        sucht und daher sowohl Zeichensatz als auch dessen Codierung
        jetzt immer korrekt deklariert werden.
     c) Zuguterletzt ist durch den Schalter "-client" gewährleistet, daß
        Mails im SMTP-Format erstellt werden, die UKA_PPP unverändert
        und korrekt versendet.
        Zum Hintergrund:
        Bei den bisher im UUCP-Format erstellten Mails hat UKA_PPP bei
        der internen Umwandlung in das SMTP-Format im Falle von Mails
        mit Kopienempfängern Änderungen an der Adressierung der Nach-
        richten vornehmen müssen, um den Versand von Dupes zu vermeiden
        (zudem wurde durch die etwas sonderbare, bei UUCP-Mails aber
        notwendige Gestaltung der "To:"- und "Cc:"-Header seitens des
        UUZ jedem der Cc:-Empfänger der falsche Eindruck vermittelt, er
        selbst sei To:- und die übrigen Adressaten die Cc:-Empfänger).
        Bei dieser Umwandlung hat UKA_PPP aber stellenweise nicht
        berücksichtigt, daß Headerzeilen gefaltet sein können, was im
        Betrieb mit dem Enhanced UUZ sogar zum Verlust von Kopienempfän-
        gern ("Cc:") und/oder zur Kürzung des Subjects führen konnte.
        Der Enhanced UUZ trägt insofern mit dazu bei, als daß er gemäß
        RFC2822 Kopienempfänger kommasepariert in einen einzigen
        "Cc:"-Header schreibt (statt mehrere einzelne "Cc:"-Header zu
        erzeugen) und sowohl diesen wie auch den "Subject:"-Header bei
        Bedarf faltet. Beides war beim "alten" UUZ nicht der Fall, aber
        von dem bisherigen Verhalten gehen die Routinen in UKA_PPP aus.
        Diese möglichen Probleme sind durch die direkte Erstellung von
        SMTP-Mails über den Schalter "-client" automatisch behoben, da
        UKA_PPP die Nachrichten nun nicht mehr umformatieren muß, dies
        daher auch nicht tut und die Nachrichten 1:1 versendet.
        Voraussetzung ist allerdings, daß die letzte aktuelle UKA_PPP-
        Version v1.7x2 vom 25.04.2000 verwendet wird, alle vorherigen
        Versionen sind für den direkten Versand von Mails im SMTP-Format
        nicht geeignet.
  3. Gleichzeitig werden durch den Schalter "-client" die ausgehenden
     Nachrichten jetzt direkt mit den richtigen Dateinamen erzeugt und
     durch die Angabe des Zielverzeichnisses ".\SPOOL" unmittelbar im
     Spool-Verzeichnis von UKA_PPP abgelegt. Dies macht sämtliche Auf-
     rufe von X_SPOOL.EXE sowie einige weitere Befehle im Script XPNEWS
     überflüssig. Der Einfachheit und Übersichtlichkeit halber folgt der
     entsprechende Block des Scripts, wobei alle zu entfernenden Befehle
     mit einem "#" am Beginn der Zeile auskommentiert sind:
     ----------8<----------
     [...]
     # if $file "d-????.out",a$ > 0
     #    exec "x_spool.exe d-????.out /um"
     # end if
     if $file "outfile.z", a$ > 0
     #    exec "x_spool.exe outfile.z /xc"
        exec $homedir+"\uuz.exe -zu -client -chkbody outfile.z .\SPOOL"
        shell "del outfile.z"
     #    shell "del x-????.*"
     #    shell "del c-????.*"
     #    exec "x_spool.exe d-????.out /um"
     end if
     [...]
     ----------8<----------
     Die auskommentierten Zeilen können auch ganz entfernt werden, dann
     wird es etwas übersichtlicher:
     ----------8<----------
     [...]
     if $file "outfile.z", a$ > 0
        exec $homedir+"\uuz.exe -zu -client -chkbody outfile.z .\SPOOL"
        shell "del outfile.z"
     end if
     [...]
     ----------8<----------
  Diese Hinweise gelten nicht für das Add-On für den Betrieb von UKA_PPP
  in einer RFC/Client-Box, denn dort sind sie bereits von vorneherein
  berücksichtigt. Der Betrieb in einer RFC/Client-Box ist dem in einer
  ZConnect-Box aus vielerlei Gründen unbedingt vorzuziehen.

MY:
- Der Enhanced UUZ ist jetzt kompatibel mit XP2. :-)
  XP2-Anwender, die den Enhanced UUZ einsetzen möchten (was zu empfehlen
  ist), sollten unbedingt folgende Hinweise beachten:
  ----------------------------------------------------------------------
  1. Unter Edit/Boxen/<Box>/Edit/Clients/UUZ-In kann folgende Aufruf-
     zeile eingetragen werden:
       UUZ.EXE -uz -ppp $SPOOL $PUFFER              [bis v3.30.020 Beta]
       UUZ.EXE -uz $SCREENLINES -ppp $SPOOL $PUFFER $BOX [ab v3.30pre..]
     Dabei handelt es sich um den Default-Eintrag von XP2, der mit <F2>
     vorgeschlagen wird und nicht angepaßt werden muß. Der Eintrag kann
     aber auch ganz entfallen, dann wird der ebenfalls funktionierende
     Standardaufruf von XP2 verwendet.
  2. Unter Edit/Boxen/<Box>/Edit/Clients/UUZ-Out ist folgende Aufruf-
     zeile einzutragen:
       UUZ.EXE -zu -ppp $PUFFER $SPOOL              [bis v3.30.020 Beta]
       UUZ.EXE -zu $SCREENLINES -ppp $PUFFER $SPOOL      [ab v3.30pre..]
     Diesen Eintrag sollte man vornehmen, aber auch hier würde der weit
     umfangreichere Standardaufruf von XP2 funktionieren (die Parameter
     "MIME" und "-1522" sind beim Enhanced UUZ Default, nicht mehr
     abschaltbar und daher überflüssig, und der Parameter "-SMTP" ist
     durch "-ppp" bereits impliziert).
     Ebenfalls überflüssig und auch wirkungslos ist der XP2-spezifische
     Parameter "-absnsstyle", der dazu führen soll, daß Absenderadressen
     in der "neuen" Form 'Real Name <local.part@do.main>' erzeugt werden
     (statt in der alten Form 'local.part@do.main (Real Name)'). Das
     macht der Enhanced UUZ ohnehin per Default, nur codiert er dabei
     die Headerzeile im Unterschied zum XP2-UUZ auch in allen Fällen
     korrekt.
  3. Wer seine ausgehenden Nachrichten einer quoted-printable-Codierung
     unterziehen möchte (was beim UUZ von XP2 unbedingt zu vermeiden -
     weil gnadenlos kaputt -, beim Enhanced UUZ aber sogar zu empfehlen
     ist), muß, wenn ein manueller Eintrag im Feld "UUZ-Out" vorhanden
     ist, dort den Parameter "-qp" ergänzen.
     Ist kein manueller Eintrag vorhanden, reicht es, den Schalter
     "MIME: quoted-printable verwenden" unter C/O/E/V zu aktivieren.
  4. Der Enhanced UUZ erkennt im Betrieb mit XP2 automatisch, daß er
     sich XP2-kompatibel zu verhalten hat. :-)  Dazu liest er die erste
     Zeile der XPOINT.CFG ein und prüft auf das Vorkommen des Strings
     "XP2".
     Wer dieser Automatik nicht traut oder den Enhanced UUZ im Extern-
     betrieb zu einem XP2-kompatiblen Verhalten zwingen möchte, kann/muß
     zusätzlich den Parameter "-xp2" im UUZ-Aufruf angeben.
  5. Wenn man den Enhanced UUZ nur mit "uuz" aufruft, wird man auf der
     Hilfeseite einen weiteren Parameter "-chkbody" entdecken. Dieser
     Parameter ist im XP2-Modus automatisch aktiviert, muß daher nicht
     mit angegeben werden und hat zur Folge, daß der UUZ den Body jeder
     Nachricht auf das Vorkommen von 8bit-Zeichen prüft und in der Folge
     selbständig und korrekt den Zeichensatz und dessen Codierung in den
     RFC-Headern "Content-Type:" und "Content-Transfer-Encoding:"
     deklariert.
     Diese Maßnahme war notwendig, um die Gefahr fehlerhaft deklarierter
     Nachrichten zu eliminieren, denn die Deklaration, die XP2 dem UUZ
     über den selbst generierten Header "X-Charset:" mitteilt und die
     dieser ansonsten übernehmen würde, ist mitunter fehlerhaft.
     Beispiel: Ein Text, der das Paragraphenzeichen "", aber ansonsten
     nur 7bit-Zeichen enthält, würde von XP2 im Header "X-Charset:"
     nicht als ISO-8859-1, sondern gar nicht deklariert werden. Das
     Zeichen "" wird aber bei der IBM=>ISO-Konvertierung vom ursprüng-
     lichen Wert #21 (Steuerzeichen in CP437) in das 8bit-Zeichen #167
     in ISO-8859-1 konvertiert. Mangels korrekter Deklaration seitens
     XP2 würde also eine 8bit-Nachricht, aber ohne bzw. mit falscher
     Zeichensatz-/Codierungsdeklaration "US-ASCII" und "7bit" erzeugt
     werden (kein deklarierter Zeichensatz ist immer gleichbedeutend mit
     US-ASCII und 7bit). Dasselbe Resultat entsteht, wenn man z.B. über
     das Clipboard oder per Taste <Alt-nnn> 8bit-Zeichen, die keine
     Umlaute (äöüßÄÖÜ) *und* in ISO-8859-1 enthalten sind (also z.B.
     Akzentzeichen wie " ‚¡¢£") in eine Nachricht einfügt, für die über
     die Brettgruppe oder den User der ASCII-Zeichensatz definiert wurde
     - diese Zeichen konvertiert XP2 eben nicht nach ASCII (sondern in
     das entsprechende Zeichen in ISO-8859-1) und erzeugt so eine 8bit-
     Nachricht, ohne dies entsprechend zu deklarieren.
     Umgekehrt deklariert XP2 mitunter bei Nachrichten an Nicht-ASCII-
     Bretter/-User als Zeichensatz ISO-8859-1, obwohl US-ASCII richtig
     und ausreichend wäre (nämlich bei Zeichen wie #224 "à" (kleines
     alpha), die, weil sie in ISO-8859-1 nicht vorhanden sind, in ein
     7bit-Zeichen - in diesem Fall "a" - transliteriert werden), da es
     nicht den Ziel-, sondern den Quellzeichensatz auf das Vorkommen von
     8bit-Zeichen prüft (übrigens ein genereller Fehler aller früheren
     XP-Versionen).
     Alle diese Fehler werden durch den im XP2-Modus automatisch akti-
     vierten Parameter "-chkbody" korrigiert.
  6. Die Kompatibilität des Enhanced UUZ mit XP2 besteht im einzelnen
     aus folgenden Komponenten:
     a) Bei der RFC=>ZC-Konvertierung eingehender Nachrichten werden
        diese an einen evtl. bereits (oder noch) vorhandenen ZC-Puffer
        "3PPUFFER" angehängt. In einer FreeXP-Umgebung wird ein bereits
        existierender ZC-Puffer mit der Endung .BAK versehen und in
        jedem Fall ein neuer erzeugt. Dieses Verhalten würde bei XP2
        mitunter - speziell bei Multiserver-Netcalls - zu Datenverlust
        führen.
     b) Die Behandlung ausgehender und eingehender Cancel-Nachrichten
        entspricht dem (auch schon bei früheren XP-Versionen üblichen)
        Verfahren über ausschließlich den Betreff-Header.  Bei FreeXP
        wird dies zusätzlich über die ZC-konformen Header "STAT: CTL"
        und "CONTROL: cancel [MsgID]" geregelt (wodurch auch ZConnect-
        User canceln können), die aber von XP2 nicht unterstützt
        werden.
     c) Alle XP2-spezifischen Funktionen (Header "X-XP-Mode" für HdrOnly
        und MsgID-Request, Parameter "-bBoxname" für die Auswertung des
        Boxnamens bei der Konvertierung eingehender Nachrichten) werden
        vom Enhanced UUZ unterstützt. :-)
     d) Darüber hinaus gelten alle in dieser Dokumentation beschriebenen
        Fixes, Änderungen und Erweiterungen für XP2 in gleichem Maße wie
        für FreeXP.
        Es ist allerdings darauf hinzuweisen, daß sich die vielfältigen
        Änderungen, Korrekturen und Erweiterungen im Bereich der Deco-
        dierung und Konvertierung von Zeichensätzen nur bei Singlepart-
        Nachrichten auswirken, da Multipart-Nachrichten nicht vom UUZ,
        sondern von XP selbst decodiert/konvertiert werden. Es kann
        daher in Einzelfällen zu Inkonsistenzen kommen (d.h. derselbe
        Text würde vom Enhanced UUZ u.U. anders und richtiger decodiert
        und/oder konvertiert werden als er von XP2 in einer Multipart-
        Nachricht decodiert/konvertiert wird).
     e) Der Enhanced UUZ wurde mit folgenden XP2-Versionen erfolgreich
        getestet:
        CrossPoint [XP2] v3.30.020 Beta  (21.02.2001)
        CrossPoint [XP2] v3.30.pre6      (27.12.2001)
        CrossPoint [XP2] v3.30.pre7      (20.04.2002)
        CrossPoint [XP2] v3.31.006       (20.04.2002)
  UUZ.PAS, UUZ0.PAS

MY+MW:
- Zusätzlich zum Header "X-RFC-Converter:" werden Datum und Uhrzeit der
  verwendeten UUZ-Version jetzt auch auf der Hilfeseite (Aufruf "uuz"
  ohne Parameter) ausgegeben. In beiden Fällen wird dazu jetzt nicht
  mehr der Zeitstempel der Datei verwendet (weil sich dieser durch
  Entpack- und Kopiervorgänge verändern kann), sondern es wird der echte
  Zeitpunkt der Compilierung fest eincompiliert, kann nicht mehr verän-
  dert werden und erlaubt so eine sichere Indentifizierung der verwende-
  ten UUZ-Version.
  Dies geschieht über die neue Unit COMPDATE.PAS, die vom ebenfalls
  neuen Hilfsprogramm GENDATE.PAS bei jeder via BUILD.BAT angestoßenen
  Compilierung neu erzeugt wird und die aktuellen Datums- und Uhrzeit-
  werte in Konstanten zur Verfügung stellt. Im Zuge dieser Änderung
  wurde auch das Format des Datums umgestellt (von TT/MM/JJ auf
  JJJJ/MM/TT).
  Compilate, die aus der IDE der Entwicklungsumgebung von Borland Pascal
  heraus erstellt wurden (z.B. zu Testzwecken), verwenden nach wie vor
  den Zeitstempel der Datei, da dort das Verfahren mit der Unit
  COMPDATE.PAS nicht funktionieren kann.
  Das Eincompilieren des exakten Zeitpunkts der Compilierung wird später
  auch bei anderen Programmen (XP, ZPR, ZFIDO, MAGGI usw.) Anwendung
  finden.
  UUZ0.PAS [+GENDATE.PAS, +COMPDATE.PAS]

MY:
- Optik-Fix: Da die Anzahl der verfügbaren UUZ-Optionen sowie ihre
  Erläuterungen im Laufe der Zeit umfangreicher geworden sind und jetzt
  auch der Compile-Timestamp in einer zusätzlichen Zeile ausgegeben wird
  (siehe vorherige Änderung), passt die Ausgabe der Hilfeseite inklusive
  des UUZ-Logos beim Standardwert von 25 Zeilen nicht mehr auf eine
  Bildschirmseite. Die Ausgabe hält daher jetzt je nach aktueller
  Zeilenanzahl rechtzeitig an und wartet auf einen Tastendruck.
  UUZ0.PAS

MY:
- Fix (-zu): Bei der Übergabe des Zielverzeichnisses funktionierte die
  Angabe eines relativen Pfades wie ".\" (= aktuelles Verzeichnis) oder
  "..\" (= eine Verzeichnisebene höher) nicht, wenn dieser im Ergebnis
  auf das Hauptverzeichnis des aktuellen Laufwerks verwies. Die Ursache
  lag in der zentralen Routine 'IsPath()', die diesen Fall nicht geprüft
  hat. Die Angabe relativer Pfade funktioniert jetzt in allen Fällen und
  die Änderung wirkt sich auf alle Routinen in FreeXP insgesamt aus, die
  'IsPath()' verwenden.
  FILEIO.PAS

MY:
- Fix (-uz): Wenn beim manuellen Aufruf des UUZ (z.B. beim Testen) für
  Quell- und Zieldatei versehentlich derselbe Dateiname angegeben wurde
  und die Quelldatei existierte, wurde sie mit einer 0-Byte-Datei über-
  schrieben und somit vernichtet (im XP2-Modus wurde hingegen der kon-
  vertierte ZConnect-Puffer an die originale RFC-Nachricht angehängt,
  was auch nicht zu einem viel sinnvolleren Ergebnis führt).
  In beiden Fällen wird jetzt eine Fehlermeldung wegen einer "ungültigen
  Zieldatei" ausgegeben. Der Test ist allerdings sehr simpel und prüft
  nur auf Gleichheit der Strings - er läßt sich daher durch die Angabe
  eines absoluten und eines relativen Pfades, die beide auf dasselbe
  Verzeichnis verweisen, gewaltsam austricksen (wenn man das unbedingt
  möchte). Mehr Aufwand ist an dieser Stelle nicht gerechtfertigt, weil
  hier nur versehentliche Tippfehler im Test- oder Externbetrieb abge-
  fangen werden sollen, die im Normalbetrieb mit FreeXP oder XP2 nicht
  vorkommen können (und daher auch noch nie vorgekommen sind).
  UUZ0.PAS

MY:
- Inkonsistenz beseitigt (-uz): Im Falle, daß ein Header mit identischer
  Bedeutung in der RFC-Nachricht mehrfach existierte (sowas kommt z.B.
  bei Software- oder Envelope-Headern schon mal vor), wurde per Design
  der letzte vorkommende Header berücksichtigt. Handelte es sich dabei
  jedoch um einen Header, der die max. Länge eines Pascal-Strings über-
  schritt und daher im Array 'LongHdr' abgelegt werden mußte, hatte
  jeweils der erste vorkommende Header "gewonnen" (Pointervariable wurde
  in 'SaveLongHdr' nicht disposed, wenn sie bereits einen Wert hatte).
  Jetzt wird in *beiden* Fällen der jeweils letzte vorkommende Header
  berücksichtigt (außer, es gelten für den betreffenden Header irgend-
  welche Sonderregeln).
  UUZ0.PAS

MY:
- Unterstützung langer Header jetzt auch in zu-Richtung (ZConnect=>RFC):
  ----------------------------------------------------------------------
  Die bereits mit der ersten Fassung des Enhanced UUZ implementierte
  Unterstützung für die verlustfreie Konvertierung beliebig langer Header
  (bis 65500 Zeichen) in Richtung RFC=>ZConnect wurde jetzt auch auf die
  umgekehrte Richtung ZConnect=>RFC erweitert. Derzeit werden folgende
  Header unterstützt und sowohl in voller Länge gelesen als auch in die
  RFC-Nachricht geschrieben:
    Subject:      (ZConnect: "BET:")
    Path:         (ZConnect: "ROT:")
    X-Mailer:     (ZConnect: "MAILER:", "MAL:", "U-X-Mailer:",)
    X-Newsreader: (ZConnect: "MAILER:", "U-X-Newsreader:",
                             "U-User-Agent:")
    Organisation: (ZConnect: "ORG:")
    X-ZC-Post:    (ZConnect: "POST:")
    X-ZC-Telefon: (ZConnect: "TELEFON:")
    X-Homepage:   (ZConnect: "HOMEPAGE:", "U-X-Homepage:")
    Summary:      (ZConnect: "ZUSAMMENFASSUNG:", "U-Summary:")
    X-Gateway:    (ZConnect: "GATE:", "X-Gateway:")
  Die Unterstützung beliebig langer Headerzeilen bezieht sich auf die
  Länge des ZConnect-Quellheaders - Header, die bei ZConnect in mehrere
  einzelne Zeilen aufgeteilt sind und bei RFC-Nachrichten in eine einzi-
  ge (kommaseparierte) Headerzeile geschrieben werden müssen (z.B.
  "EMP:"=>"To:", "KOP:"=>"Cc:", "STICHWORT:"=>"Keywords:"), waren hin-
  sichtlich des Zielheaders in der RFC-Nachricht auch schon im bisheri-
  gen Enhanced UUZ nicht mehr längenbegrenzt.
  Im Zuge dieser Erweiterung bereitet die neue Routine 'WriteLongRfcHdr'
  die Header für die schon bisher existierende Routine 'EncodeFoldQuote'
  so auf und übergibt dieser den Header in einzelnen Teilstrings, daß
  sie die nun beliebig langen Header in allen in der Praxis vorkommenden
  Fällen korrekt codieren, falten und quoten kann (sofern erforderlich).
  Dies ist allerdings nicht der Endzustand - 'EncodeFoldQuote' wird im
  nächsten Schritt der UUZ-Entwicklung so erweitert werden, daß es die
  Daten aus einem 64k-Array auch direkt verarbeiten kann, um auch die
  theoretisch vorkommenden Fälle (z.B. Worte, die länger als 255 Zeichen
  sind) korrekt behandeln zu können.
  Aus diesem Grund werden hier auch einige - für die tägliche Praxis
  völlig irrelevante - Temporärfixes in der Routine 'EncodeFoldQuote'
  nicht näher dokumentiert.
  Ebenfalls im Zuge dieser Erweiterung berücksichtigt wurde der - den
  meisten Usern vermutlich gar nicht bekannte - Mechanismus, über die
  erste Zeile einer Datei 'ADDPATH' im UUZ-Verzeichnis einen eigenen
  Pfad erzeugen und in zu-Richtung dem "Path:"-Header voranstellen zu
  können. Dies funktioniert jetzt auch mit beliebig langen Pfadzeilen im
  ROT:-Header des zu konvertierenden ZConnect-Puffers.
  UUZ.PAS, UUZ0.PAS, XPMAKEHD.INC

MY:
- Behandlung der Header "X-Gateway:" und "GATE:" geändert:
  (Quelle zu diesem Thema:
   http://www.dt.e-technik.uni-dortmund.de/~ma/gatebau97/Gb97/node2.html)
  -uz: Der Header "X-Gateway:" wird in RFC=>ZC-Richtung jetzt in den
       GateBau'97-konformen Header "GATE:" konvertiert (bisher behielt
       er die ursprüngliche Bezeichnung aus der RFC-Nachricht bei).
  -zu: Die Header "GATE:" und "X-Gateway:" werden in ZC=>RFC-Richtung
       jetzt in den Header "X-Gateway:" konvertiert (bisher wurden sie
       komplett ignoriert). Sollte eine ZConnect-Nachricht beide Header
       enthalten, hat der Header "GATE:" Vorrang vor "X-Gateway:". Diese
       Behandlung in zu-Richtung findet allerdings nur dann statt, wenn
       die Datei 'ADDGATE' im UUZ-Verzeichnis existiert und ihre erste
       Zeile nicht leer ist (siehe nächste Änderung unten). Sie ist nur
       für echten Gatebetrieb von Bedeutung und für XP-User irrelevant;
       im Normalbetrieb mit XP (und/oder wenn die Datei 'ADDGATE' nicht
       existiert) werden die Header "GATE:" bzw. "X-Gateway:" in
       zu-Richtung wie bisher ignoriert.
  UUZ.PAS, UUZ0.PAS, XPMAKEHD.INC

MY:
- Über die erste Zeile der Datei 'ADDGATE' im UUZ-Verzeichnis kann jetzt
  eine Gateway-Domain definiert werden, die in folgender Form dem Inhalt
  eines etwaig existierenden Headers "X-Gateway:" (RFC=>ZC) bzw. "GATE:"
  oder ebenfalls "X-Gateway:" (ZC=>RFC) vorangestellt wird:
  - RFC=>ZC: "RFC1036/2822/2047 <Domain> [<UUZ-Version>]"
  - ZC=>RFC: "ZCONNECT <Domain> [<UUZ-Version>]"
  Existiert in der Quellnachricht kein Header "X-Gateway:" bzw. "GATE:",
  wird er in der Zielnachricht neu erzeugt; anderenfalls wird der zu-
  sätzliche Eintrag vom bereits existierenden Headerinhalt mit einem
  Komma separiert.
  Die Gesamtlänge des hinzuzufügenden Gateway-Strings ist derzeit auf
  120 Zeichen begrenzt. Hinsichtlich der Header in Quell- und Zielnach-
  richt werden jedoch beliebig lange Zeilen (bis 65500 Zeichen) unter-
  stützt.
  Diese Erweiterung ist nur für echten Gatebetrieb von Bedeutung und für
  XP-Anwender daher irrelevant (genauer gesagt: XP-Anwender sollten die
  Verwendung dieser Funktion unbedingt vermeiden, um keine unsinnigen
  und falschen Gateway-Header zu erzeugen).
  UUZ.PAS, UUZ0.PAS, XPMAKEHD.INC

MY:
- Fix (-uz): Erkennung von Text-/Binärnachrichten komplett überarbeitet
  ----------------------------------------------------------------------
  Anläßlich eines ausschließlich aus Textteilen bestehenden, aber
  dennoch im Header "Content-Transfer-Encoding:" als "binary" deklarier-
  ten Newsletters von T-Online im MIME-Multipart-Format, dessen konver-
  tierter ZConnect-Puffer infolgedessen vom UUZ mit dem ZConnect-Header
  "TYP: BIN" und daher in XP mit dem Flag "B" versehen und dort auch als
  Binärnachricht behandelt wurde, wurde deutlich, daß die bisherigen
  Regeln für die Klassifizierung als Text- oder Binärnachricht untaug-
  lich bzw. schlicht falsch waren. Die Erkennung als Text- oder Binär-
  nachricht wird daher jetzt nur noch ausschließlich vom Inhalt des
  Headers "Content-Type:" abhängig gemacht:
  a) Alle Nachrichten vom "Media Type" text/*, multipart/* und message/*
     (ergänzt wurde message/*) gelten als Textnachrichten (UUZ erzeugt
     keinen "TYP:"-Header). Im Falle der "Composite Media Types"
     multipart/* und message/* ist das deswegen richtig, weil die
     Nachricht bzw. ihre Bestandteile zwar (codierte) binäre Komponenten
     - auch gemischt mit Textkomponenten - enthalten kann, diese aber
     nicht vom UUZ, sondern erst später in XP selbst beim Öffnen oder
     Extrahieren des jeweiligen Nachrichtenteils behandelt und ggf.
     decodiert werden.
  b) Demzufolge gelten als Binärnachrichten nur noch alle Singlepart-
     Nachrichten vom "Media Type" application/*, image/*, audio/*,
     video/* und model/* (UUZ erzeugt den Header "TYP: BIN").
  c) Keinen Einfluß auf die Klassifizierung als Text- oder Binärnach-
     richt mehr haben hingegen die Deklarationen "binary", "base64" oder
     "quoted-printable" im Header "Content-Transfer-Encoding:": Es
     handelt sich hierbei um die Transportcodierung, die keinerlei
     Rückschlüsse auf den Typ der Nachricht (Text oder Binär) zuläßt.
     Bisher konnte es aufgrund der unvollständigen Prüfung auf "base64"
     und "binary" fälschlicherweise vorkommen, daß einerseits qp-codier-
     te Binärnachrichten als Textnachrichten, andererseits aber base64-
     codierte oder als "binary" deklarierte Text- oder Multipart-Nach-
     richten als Binärnachrichten erkannt wurden.
  d) Anmerkung zur Deklaration "Content-Transfer-Encoding: binary":
     Obwohl der Header den Schluß nahelegt (und prinzipiell auch dafür
     gedacht ist), es handele sich hierbei um uncodierte Binärdaten und
     die Nachricht sei daher als Binärnachricht zu klassifizieren, ist
     der Transport uncodierter Binärdaten im RFC-Raum bisher weder
     standardisiert noch findet er in der Praxis statt (siehe Abschnitt
     6.2. in RFC2045). Es gibt derzeit keine Umstände, unter denen die
     Deklaration "binary" gültig wäre, daher ist sie zu ignorieren bzw.
     wie "8bit" zu behandeln. Der UUZ ist, da er in uz-Richtung seit
     jeher ausschließlich zeilenorientiert arbeitet, auf die korrekte
     Behandlung eingehender uncodierter Binärdaten auch gar nicht ausge-
     legt und die Lese- und Schreibroutinen müßten umfassenden Änderun-
     gen unterzogen werden, um die (beabsichtigte) Ersetzung von Zeilen-
     umbrüchen (LF=>CRLF) und die damit verbundene Veränderung uncodier-
     ter Binärdaten zu verhindern - aber selbst dann würden diese Daten
     immer noch und in gleicher Weise von SMTP/NNTP-Clients wie UKAW
     unbrauchbar gemacht werden, noch bevor der UUZ sie überhaupt zu
     Gesicht bekäme - ein Umbau des UUZ in dieser Hinsicht ist auf
     absehbare Zukunft also weder notwendig noch sinnvoll.
  e) Die Variablen 'mpart' und 'binaer' werden jetzt nicht mehr an drei
     verschiedenen Stellen gesetzt, sondern nur noch einmal zentral in
     der Routine 'MimeAuswerten'.
  Die beschriebenen Änderungen führen in der Praxis u.a. dazu, daß beim
  Beantworten von bisher fälschlicherweise als Binärnachricht erkannten
  Textnachrichten keine überflüssige Rückfrage mehr erfolgt, ob man
  die vermeintliche Binärnachricht wirklich quoten wolle (umgekehrt
  erfolgt die Rückfrage jetzt bei qp-codierten Binärnachrichten, wo sie
  bisher unterblieben wäre). Des weiteren findet bei bisher fälsch-
  licherweise als Binärnachricht erkannten Singlepart-Textnachrichten
  jetzt die erforderliche Zeichensatzkonvertierung statt, und es ist
  sichergestellt, daß das weiter oben beschriebene Anhängen von Zeilen-
  umbrüchen (CRLF) an das Ende eines ZConnect-Puffers im Bedarfsfall nur
  noch bei echten (dafür jetzt aber auch bei *allen*) Textnachrichten
  erfolgt.
  Zwingend notwendig waren diese Änderungen aber auch noch aus einem
  anderen Grund: Da der UUZ ZConnect-Nachrichten mit dem Header
  "TYP: BIN" konsequent als Binärnachrichten betrachtet, hat er folge-
  richtig bei einer ZC=>RFC-Konvertierung den kompletten Body der
  erzeugten RFC-Nachricht base64-codiert. Im Falle von als "binary"
  deklarierten Multipart-Nachrichten führte also eine unmittelbar auf-
  einanderfolgende RFC=>ZC=>RFC-Konvertierung dazu, daß die Struktur der
  Multipart-Nachricht vollständig zerstört wurde.
  UUZ.PAS, UUZ0.PAS

MY:
- Interne Änderung: Die bisher nur in zu-Richtung und jetzt auch in
  uz-Richtung (siehe unten) verwendete globale Variable 'convibm' wurde
  nach 'convcharset' umbenannt.
  UUZ.PAS, UUZ0.PAS

MY:
- Fix (-uz): Die bisherige Regel, daß alle Multipart-Nachrichten sowie
  Singlepart-Nachrichten vom "Subtype" */html keiner Zeichensatzkonver-
  tierung seitens des UUZ unterzogen werden, wurde auf folgende Content-
  Types erweitert:
  a) message/* - ähnlich wie multipart/* ein "Composite Media Type", der
     eine RFC-Nachricht, die ihrerseits aus mehreren Teilen bestehen
     kann, enthält. Die Zeichensatzkonvertierung würde das Original-
     format der Nachricht zerstören. (Evtl. ist eine spätere direkte
     Unterstützung dieses speziellen Content-Type in FreeXP vorgesehen.)
  b) */richtext und */enriched (RTF, siehe RFC1896) - ähnlich wie */html
     ein Format, das von XP nicht selbst interpretiert und konvertiert
     wird und daher zur korrekten Darstellung ebenfalls an ein externes
     Programm übergeben werden muß. Umlaute und Sonderzeichen würden
     nach einer Konvertierung in den IBM-Zeichensatz nicht mehr richtig
     dargestellt werden können.
  Intern wird die Entscheidung über die Zeichensatzkonvertierung jetzt
  einmal zentral in der Routine 'MimeAuswerten' getroffen und in der
  globalen Variablen 'convcharset' gespeichert, die dann an den jewei-
  ligen Stellen ausgewertet wird (statt wie bisher die Entscheidung
  mehrfach und jedes Mal neu - und teilweise nach unterschiedlichen
  Kriterien - zu treffen).
  UUZ.PAS, UUZ0.PAS

MY:
- Weitere Fixes und Änderungen bei der Auswertung und Erzeugung des
  Headers "(U-)Content-Type:":
  ----------------------------------------------------------------------
  Zwar wurden Singlepart-Nachrichten vom Subtyp */html bei der RFC=>ZC-
  Konvertierung keiner Zeichensatzkonvertierung unterzogen, aber auf den
  eigentlich zwingend logischen Gedanken, daß man solche Nachrichten in
  ZC=>RFC-Richtung dann ebenfalls keiner Zeichensatzkonvertierung unter-
  ziehen darf, schien bisher niemand gekommen zu sein.
  Des weiteren wurden Textnachrichten ungeachtet des tatsächlichen und
  aus dem Header "U-Content-Type:" klar ersichtlichen Subtyps pauschal
  als "text/plain" deklariert, und der MIME-Typ message/* wurde gleich
  völlig ignoriert und daher ebenfalls als "text/plain" deklariert.
  Ergebnis waren gnadenlos kaputtkonvertierte und grundfalsch dekla-
  rierte Nachrichten. :-(
  Zur Ehrenrettung muß man zwar hinzufügen, daß sich dieses Verhalten im
  Normalbetrieb mit XP nicht auswirkte, weil XP weder HTML-Nachrichten
  noch den MIME-Typ message/* erzeugt, aber XP-Anwender, die den UUZ aus
  verschiedensten Gründen für eine RFC=>ZC=>RFC-Konvertierung einsetzen
  (solche Fälle sind aus der Realität bekannt) und Gatebetreiber wurden
  mit defekten Nachrichten "belohnt".
  Es wurden daher folgende Gegenmaßnahmen ergriffen:
  -uz: Singlepart-Textnachrichten vom Subtyp */html, */richtext und
       */enriched werden nicht nur wie oben beschrieben keiner Zeichen-
       satzkonvertierung mehr unterzogen, sondern es wird auch ein ggf.
       im Header "Content-Type:" deklarierter Zeichensatz in den
       ZConnect-Header "CHARSET:" geschrieben (wobei, sofern möglich,
       der Zeichensatzname in die ZConnect-typische Bezeichnung ("ISO1",
       "ISO9" usw.) übersetzt wird). Dadurch alleine ist bei einer nach-
       folgenden Konvertierung in ZC=>RFC-Richtung bereits garantiert,
       daß keine Zeichensatzkonvertierung mehr stattfindet (siehe Erläu-
       terungen weiter oben zu den umfassenden Änderungen und Erweite-
       rungen zum Thema Zeichensatzauswertung und -behandlung von
       ZConnect-Nachrichten).
       Das Erzeugen des Headers "CHARSET:" hat übrigens auch den ange-
       nehmen Nebeneffekt, daß beim Lesen solcher Nachrichten wenigstens
       die im Text vorhandenen 8bit-Zeichen in den IBM-Zeichensatz kon-
       vertiert und dadurch lesbar dargestellt werden - und vielleicht
       spendiert ja doch nochmal jemand einen einfachen HTML-Parser für
       FreeXP, dann könnten solche HTML-only-Nachrichten sogar dort
       halbwegs brauchbar verarbeitet werden...
  -zu: Sollte bei einer Singlepart-Nachricht vom Subtyp */html,
       */richtext oder */enriched kein Zeichensatz deklariert gewesen
       sein, existiert auch der ZConnect-Header "CHARSET:" nicht, und
       die Nachricht würde normalerweise der Standardkonvertierung in
       den Zeichensatz ISO-8859-1 unterzogen werden. Dieses wird jetzt
       ebenfalls gezielt verhindert, denn auch solche Nachrichten können
       natürlich 8bit-Zeichen enthalten, die bei einer Konvertierung
       zerstört würden. Es wird allerdings trotz des Vorkommens von
       8bit-Zeichen kein Zeichensatz deklariert (nicht einmal bei Ver-
       wendung des Schalters "-chkbody"), weil dieser schlicht nicht
       bekannt ist.
       Gleichzeitig wird der Subtyp solcher Nachrichten jetzt korrekt
       deklariert, eine Nachricht vom MIME-Typ "text/enriched" oder
       "text/html" wird jetzt also nicht mehr kurzerhand zu "text/plain"
       umdeklariert.
       Dasselbe gilt folgerichtig jetzt auch für Nachrichten vom MIME-
       Typ message/*: Es findet keine Zeichensatzkonvertierung mehr
       statt und der MIME-Typ im Header "Content-Type:" wird korrekt
       beibehalten (eine etwaige Zeichensatzdeklaration im äußeren
       "Content-Type:"-Header ist hier irrelevant und dürfte gar nicht
       vorkommen).
  UUZ.PAS, UUZ0.PAS

MY:
- Optik-Fix (-uz): Bei der im Falle eines nicht unterstützten Zeichen-
  satzes erzeugten Fehlermeldung "ERR: Unsupported character set:" wird
  der Name des Zeichensatzes jetzt in der Schreibweise, wie sie im
  Header "Content-Type:" der RFC-Nachricht verwendet wurde, wiedergege-
  ben (statt wie bisher in Kleinschreibung).
  Im Falle, daß ohnehin keine Zeichensatzkonvertierung stattfindet, weil
  eines der oben beschriebenen Kriterien erfüllt ist (MIME-Multipart
  o.ä.) wird der Header erst gar nicht mehr erzeugt.
  UUZ0.PAS

MY:
- Fix (-uz): Der Enhanced UUZ fängt jetzt unzulässige Deklarationen im
  Header "Content-Transfer-Encoding:" ab: Da bei den "Composite Media
  Types" multipart/* und message/* nur "7bit", "8bit" und "binary" als
  Transportcodierung im äußeren "Content-Transfer-Encoding:"-Header
  zulässig sind, wird jede unzulässige Deklaration wie "base64" oder
  "quoted-printable" jetzt ignoriert, die Nachricht wie "8bit" behandelt
  und daher nicht decodiert (bisher wurden in diesem Fall einzelne
  Nachrichtenteile im Body, deren Codierung zufällig mit der im äußeren
  "Content-Transfer-Encoding:"-Header deklarierten Codierung identisch
  war, fälschlicherweise decodiert).
  Für einzelne Subtypes des MIME-Typs message/* existieren noch restrik-
  tivere Einschränkungen hinsichtlich der zulässigen Codierungen; da UUZ
  "7bit", "8bit" und "binary" aber ohnehin gleichbehandelt (nämlich nur
  liest und nicht decodiert), müssen diese nicht gesondert berücksich-
  tigt werden.
  UUZ0.PAS

MY:
- Interne Änderung (-zu): Lokale Variable 'binmail' in 'ZtoU' entsorgt;
  stattdessen wird jetzt die bisher nur in uz-Richtung verwendete
  globale Variable 'binaer' eingesetzt und ebenso wie die Variable
  'mpart' nun einmal zentral in der Routine 'SetMimeData' gesetzt (statt
  wie bisher außerhalb an zwei verschiedenen Stellen). 'binaer' ist
  jetzt wieder true, wenn typ='B' (nicht wenn typ<>'T').
  UUZ.PAS, UUZ0.PAS

MY:
- Bei Binärnachrichten wird jetzt auch für Singleparts (= Schalter
  "Binärnachrichten als 'MIME-Multipart-Attachments'" unter C/O/E/V
  deaktiviert) der Header "Content-Disposition:" gemäß RFC2183 mit den
  Parametern "attachment", Dateiname ("filename="), Dateidatum
  ("modification-date=") und jetzt auch Dateigröße ("size=") erzeugt.
  Daher entfallen die bisherigen (und nicht standardkonformen) Parameter
  "name=" und "x-date" im Header "Content-Type:" sowohl bei Singlepart-
  als auch bei Multipart-Attachments - bei letzteren waren diese Angaben
  ohnehin redundant, da bei vom UUZ erzeugten Multipart-Binaries schon
  immer ein innerer Header "Content-Disposition:" mit den genannten
  Parametern - vom neuen Parameter "size=" abgesehen - erzeugt wurde.
  UUZ.PAS

MY:
- (-zu): MIME-Boundary (wird bei der Konvertierung von mit "i" auf
  Userbrett in XP erzeugten Binärnachrichten in eine Multipart-Nachricht
  erzeugt) an die in den MIME-Multipart-Routinen von FreeXP verwendete
  Fassung angeglichen und als eigene Funktion nach mimedec.pas verlagert
  (zwecks späterer Verwendung auch in FreeXP). Das Boundary hat jetzt
  die Form "-==_FreeXP_Next_MIME_Part_[Zufallsstring]_==-".
  UUZ.PAS, UUZ0.PAS, MIMEDEC.PAS

MY:
- Interne Änderung (-zu/uz): Länge des MIME-Boundaries im Record
  'header' von 70 auf 100 Zeichen erhöht und damit an die Länge im
  Record 'mimedata' angepaßt.
  UUZ0.PAS, XP0.PAS, XPMAKEHD.INC

MY:
- Fix (-zu): Bei MIME-Nachrichten vom Typ multipart/related werden jetzt
  gemäß RFC2387 die bisher schlicht unterschlagenen Parameter "start="
  und "start-info" beachtet und in den neu erzeugten äußeren "Content-
  Type:"-Header geschrieben.
  UUZ.PAS, UUZ0.PAS, XPMAKEHD.INC

MY:
- Fix (-zu): Beim Schreiben des äußeren "Content-Type:"-Headers von
  Multipart-Nachrichten wird jetzt die Länge des Typs, des Boundary-
  Delimiters und weiterer etwaiger Parameter beachtet und der Header bei
  Bedarf (d.h. wenn er länger als 78 Zeichen würde) gefaltet. Bisher
  wurden alle Parameter ungeachtet der Gesamtlänge grundsätzlich in eine
  einzige Zeile geschrieben (was auch zu Zeichenverlust führen konnte).
  Da der Header "Content-Type:" samt seiner vielfältigen Parameter in
  einer eigenen Routine verarbeitet wird, läuft er nicht wie andere
  Header durch die Routine 'EncodeFoldQuote', die diese Behandlung auto-
  matisch vorgenommen hätte.
  UUZ.PAS

MY:
- Bezeichnung des Schalters "-gate" (-zu) in "-chkbody" geändert:
  Da im Verlaufe der Entwicklung und der praktischen Anwendung des
  Enhanced UUZ der Schalter "-gate", der den Body von ZConnect-Nachrich-
  ten auf das Vorkommen von 8bit-Zeichen prüft und dabei fehlerhafte
  Deklarationen von Zeichensatz und Transportcodierung repariert, seine
  ursprüngliche, rein gate-typische Bedeutung verloren hat und auch im
  XP-Umfeld zum Einsatz kommt (speziell im Betrieb mit UKA_PPP, wo er
  unbedingt zu empfehlen, sowie mit XP2, wo er ohnehin Default ist),
  wurde die etwas irreführende Bezeichnung "-gate" in die wesentlich
  treffendere und aussagekräftigere Bezeichnung "-chkbody" geändert (im
  Sinne der Abwärtskompatibilität funktioniert die Angabe von "-gate"
  aber nach wie vor).
  Alle früheren Referenzen in diesem Dokument auf den Schalter "-gate"
  wurden in "-chkbody" geändert.
  UUZ.PAS, UUZ0.PAS

MY:
- Im Zusammenhang mit der vorstehenden Änderung wird die Erzeugung des
  Headers "X-XP-Version:" bei der ZC=>RFC-Konvertierung jetzt auch nicht
  mehr vom Schalter "-gate" (bzw. jetzt "-chkbody") abhängig gemacht,
  sondern als Merkmal für echten Gatebetrieb dient jetzt ausschließlich
  die Existenz einer nicht-leeren ersten Zeile in der Datei 'ADDGATE' im
  UUZ-Verzeichnis (siehe dazu weiter oben). Nur wenn diese existiert,
  wird der Header "X-XP-Version:" nicht mehr erzeugt.
  Es ist absolut zu vermeiden, die Erzeugung des Headers "X-XP-Version:"
  im Normalbetrieb mit XP damit verhindern zu wollen, daß man die Datei
  'ADDGATE' mit einer nicht-leeren ersten Zeile erzeugt - es würden dann
  speziell bei ausgehenden RFC-Nachrichten völlig falsche und unsinnige
  Header "X-Gateway:" erzeugt werden.
  Der Header "X-XP-Version:" wird in absehbarer Zeit voraussichtlich
  ohnehin wieder eliminiert werden, sobald dessen Notwendigkeit nach
  Lage der Dinge nicht mehr gegeben ist.
  UUZ.PAS

MY:
- Fix (-uz): Wenn der allererste (auf die mit "From ..." beginnende
  erste Zeile folgende) RFC-Header einer UUCP-Mail zu den Headern
  gehörte, die mit dem Prefix "U-" in die ZConnect-Nachricht geschrieben
  werden (z.B. "X-Envelope-To:" => "U-X-Envelope-To:"), dann wurde die
  Headerbezeichnung - bis auf das erste Zeichen - in Kleinschreibung
  übernommen. Jetzt wird die Originalschreibweise verwendet.
  UUZ.PAS

MY:
- Sub-Versionsnummer für den UUZ eingeführt, die auf der UUZ-Hilfeseite
  und im Header "X-RFC-Converter:" hinter der Hauptversionsnummer von XP
  ausgegeben wird. Da die Entwicklung von FreeXP und des UUZ nicht
  zwangsläufig synchron verlaufen, lassen sich so die jeweiligen UUZ-
  Versionen besser voneinander unterscheiden (statt wie bisher nur am
  Dateidatum identifiziert werden zu können).
  UUZ0.PAS

MY:
- Aufgrund der Fülle und Relevanz der Änderungen, Fixes und Erweiterun-
  gen dieser neuen Version (oder Generation?) des Enhanced UUZ wurde der
  'Marketingname' des Programms zwecks leichterer Unterscheidung zum
  Vorgänger (z.B. in Newsgroup-Diskussionen o.ä.) in "Enhanced UUZ/II"
  geändert (abgekürzt "E-UUZ/II").
  UUZ0.PAS


- Beteiligte Entwickler an diesen UUZ-Version(en):
  ----------------------------------------------------------------------
  MY - Michael Heydekamp (Programmierung und Dokumentation)


- Credits für diese UUZ-Version(en):
  ----------------------------------------------------------------------
  Johann Addicks     - Diverse Anregungen (z.B. Charset-Fallback,
                       Gateway-Header und -Domain)
  Oliver Gampe       - Erstmalige Erkennung des Problems bei der Deco-
                       dierung von Multibyte-Zeichensätzen (UTF-7/8)
  Joachim Merkel     - Analysen im Zusammenhang mit dem gemeinsamen
                       Betrieb von Enhanced UUZ und UKA_PPP
  Hans-Jürgen Tänzer - Erkennung diverser Bugs und Anregung, den echten
                       Compilierungszeitpunkt fest zu verdrahten
                   -+
  Uwe Morgener      |
  Franklin Schiftan +- Testen der Kompatibilität mit XP2
  Jörg Tewes        |
                   -+
  Und alle hier nicht namentlich genannten Anwender des Enhanced UUZ,
  die durch ihr Feedback zu einer weiteren Verbesserung des Programms
  beigetragen haben.