Discussion:
Eurêka décodage MIME dans NewsPortal (was: Toutes les élections etc.)
(trop ancien pour répondre)
Olivier Miakinen
2020-10-28 00:50:33 UTC
Permalink
[diapublication avec suivi]
Bug #1 (e.g. MicroPlanet-Gravity/2.9.15)
Some old or misconfigured newsreaders post articles with 8-bit characters
in the headers when there should be only ASCII. This is a problem because
there is no foolproof way to guess which charset was used.
Workaround #1
The most commonly encountered character set for this bug, at least on
usenet-fr, is CP1252 (Windows Latin1) which is a superset of ISO-8859-1
(ISO Latin1). However, UTF-8 is usually so easy to recognize that we
first assume the text is un UTF-8. If this assumption fails, we then
convert from CP1252. This probably covers over 99% of cases. Anyway, the
main thing is to have a unique character set in the end, which is UTF-8.
Bug #2 (e.g. SeaMonkey/2.49.4 or Thunderbird/68.12.1)
In quoted-printable encoding, use lower case hexadecimal digits 'a'
through 'f' instead of upper case 'A' through 'F'.
Workaround #2
Ignore the case of hexadecimal digits when decoding quoted-printable.
Bug #3 (e.g. MicroPlanet-Gravity/3.0.4)
Have an unencoded '?' within a quoted-printable encoded-word. It should
normally be encoded as '=3F'.
Workaround #3
Accept to find an unencoded '?' in the 'encoded-text' part.
Bug #4 (e.g. NewsPortal/0.50.1)
Have headers lines with at least one MIME encoded-word where the length
of the line is greater than 76. This was sometimes the case for the
first line of a multiline header.
Workaround #4
Don't care about the length of header lines.
Bug #5 (e.g. MesNews/1.08.06.00)
Violation of the rule that each encoded-word must represent an integral
number of characters.
Workaround #5
Concatenate the encoded-text parts of multiple adjacent encoded-words
with the same charset, before interpreting the result according to
this charset.
Celui là n'est peut-être pas encore totalement corrigé (à l'affichage
j'ai des choses étonnantes.
[...]
J'ai trouvé.

En attendant une refonte plus complète parce que le code est plein de
rustines pas belles (et peut-être buguées), voici ce qu'il faut faire
dans newsportal.php.

1) Remplacer l'horrRRRIble fonction headerDecode() par :
=====================================================
function headerDecode($value) {
return "" . new MimeDecodeHeader($value);
}
=====================================================

2) Supprimer la fonction want_translit() qui ne sert plus à rien.



[suivi vers fr.comp.lang.php]
yamo'
2020-10-28 10:53:42 UTC
Permalink
Salut,
Post by Olivier Miakinen
[diapublication avec suivi]
J'ai trouvé.
En attendant une refonte plus complète parce que le code est plein de
rustines pas belles (et peut-être buguées), voici ce qu'il faut faire
dans newsportal.php.
J'ai viré les deaderDecode en trop. J'envoie dès que c'est fonctionnel.
Post by Olivier Miakinen
=====================================================
function headerDecode($value) {
return "" . new MimeDecodeHeader($value);
}
=====================================================
En faisant ça j'ai des entêtes non décodées sur la version de test ;
j'ai quelque chose qui commence par : "=?UTF-8?B?"

http://news2web.pasdenom.info/article.php?id=30592&group=fr.test#30592
http://news2web.pasdenom.info/article.php?id=30591&group=fr.test#30591
http://news2web.pasdenom.info/article.php?id=30593&group=fr.test#30593
Post by Olivier Miakinen
2) Supprimer la fonction want_translit() qui ne sert plus à rien.
Fait sur le code _non_envoyé_ sur git.
Post by Olivier Miakinen
[suivi vers fr.comp.lang.php]
Olivier Miakinen
2020-10-28 11:52:30 UTC
Permalink
Post by yamo'
En faisant ça j'ai des entêtes non décodées sur la version de test ;
j'ai quelque chose qui commence par : "=?UTF-8?B?"
http://news2web.pasdenom.info/article.php?id=30592&group=fr.test#30592
http://news2web.pasdenom.info/article.php?id=30591&group=fr.test#30591
http://news2web.pasdenom.info/article.php?id=30593&group=fr.test#30593
J'ai peut-être une idée.

