Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Script pour d=c3=a9coder les ent=c3=aates MIME

57 réponses
Avatar
Olivier Miakinen
Salut !

J'ai fait un script pour décoder les entêtes MIME selon le RFC 2047.
Je l'ai appelé decode2047 et je le joins à la fin de cet article.

Tests :

> om@kentia:~$ decode2047 "=?UTF-8?Q?Ceci_est_une_tentative_d'encoder_un_=5f_en_quoted-printab?= =?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?="
> Ceci est une tentative d'encoder un _ en quoted-printable (was: Hé etc.)
> om@kentia:~$ decode2047 "=?UTF-8?Q?Ceci_est_une_tentative_d'encoder_un_=5f_en_quoted-printab?= HELLO =?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?="
> Ceci est une tentative d'encoder un _ en quoted-printab HELLO le (was: Hé etc.)

Merci d'essayer pour voir si ça fonctionne aussi sur Mac (il faut les
commandes qprint et base64).

========================================================================
#!/bin/bash
# Script pour décoder un entête MIME

#
# Cette fonction vérifie que le paramètre est bien un encoded-word,
# puis elle le décode et le traduit en UTF-8.
#
# Si tout est OK, le résultat est dans $RESULT et la fonction retourne 0.
# Sinon, la fonction retourne 1.
#
decode_word()
{
# Un encoded-word doit être tout seul
if [ "$#" != "1" ]; then return 1; fi

# On vérifie que le paramètre est bien sous la forme :
# =?<charset>?<encoding>?<encoded>?=
# avec :
# <charset> : lettres, chiffres, underscores ou tirets
# <encoding> : B ou Q en majuscule ou minuscule
# <encoded> : ASCII imprimable sans espace ni point d'interrogation
if [ $(LANG=C expr "$1" : '=?[A-Za-z0-9_-]\+?[BbQq]?[!->@-~]\+?=$') = 0 ]
then
return 1;
fi

charset=$(printf "$1" | cut -f 2 -d '?')
encoding=$(printf "$1" | cut -f 3 -d '?')
encoded=$(printf "$1" | cut -f 4 -d '?')

case $encoding in
B | b)
decoded=$(printf "$encoded" | base64 -d 2>/dev/null)
if [ $? != 0 ]; then return 1; fi
;;
Q | q)
decoded=$(printf "$encoded" | tr "_" " " | qprint -d 2>/dev/null)
if [ $? != 0 ]; then return 1; fi
;;
*)
# Shouldn't occur
return 1
;;
esac

RESULT=$(printf "$decoded" | iconv -f $charset -t UTF-8)
return 0
}

FINAL_RESULT=""
PREV_RETCODE=

for word in $*
do
if decode_word "$word"
then
CURR_RETCODE=0
else
CURR_RETCODE=1
RESULT="$word"
fi

case "$PREV_RETCODE" in
0 )
# Previous string was an encoded-word.
# Add a space only if currect string is not.
if [ "$CURR_RETCODE" = "1" ]
then
RESULT=" ${RESULT}"
fi
;;
1 )
# Previous string was not an encoded-word.
# Always add a space.
RESULT=" ${RESULT}"
;;
* )
# There is no previous string.
# Never add a space.
;;
esac
PREV_RETCODE="$CURR_RETCODE"

FINAL_RESULT="${FINAL_RESULT}${RESULT}"
done

echo "$FINAL_RESULT"
========================================================================

Cordialement,
--
Olivier Miakinen

10 réponses

1 2 3 4 5
Avatar
Olivier Miakinen
Le 14/10/2019 00:40, j'écrivais (lignes 46 et 47 du script) :
RESULT=$(printf "$decoded" | iconv -f $charset -t UTF-8)
return 0

