Michael Heydekamp <[EMAIL PROTECTED]> wrote on 04.07.04:
[...]
> Im Grunde dreht sich, wenn ich es richtig sehe, alles um das Setzen
> des Typs in diesen Anweisungen in 'MimeAuswerten':
> ----------8<----------
> qprint:=ismime and (encoding=encQP);
> b64:=ismime and (encoding=encBase64);
> binary:=ismime and (not (ctype in [tText,tMultipart,tMessage]) or
> ((encoding=encBinary) and (ctype<>tText)));
> hd.typ:=iifc((binary or b64) and (ctype<>tText),'B','T');
> ----------8<----------
> D.h. �bersetzt, da� folgende Nachrichten derzeit als "TYP: BIN"
> geflagged und entsprechend behandelt werden (wobei "entsprechend
> behandelt" hei�t: keine Charset-Konvertierung, kein Anh�ngen von
> CRLF):
> 1. Alle mit CTE "base64" deklarierten Singlepart-Nachrichten, die
> nicht dem Content-Type text/* angeh�ren (message/*, application/*,
> image/* usw.).
Hier ist IMO die Bedingung "base64" mindestens unvollst�ndig (qp geh�rt
auch dazu), besser w�re aber, dies zuk�nftig gar nicht mehr von der
Codierung, sondern nur noch vom Content-Type abh�ngig zu machen.
Rein theoretisch - jedenfalls habe ich nichts gefunden, was dagegen
spr�che - k�nnte man uncodierte Bin�rdaten auch als "7bit" oder "8bit"
deklarieren, falls das Binary eben nur solche Daten (und weder EOLs noch
NUL) enth�lt sowie entsprechend kurz ist (bei mehr als 76 Bytes sollte
schon wegen der Zeilenl�nge codiert werden).
Das 'B'-Flag in XP bedeutet, da� die Nachricht echte Bin�rdaten enth�lt,
also sollten auch alle (aber eben auch *nur* die) Nachrichten als 'B'
geflagged werden, die eben solche enthalten.
> 2. Alle mit CTE "7bit", "8bit" oder "quoted-printable" deklarierten
> Singlepart-Nachrichten, die nicht dem Content-Type text/* oder
> message/* angeh�ren.
Steht bzgl. message/* etwas im Widerspruch zu 1. und ist zudem
�berfl�ssig, wenn zuk�nftig ohnehin nur noch der Content-Type ma�gebend
w�re.
> 3. Alle mit CTE "binary" deklarierten Single- und Multipart-Nachrichten,
> die nicht dem Content-Type text/* angeh�ren.
Bzgl. Multipart-Nachrichten gro�er K�se, und bei Singlepart-Nachrichten
w�rde sich auch hier die Pr�fung auf CTE er�brigen, wenn der Content-
Type alleiniger Ma�stab w�re.
> Eigentlich wollte ich schon den ge�nderten Code posten, aber ich will
> das doch lieber nochmal �berdenken und vor allem testen.
Getestet habe ich zwar noch nichts, aber RFC2045 nochmal komplett und
RFC2046 in Teilen gelesen, mir meine Gedanken dazu gemacht und schlage
daher folgende Vorgehensweise im Hinblick auf das Setzen des TYP:-
Headers, der Decodierung, der Behandlung von EOLs sowie der Charset-
Konvertierung vor. Dies stellt gleichzeitig eine nahezu vollst�ndige
Dokumentation des Handlings eingehender MIME-Nachrichten im UUZ dar.
Ich mache das auch deswegen so bewu�t ausf�hrlich, weil die bisherigen
Routinen �berwiegend "geerbt" sind, ich mich mit diesen Detailfragen
erstmals n�her besch�ftige, demzufolge darin noch nicht 100% sattelfest
bin und es f�r sinnvoll halte, wenn das nochmal gegengepr�ft wird.
1. (TYP:-Header und CTE-Decodierung) Es erhalten nur noch die
Nachrichten den Header "TYP: BIN", die die folgenden Kriterien
gleichzeitig erf�llen:
- Singlepart-Nachricht (Content-Type <> multipart/* und message/*).
- Content-Type <> text/*
Es verbleiben also die Typen image/*, audio/*, video/* und
application/*, die unabh�ngig von der Codierung den Header "TYP: BIN"
erhielten und somit in XP als 'B' geflagged w�rden.
Sind sie codiert (CTE "base64" oder "quoted-printable"), werden sie
decodiert - der resultierende ZConnect-Puffer enth�lt also echte
Bin�rdaten. Sind sie nicht codiert (CTE "7bit", "8bit" oder
"binary"), enth�lt die RFC-Nachricht und somit auch der resultierende
ZC-Puffer per Definition bereits Bin�rdaten (was aber ein in der
Praxis und laut RFC2045 nicht vorkommender Fall sein d�rfte).
Nicht als 'B' geflagged werden hingegen - und anders als bisher -
Multiparts mit CTE "binary". Diese erhalten keinen TYP:-Header und
erscheinen daher in XP mit dem Flag 'M'. In der Praxis f�hrt das
dazu, da� bei multipart/alternative automatisch der Textteil in den
Lister geladen werden sollte (was anscheinend nicht immer
funktioniert, aber das ist ein anderes Thema und vor allem keines den
UUZ betreffendes) und beim Beantworten die unpassende R�ckfrage, ob
man die Bin�rnachricht wirklich quoten wolle, entf�llt.
Gleichzeitig w�rde dadurch das diesen Thread ausl�sende Problem
fehlender CRLFs bei als "binary" deklarierten Multiparts behoben
werden, aber dazu im n�chsten Punkt mehr.
2. (Behandlung von EOLs) An den aktuellen Lese- und Schreibroutinen
sowie der Decodierung von base64- oder qp-codierten Daten �ndert sich
im Vergleich zur aktuellen UUZ-Testversion prinzipiell nichts, mit
einer Ausnahme:
Der "Fix" im aktuellen Test-UUZ, bei (uncodierten oder qp-codierten)
Bin�rdaten kein EOL aka CRLF an die Zeile anzuh�ngen, wird auf den
urspr�nglichen Zustand zur�ckgebaut, da er aufgrund einer Fehlinter-
pretation von Absatz 6.5 in RFC2045 f�lschlicherweise davon ausgegan-
gen ist, bei qp-codierten Bin�rdaten sei hinsichtlich der CRLF-
Behandlung genauso zu verfahren wie bei base64-codierten Bin�rdaten.
Dies ist falsch, denn qp-codierte Bin�rdaten sind mit "soft line
breaks" zu codieren, wenn die Datenmenge die max. zul�ssige Zeilen-
l�nge von 76 Zeichen �berschreitet - uncodierte Zeilenumbr�che d�rfen
dort also schlicht nicht vorkommen (und wenn sie doch vorkommen,
k�nnen sie nicht einfach ersatzlos entsorgt werden).
Uncodierte Bin�rdaten hingegen (die laut RFC2045 eigentlich gar nicht
vorkommen d�rften) k�nnen im Falle ihres Vorkommens eben solche
uncodierten EOLs enthalten, und diese d�rfen schon mal gar nicht
ersatzlos entsorgt werden.
Es ist allerdings darauf hinzuweisen, da� uncodierte oder qp-codierte
Bin�rdaten, die uncodierte EOLs (CR, LF, CRLF) enthalten, sehr
wahrscheinlich ohnehin defekt sind, weil sie schon beim Transport
ver�ndert worden sein k�nnen (und von externen Clients wie UKAW
definitiv ver�ndert werden, bei Mailservern und Gates d�rfte es nicht
viel anders aussehen).
Es w�rde daher derzeit keinen Sinn machen, mit hohem Aufwand die
bisherigen zeilenorientierten Lese- und Schreibroutinen im UUZ auf
nicht-zeilenorientierte Routinen umzubauen, um die Umwandlung alleine
vorkommender CR oder LFs nach CRLF zu verhindern - es ist schlicht
ungewi�, in welcher Form die vermeintlichen Zeilenumbr�che im
Original vorgelegen haben.
3. (Charset-Konvertierung) Bisher wurden von der Charset-Konvertierung
folgende *nicht-bin�ren* MIME-Typen ausgenommen:
- Content-Type multipart/* (eben alle Multipart-Nachrichten, deren
einzelne Teile beim Laden in den Lister von XP konvertiert werden)
- Content-Type */html (Singlepart, wobei mir f�r "*" nur "text" aus
der Praxis bekannt ist)
Beides ist richtig und sinnvoll und wird sich daher auch nicht
�ndern. Es wird aber vorgeschlagen, die Liste der MIME-Typen, die
keiner Zeichensatzkonvertierung unterzogen werden, zu erweitern auf:
- message/*
- text/enriched (oder */enriched) - siehe RFC1896
Bei message/* halte ich das f�r ganz selbstverst�ndlich, denn das ist
als der zweite von zwei composite-types �hnlich zu bewerten wie
multipart/*. Jede Zeichensatzkonvertierung w�rde u.U. Datenverlust
in der originalen RFC-Nachricht bedeuten.
Bei dem bisher gar nicht ber�cksichtigten Typ text/enriched oder
*/enriched handelt es sich um einen �hnlichen Fall wie bei text/html
oder */html: Das Format wird von XP nicht selbst interpretiert und
wird daher zur Darstellung i.d.R. an ein externes Programm �bergeben
werden (m�ssen) - eine vorherige Zeichensatzkonvertierung w�rde
die Darstellung von Umlauten und anderen 8bit-Zeichen verf�lschen
(so, wie es fr�her bei */html auch der Fall war, bis es ge�ndert
wurde).
4. (Offene Punkte) Es gibt ein paar noch offene und/oder nicht ganz
gekl�rte Punkte:
- Der UUZ wertet einen discrete-type namens "model" aus, den ich in
der MIME-Reihe (RFC2045-2049) gar nicht finden kann. Evtl. ist er
in den Vorl�ufern RFC1521/1522 spezifiziert - das w�re zu pr�fen
und ggf. k�nnte dieser Typ entsorgt werden.
- RFC2046 w�re daraufhin zu pr�fen, ob es weitere - bisher nicht
ber�cksichtigte - Subtypes gibt, die einer Sonderbehandlung (z.B.
Verhindern der Charset-Konvertierung) unterzogen werden sollten.
- [... wem noch was ein- und auff�llt, m�ge dies erg�nzen...]
Ich werde das, was oben beschrieben ist, in den n�chsten Tagen in eine
neue Testversion des UUZ implementieren und zum Download zur Verf�gung
stellen. Je nach Verlauf und Ergebnis der Diskussion dar�ber sowie der
Ergebnisse aus der Praxis ist nicht ausgeschlossen, da� danach nochmals
Ver�nderungen stattfinden.
>> Wie Du bereits angedeutet hast, sind nur Softbreaks zul�ssig,
>> ansonst sind hard line-breaks so wie sie auftauchen codiert und
>> decodiert, also =D0=0A (bzw. umgekehrt) oder nur =0D oder nur =DA,
>> damit der Inhalt unabh�ngig von den Regeln des Empfangssystem auf
>> einem anderen System angezeigt werden kann oder sonstwas eben.
> Wird vermutlich so sein, aber ich will trotzdem mal versuchen, einen
> Beleg daf�r zu finden.
Ich habe zwar keine explizite Regel gefunden, die besagt, da� bei
qp-codierten Binaries nur soft line breaks zul�ssig w�ren, aber der
gesamte Inhalt aller MIME-RFCs zum Thema qp-Codierung und CRLF-
Behandlung l��t IMO keinen anderen logischen Schlu� zu.
Michael
------------------------------------------------------------------------
FreeXP Entwickler-Mailingliste
[EMAIL PROTECTED]
http://www.freexp.de/cgi-bin/mailman/listinfo/dev-list