Dans article.php il y a un appel à headerDecode() dans un fichier qui
n'inclut pas mime.inc.php. Ça pourrait être ça.

Tu ne peux pas voir les messages d'erreur ? Je demande ça aussi parce
qu'il y avait une erreur dans l'ancien headerDecode(), que tu n'avais
pas vue alors qu'elle empêchait un iconv (heureusement que c'était de
UTF-8 vers UTF-8).
yamo'
2020-10-28 13:15:32 UTC
Permalink
Salut,
Post by Olivier Miakinen
Post by yamo'
En faisant ça j'ai des entêtes non décodées sur la version de test ;
j'ai quelque chose qui commence par : "=?UTF-8?B?"
http://news2web.pasdenom.info/article.php?id=30592&group=fr.test#30592
http://news2web.pasdenom.info/article.php?id=30591&group=fr.test#30591
http://news2web.pasdenom.info/article.php?id=30593&group=fr.test#30593
J'ai peut-être une idée.
Dans article.php il y a un appel à headerDecode() dans un fichier qui
n'inclut pas mime.inc.php. Ça pourrait être ça.
Il appelle newsportal.php qui lui appelle les bibliothèques.
Au niveau logique, je mettrais plutôt newsportal.php dans /lib vu qu'il
n'est jamais appelé par un navigateur.

J'ai trouvé un pis aller : j'encode avec ta fonction et j'affiche avec
l'ancienne...
Post by Olivier Miakinen
Tu ne peux pas voir les messages d'erreur ? Je demande ça aussi parce
qu'il y avait une erreur dans l'ancien headerDecode(), que tu n'avais
pas vue alors qu'elle empêchait un iconv (heureusement que c'était de
UTF-8 vers UTF-8).
Il y a pas mal d'erreurs (php NOTICE et php WARNING), c'est probablement
noyé dedans ... Grâce à toi j'ai vu l'erreur...

Pour information, je suis en php 7.3 mais je ne pense pas qu'il y ait
beaucoup de différence avec 7.2.