Remplacer ces deux lignes par :
RESULT=$(printf "$decoded" | iconv -f $charset -t UTF-8 2>/dev/null)
return $?
(sinon on ne teste pas le code de retour d'iconv)
--
Olivier Miakinen
Avatar
M.V.
C'est le 13 octobre 2019 que le dénommé Olivier Miakinen a
écrit ces lignes :
J'ai fait un script

Marche pas chez moi (j'ai tenu compte de ton message demandant
de modifier les lignes 46 et 47)…
J'obtiens rien de plus que ce que j'ai demandé de décoder :
=?UTF-8?Q?Ceci_est_une_tentative_d'encoder_un___en_quoted-printab?=
=?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?
Bonne journée.
--
Michel VAUQUOIS - http://michelvauquois.fr
Avatar
josephb
Bonjour Michel,
M.V. wrote:
Marche pas chez moi (j'ai tenu compte de ton message demandant
de modifier les lignes 46 et 47)…

je suppose que tu l'as rendu exécutable avec la commande chmod ?
<https://support.apple.com/fr-ci/guide/terminal/apdd100908f-06b3-4e63-8a87-32e71241bab4/mac>
Moi je me heurte à une erreur dans le Terminal qui ne reconnait pas le
chemin du script alors que je fais un glisser-déposer pour être sûr de
ne pas me tromper.
Je sèche…
--
J. B.
Avatar
M.V.
C'est le 14 octobre 2019 que le dénommé Joseph-B a écrit ces lignes :
je suppose que tu l'as rendu exécutable avec la commande chmod ?

Oui. Il s'appelle olivier.sh et j'ai bien :
-rwxr-xr-x@ 1 MV staff 2255 14 oct 13:11 olivier.sh
Me semble que c'est bon, non ?
Bonne journée.
--
Michel VAUQUOIS - http://michelvauquois.fr
Avatar
josephb
M.V. wrote:
Oui. Il s'appelle olivier.sh et j'ai bien :
-rwxr-xr-x@ 1 MV staff 2255 14 oct 13:11 olivier.sh
Me semble que c'est bon, non ?

Oui, il a les attributs d'exécutable, et bien sûr si tu appelles le
script dans le Terminal par le nom que tu lui as donné et non pas
"decode2047".
Toi au moins le script est accepté, ici je n'arrive même pas à ça :-/
Tu l'as mis où ce script ?
--
J. B.
Avatar
M.V.
C'est le 14 octobre 2019 que le dénommé Joseph-B a écrit ces lignes :
Toi au moins le script est accepté, ici je n'arrive même pas à ça :-/
Tu l'as mis où ce script ?

Au 1er niveau de mon "home".
Je l'appelle donc avec ~/olivier.sh
Quand je ne fais que l'appeler, le Terminal ne râle pas : en réponse
j'ai droit à un grand silence ! Est-ce que c'est signe qu'il
fonctionne ?
Bonne journée.
--
Michel VAUQUOIS - http://michelvauquois.fr
Avatar
Olivier Miakinen
Bonjour,
Le 14/10/2019 à 13:44, Joseph-B a écrit :
Moi je me heurte à une erreur dans le Terminal qui ne reconnait pas le
chemin du script alors que je fais un glisser-déposer pour être sûr de
ne pas me tromper.
Je sèche…

J'ai bien reçu tes messages par courriel privé, mais là je suis au
boulot et je peux difficilement répondre depuis mon adresse perso.
De toute façon, tes problèmes semblent liés au fonctionnement sur
Mac (et à la politique d'Apple qui, à ce que je comprends sur le
web, a refusé de mettre à jour son shell Bash depuis des années
parce qu'il est « trop » libre).
Alors je donne les infos que je peux, glanées sur la toile, pour
que les spécialistes Mac te répondent.
Tu m'as dit par courriel que le message d'erreur était le suivant :
bad interpreter: No such file or directoryScripts Divers/Decode2047.sh: /bin/bash

Cela veut dire qu'il le trouve pas /bin/bash, alors que c'est ce
que j'ai spécifié en première ligne de mon script :
#!/bin/bash

Du coup, il faudrait savoir comment résoudre au mieux le problème,
ce que je ne peux pas deviner car je n'ai pas d'accès à un Mac.
Quelques pistes :
- trouver comment mettre à jour /bin/bash ;
- trouver un bash ailleurs, par exemple /usr/local/bin/bash, et changer
la première ligne du script en #!/usr/local/bin/bash ;
- utiliser un autre shell, peut-être /bin/zsh, et changer la première
ligne du script en #!/bin/zsh.
Tout ceci dépendra bien sûr des fonctionnalités présentes dans le shell
choisi, par exemple le « expr chaîne : regexp » que j'utilise dans mon
script n'y est peut-être pas.
Deux pages intéressantes que j'ai trouvée en cherchant bash sur Mac :
https://itnext.io/upgrading-bash-on-macos-7138bd1066ba
https://www.theverge.com/2019/6/4/18651872/apple-macos-catalina-zsh-bash-shell-replacement-features
Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 14/10/2019 à 13:15, M.V. a écrit :
Marche pas chez moi (j'ai tenu compte de ton message demandant
de modifier les lignes 46 et 47)…
J'obtiens rien de plus que ce que j'ai demandé de décoder :
=?UTF-8?Q?Ceci_est_une_tentative_d'encoder_un___en_quoted-printab?=
=?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?

Essaye de rajouter une ligne contenant « set -x » au début de la
fonction decode_word(), ça devrait tracer à quel endroit elle décide
que ce n'est pas un bon encoded-word et retourne 1 au lieu de 0.
--
Olivier Miakinen
Avatar
M.V.
C'est le 14 octobre 2019 que le dénommé Olivier Miakinen a écrit ces lignes :
Essaye de rajouter une ligne contenant « set -x » au début de la
fonction decode_word()

Ça donne ça ?
**********
set -x
if [ $(LANG=C expr "$1" : '=?[A-Za-z0-9_-]+?[BbQq]?[!->@-~]+?=$') = 0 ]
then
return 1;
fi
**********
Réponse du Terminal :
**********
~/olivier.sh "=?UTF-8?Q?Ceci_est_une_tentative_d'encoder_un___en_quoted-printab?=
=?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?="
++ LANG=C
++ expr '=?UTF-8?Q?Ceci_est_une_tentative_d'''encoder_un___en_quoted-printab?=' :
'=?[A-Za-z0-9_-]+?[BbQq]?[!->@-~]+?=$'
+ '[' 0 = 0 ']'
+ return 1
+ CURR_RETCODE=1
+ RESULT='=?UTF-8?Q?Ceci_est_une_tentative_d'''encoder_un___en_quoted-printab?='
+ case "$PREV_RETCODE" in
+ PREV_RETCODE=1
+ FINAL_RESULT='=?UTF-8?Q?Ceci_est_une_tentative_d'''encoder_un___en_quoted-printab?='
+ for word in '$*'
+ decode_word '=?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?='
+ '[' 1 '!=' 1 ']'
+ set -x
++ LANG=C
++ expr '=?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?=' : '=?[A-Za-z0-9_-]+?[BbQq]?[!->@-~]+?=$'
+ '[' 0 = 0 ']'
+ return 1
+ CURR_RETCODE=1
+ RESULT='=?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?='
+ case "$PREV_RETCODE" in
+ RESULT=' =?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?='
+ PREV_RETCODE=1
+ FINAL_RESULT='=?UTF-8?Q?Ceci_est_une_tentative_d'''encoder_un___en_quoted-printab?=
=?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?='
+ echo '=?UTF-8?Q?Ceci_est_une_tentative_d'''encoder_un___en_quoted-printab?=
=?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?='
=?UTF-8?Q?Ceci_est_une_tentative_d'encoder_un___en_quoted-printab?=
=?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p? bash-3.2$
**********
Bonne journée.
--
Michel VAUQUOIS - http://michelvauquois.fr
Avatar
Olivier Miakinen
Le 14/10/2019 à 15:32, M.V. a écrit :
Essaye de rajouter une ligne contenant « set -x » au début de la
fonction decode_word()

Ça donne ça ?
**********
set -x
if [ $(LANG=C expr "$1" : '=?[A-Za-z0-9_-]+?[BbQq]?[!->@-~]+?=$') = 0 ]
then
return 1;
fi
**********

Oui, parfait.
Réponse du Terminal :
**********
~/olivier.sh "=?UTF-8?Q?Ceci_est_une_tentative_d'encoder_un___en_quoted-printab?=
=?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?="
++ LANG=C
++ expr '=?UTF-8?Q?Ceci_est_une_tentative_d'''encoder_un___en_quoted-printab?=' :
'=?[A-Za-z0-9_-]+?[BbQq]?[!->@-~]+?=$'
+ '[' 0 = 0 ']'

C'est ce que je craignais. La syntaxe « expr chaîne : regexp » ne
fonctionne pas.
[...]
bash-3.2$

Et là, c'est bien ce qui est expliqué sur la page
<https://itnext.io/upgrading-bash-on-macos-7138bd1066ba>
Tu as un bash 3.2, de douze ans d'âge. C'est peut-être sympa pour un
whisky, mais pour un shell c'est un peu ancien.
Bon, je vais tenter une alternative en passant par sed. Je mets ça
au point dès que j'ai le temps, et je reviens.
--
Olivier Miakinen
1 2 3 4 5