Sauf erreurs (je le fais à l'ancienne avec meld (un diff graphique)),
news2web est à jour :
<http://news2web.pasdenom.info/thread.php?group=fr.test>
--
Stéphane
Olivier Miakinen
2020-10-28 14:34:18 UTC
Permalink
Post by yamo'
J'ai trouvé un pis aller : j'encode avec ta fonction et j'affiche avec
l'ancienne...
Je regarde :
https://gitlab.com/yamo-nntp/newsportal/-/blob/master/newsportal.php

Note que si tu réponds à un article mal encodé, il peut être normal
que ma fonction laisse des =?UTF-8?B? et ce serait une erreur de tenter
de les traiter quand même. Je pense que tu devrais retirer le code que
tu as rajouté dans headerDecode2.

Quand tu me signales un décodage qui te semble incorrect, au lieu de
me donner le lien vers news2web.pasdenom.info, donne moi plutôt :
- le MID de l'article auquel tu réponds ;
- le MID de ta réponse (s'il y en a une) ;
- une copie de l'affichage du Subject tel que tu le vois.

Je te dirai alors si l'affichage qui te semble incorrect est en fait
normal parce que tu réponds à un article qui *est* incorrect.
Post by yamo'
Post by Olivier Miakinen
Tu ne peux pas voir les messages d'erreur ? Je demande ça aussi parce
qu'il y avait une erreur dans l'ancien headerDecode(), que tu n'avais
pas vue alors qu'elle empêchait un iconv (heureusement que c'était de
UTF-8 vers UTF-8).
Il y a pas mal d'erreurs (php NOTICE et php WARNING), c'est probablement
noyé dedans ... Grâce à toi j'ai vu l'erreur...
Pourtant elle est toujours là.

À la ligne 482 dans le cas de QP, il y a une instruction qui extrait le
charset ($charset).

Mais dans les lignes 490 à 493, dans le cas de B64, cette instruction
n'existe pas. Et tu devrais donc avoir une erreur sur la ligne 495.
Post by yamo'
Pour information, je suis en php 7.3 mais je ne pense pas qu'il y ait
beaucoup de différence avec 7.2.
En effet. Tout ce code devrait fonctionner à l'identique dans les
dernières versions 5 et dans toutes les versions 6 et 7. D'ailleurs
sur mon Linux j'étais en version 7.2, mais là dans Cygwin sur Windows
je suis en 7.3.7.
Post by yamo'
Sauf erreurs (je le fais à l'ancienne avec meld (un diff graphique)),
<http://news2web.pasdenom.info/thread.php?group=fr.test>
Pour être sûr, voici les lignes 489 à 496 de newsportal.php tel que je
peux le voir maintenant. Si tu as corrigé l'histoire du $charset, ça
n'a pas été reporté.

if (preg_match('/=\?.*\?B\?.*\?=/i',$value)) { // base64 decoding
$result1=preg_replace('/(.*)=\?.*\?B\?(.*)\?=(.*)/i','\1',$value);
$result2=preg_replace('/(.*)=\?.*\?B\?(.*)\?=(.*)/i','\2',$value);
$result3=preg_replace('/(.*)=\?.*\?B\?(.*)\?=(.*)/i','\3',$value);
$result2=base64_decode($result2);
// Fix made by Julien Élie

$newvalue=$result1.recode_charset($result2,$charset,mb_internal_encoding()).$result3;
}
Olivier Miakinen
2020-10-28 14:50:59 UTC
Permalink
Post by Olivier Miakinen
Note que si tu réponds à un article mal encodé, il peut être normal
que ma fonction laisse des =?UTF-8?B? et ce serait une erreur de tenter
de les traiter quand même. Je pense que tu devrais retirer le code que
tu as rajouté dans headerDecode2.
C'est le cas en particulier si tu réponds à l'une des réponses faites
avec Nemo ou avec MacCafé, ou l'une des réponses de réponses qui ont suivi.

Ces réponses de Nemo et MacCafé sont buguées car ils ont collé des
=?UTF-8?B? à ce qui précédait au lieu de laisser une espace avant
(et après).

Donc, ne teste que les articles que SeaMonkey, Mozilla ou Pan arrivent
à décoder et qui te semblent corrects avec ces nouvelleurs, même si
Nemo et MacCafé n'y arrivent pas. En particulier les articles de DV
faits avec MesNews et qui ne sont pas des réponses.
yamo'
2020-10-28 15:11:42 UTC
Permalink
Post by Olivier Miakinen
Post by Olivier Miakinen
Note que si tu réponds à un article mal encodé, il peut être normal
que ma fonction laisse des =?UTF-8?B? et ce serait une erreur de tenter
de les traiter quand même. Je pense que tu devrais retirer le code que
tu as rajouté dans headerDecode2.
Je viens juste de le faire. et j'ai enfin vu le $charset manquant, après
moi les et regex :-( ...
Post by Olivier Miakinen
C'est le cas en particulier si tu réponds à l'une des réponses faites
avec Nemo ou avec MacCafé, ou l'une des réponses de réponses qui ont suivi.
Ces réponses de Nemo et MacCafé sont buguées car ils ont collé des
=?UTF-8?B? à ce qui précédait au lieu de laisser une espace avant
(et après).
Donc, ne teste que les articles que SeaMonkey, Mozilla ou Pan arrivent
à décoder et qui te semblent corrects avec ces nouvelleurs, même si
Nemo et MacCafé n'y arrivent pas. En particulier les articles de DV
faits avec MesNews et qui ne sont pas des réponses.
J'avais des bugs même avec ces posts là :

1.
<news:***@news.domain.invalid>
<http://news2web.pasdenom.info/article.php?id=%***@news.domain.invalid%3E&group=fr.test>
<http://al.howardknight.net/?ID=160389753900>

2.
<news:rn9qog$nut$***@pasdenom.info>
<http://news2web.pasdenom.info/article.php?id=%3Crn9qog$nut$***@pasdenom.info%3E&group=fr.test>
<http://al.howardknight.net/?ID=160389777900>
--
Stéphane
Olivier Miakinen
2020-10-28 15:54:23 UTC
Permalink
Post by yamo'
Post by Olivier Miakinen
Post by Olivier Miakinen
Note que si tu réponds à un article mal encodé, il peut être normal
que ma fonction laisse des =?UTF-8?B? et ce serait une erreur de tenter
de les traiter quand même. Je pense que tu devrais retirer le code que
tu as rajouté dans headerDecode2.
Je viens juste de le faire. et j'ai enfin vu le $charset manquant, après
moi les et regex :-( ...
Ok.
Post by yamo'
Post by Olivier Miakinen
C'est le cas en particulier si tu réponds à l'une des réponses faites
avec Nemo ou avec MacCafé, ou l'une des réponses de réponses qui ont suivi.
Ces réponses de Nemo et MacCafé sont buguées car ils ont collé des
=?UTF-8?B? à ce qui précédait au lieu de laisser une espace avant
(et après).
Donc, ne teste que les articles que SeaMonkey, Mozilla ou Pan arrivent
à décoder et qui te semblent corrects avec ces nouvelleurs, même si
Nemo et MacCafé n'y arrivent pas. En particulier les articles de DV
faits avec MesNews et qui ne sont pas des réponses.
1.
<http://al.howardknight.net/?ID=160389753900>
2.
<http://al.howardknight.net/?ID=160389777900>
Tu avais, et donc tu ne les as plus. Mais est-ce que tu les as de
nouveau en n'utilisant plus la vieille version de headerDecode ?

Au fait, dans article.php je vois qu'il y a un message_read()
avant de faire un headerDecode_old(). Or le décodage devrait avoir
déjà été fait (donc pas besoin de le refaire). Sauf... sauf s'il
a récupéré un article en cache qui était tout cassé ! Je serais
toi, j'essaierais de vider le cache, et de retirer cet appel à
headerDecode_old() au lieu de le remplacer par headerDecode2().

Sur des articles relus correctement dès le début par la fonction
message_parse(), ça devrait fonctionner correctement.
yamo'
2020-10-28 16:55:40 UTC
Permalink
Salut,
Post by Olivier Miakinen
Post by yamo'
1.
<http://al.howardknight.net/?ID=160389753900>
2.
<http://al.howardknight.net/?ID=160389777900>
Tu avais, et donc tu ne les as plus. Mais est-ce que tu les as de
nouveau en n'utilisant plus la vieille version de headerDecode ?
Oui, j'ai fait le test :
find /path/to/spool/ -type f -exec rm {} \;

En laissant juste return($value) dans la vieille fonction.

Cas 1 :

<Loading Image...>

Cas 2 :

<Loading Image...>
Post by Olivier Miakinen
Au fait, dans article.php je vois qu'il y a un message_read()
avant de faire un headerDecode_old(). Or le décodage devrait avoir
déjà été fait (donc pas besoin de le refaire). Sauf... sauf s'il
a récupéré un article en cache qui était tout cassé ! Je serais
toi, j'essaierais de vider le cache, et de retirer cet appel à
headerDecode_old() au lieu de le remplacer par headerDecode2().
Sur des articles relus correctement dès le début par la fonction
message_parse(), ça devrait fonctionner correctement.
Avec la vieille function normale, ça fonctionne correctement (liens
précédemment donnés).

Tout se passe comme si ta fonction remettais à plat l'entête mais en ne
la décodant pas à la fin.
Et comme je te l'ai dit par mail, en testant en ligne de commande ça
fonctionne bien...

Il doit y avoir quelque chose dans le php.ini qui diffère.
--
Stéphane
Olivier Miakinen
2020-10-28 17:37:08 UTC
Permalink
Post by yamo'
Salut,
Post by Olivier Miakinen
Post by yamo'
1.
<http://al.howardknight.net/?ID=160389753900>
2.
<http://al.howardknight.net/?ID=160389777900>
Tu avais, et donc tu ne les as plus. Mais est-ce que tu les as de
nouveau en n'utilisant plus la vieille version de headerDecode ?
find /path/to/spool/ -type f -exec rm {} \;
En laissant juste return($value) dans la vieille fonction.
Et pourtant...
Post by yamo'
<http://news2web.pasdenom.info/img/_sans_decode2.png>
printf("%s\n", new MimeDecodeHeader("=?UTF-8?B?w6nDoMOr?="));
=> "éàë"
Post by yamo'
<http://news2web.pasdenom.info/img/cas2_sans_decode2.png>
printf("%s\n", new MimeDecodeHeader(
"Re: =?UTF-8?B?w4AgcmVtcGxhY2Vy?="));
=> "Re: À remplacer"

Ils n'auraient pas par hasard été doublement encodés ?

printf("%s\n", new MimeDecodeHeader(
"=?UTF-8?B?PT9VVEYtOD9CP3c2bkRvTU9yPz0=?="));
=> "=?UTF-8?B?w6nDoMOr?="
Post by yamo'
Post by Olivier Miakinen
Au fait, dans article.php je vois qu'il y a un message_read()
avant de faire un headerDecode_old(). Or le décodage devrait avoir
déjà été fait (donc pas besoin de le refaire). Sauf... sauf s'il
a récupéré un article en cache qui était tout cassé ! Je serais
toi, j'essaierais de vider le cache, et de retirer cet appel à
headerDecode_old() au lieu de le remplacer par headerDecode2().
Sur des articles relus correctement dès le début par la fonction
message_parse(), ça devrait fonctionner correctement.
Avec la vieille function normale, ça fonctionne correctement (liens
précédemment donnés).
Et avec headerDecode2() au lieu de headerDecode_old() ça ne marche pas
aussi bien ? Ou directement avec « "".new MimeDecodeHeader() » ?
Post by yamo'
Tout se passe comme si ta fonction remettais à plat l'entête mais en ne
la décodant pas à la fin.
Et comme je te l'ai dit par mail, en testant en ligne de commande ça
fonctionne bien...
Il doit y avoir quelque chose dans le php.ini qui diffère.
Il y a bien un truc que j'ai dû changer pour ne pas toucher à mon
php.ini, c'est de mettre <?php au lieu de <? comme balises de début.
Mais là je soupçonne plutôt que ce qu'on lui passe n'est pas ce que
l'on croit.
yamo'
2020-11-01 09:41:31 UTC
Permalink
Salut,
Post by Olivier Miakinen
Il y a bien un truc que j'ai dû changer pour ne pas toucher à mon
php.ini, c'est de mettre <?php au lieu de <? comme balises de début.
Mais là je soupçonne plutôt que ce qu'on lui passe n'est pas ce que
l'on croit.
Oui, je le pense, j'ai refait le test en ne décodant qu'avec
headerDecode2 et c'est encore encodé même pour un post anodin de
Seamonkey :
Subject:
=?UTF-8?B?c3VqZXQgYWNjZW50dcOpIGRlIHLDqWbDqXJlbmNlIChTZWFtb25rZXkp?=
Affiché :
=?UTF-8?B?c3VqZXQgYWNjZW50dcOpIGRlIHLDqWbDqXJlbmNlIChTZWFtb25rZXkp?=

Pour tester, je l'ai appliqué deux fois sans succès :
=?UTF-8?B?c3VqZXQgYWNjZW50dcOpIGRlIHLDqWbDqXJlbmNlIChTZWFtb25rZXkp?=

En attendant mieux, je laisse l'ancienne fonction.

AU fait, je déplace newsportal.php dans lib ce qui me paraît plus
logique...
--
Stéphane
Otomatic
2020-11-01 10:43:16 UTC
Permalink
Post by Olivier Miakinen
Il y a bien un truc que j'ai dû changer pour ne pas toucher à mon
php.ini, c'est de mettre <?php au lieu de <? comme balises de début.
Mais là je soupçonne plutôt que ce qu'on lui passe n'est pas ce que
l'on croit.
Directive short_open_tag
Post by Olivier Miakinen
This directive determines whether or not PHP will recognize code between
<? and ?> tags as PHP source which should be processed as such. It is
generally recommended that <?php and ?> should be used and that this feature
should be disabled, as enabling it may result in issues when generating XML
documents, however this remains supported for backward compatibility reasons.
Note that this directive does not control the <?= shorthand tag, which can be
used regardless of this directive.
http://php.net/short-open-tag
short_open_tag = Off
Olivier Miakinen
2020-11-01 15:12:06 UTC
Permalink
Post by Otomatic
Post by Olivier Miakinen
Il y a bien un truc que j'ai dû changer pour ne pas toucher à mon
php.ini, c'est de mettre <?php au lieu de <? comme balises de début.
Mais là je soupçonne plutôt que ce qu'on lui passe n'est pas ce que
l'on croit.
Directive short_open_tag
Oui, mais j'écrivais « pour ne pas toucher à mon php.ini ».

À ma connaissance, cette directive qui est déconseillée depuis un moment,
c'est dans le php.ini qu'elle se met si on veut revenir à l'usage ancien.
Post by Otomatic
Post by Olivier Miakinen
[...] It is
generally recommended that <?php and ?> should be used and that this feature
should be disabled [...]
Voilà. Même si la raison (utiliser XML) on s'en fout un peu ici, je préfère
ne pas revenir en arrière.
--
Olivier Miakinen
yamo'
2020-11-01 10:56:52 UTC
Permalink
Salut,
Post by yamo'
Il doit y avoir quelque chose dans le php.ini qui diffère.
C'était pire que ça : mon apache tournait avec du php5!

Là j'ai la dernière version de php7.3 mais qui tourne comme si c'était
du php5....
Bon y a du taf, j'ai des erreurs partout.
--
Stéphane
Olivier Miakinen
2020-11-01 15:15:53 UTC
Permalink
Post by yamo'
C'était pire que ça : mon apache tournait avec du php5!
Là j'ai la dernière version de php7.3 mais qui tourne comme si c'était
du php5....
Bon y a du taf, j'ai des erreurs partout.
Aïe... bon courage !

Déjà, tu peux commencer par remplacer les balises de début <? par <?php
comme je l'ai fait, parce que ça c'est assuré de fonctionner en PHP 5
comme en PHP 7.

Sinon, si tu ne t'en sors pas avec PHP 7 et qu'il te faut revenir à PHP 5,
je peux revoir mon code pour m'assurer qu'il fonctionne dans les deux
versions.
--
Olivier Miakinen
yamo'
2020-11-01 15:37:21 UTC
Permalink
Post by Olivier Miakinen
Post by yamo'
C'était pire que ça : mon apache tournait avec du php5!
Là j'ai la dernière version de php7.3 mais qui tourne comme si c'était
du php5....
Bon y a du taf, j'ai des erreurs partout.
Aïe... bon courage !
Déjà, tu peux commencer par remplacer les balises de début <? par <?php
comme je l'ai fait, parce que ça c'est assuré de fonctionner en PHP 5
comme en PHP 7.
Je pense que c'est un des plus gros soucis. Je vais regarder avec la
modification du php.ini et revenir dessus une fois corrigé.
Il y a des <? en pagaille.
Post by Olivier Miakinen
Sinon, si tu ne t'en sors pas avec PHP 7 et qu'il te faut revenir à PHP 5,
je peux revoir mon code pour m'assurer qu'il fonctionne dans les deux
versions.
Je regarderai tranquillement quand j'aurais suffisamment de temps.
Ce qui m'a étonné c'est quand j'ai vu la version de php qui vient de
debian 8 alors que je suis sur debian 10, il doit y avoir quelques
failles corrigées entre deux!
Là, ça fonctionne un peu par miracle donc je vais tester avec des
machines virtuelles.
--
Stéphane
yamo'
2020-11-02 09:53:28 UTC
Permalink
Corrigé en local.

http://news2web.pasdenom.info/thread.php?group=fr.test


Pour pousser les modifications git en ligne de commande va être utile...
--
Stéphane
yamo'
2020-11-02 14:10:14 UTC
Permalink
Salut,
Post by Olivier Miakinen
[diapublication avec suivi]
En attendant une refonte plus complète parce que le code est plein de
rustines pas belles (et peut-être buguées), voici ce qu'il faut faire
dans newsportal.php.
Merci Olivier!

J'ai poussé la version 0.50.1f qui fonctionne _réellement_ en php7.3 :

<https://gitlab.com/yamo-nntp/newsportal/-/tags/0.50.1f>
--
Stéphane
Loading...