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

2 3 4 5 6
Avatar
M.V.
Le 15 octobre 2019, le très estimable Gilbert OLIVIER s'est exprimé
en ces termes :
Que veux-tu dire par "je reforme moi-même une chaine" ?

Le retour chariot marque la fin du champ sauf si la ligne suivante
commence par une espace.

OK
Sinon, ce sont mes premiers tests avec la portable comme tu peux le
voir dans le User-Agent, et pour une vieille machine très réactif
(bon, j'ai remplacé le HDD par un SSD et ça joue beaucoup).

;-)
Bonne soirée.
--
Michel VAUQUOIS - http://michelvauquois.fr
Avatar
Olivier Miakinen
Le 14/10/2019 23:44, Joseph-B a écrit :
do shell script "~/olivier.sh " & quoted form of str

Ou alors tu peux le mettre dans un répertoire qui est listé dans
la variable PATH.
Pour voir sa valeur actuelle :
echo $PATH

Oui, bonne idée, je regarde ce quelle contient d'utilisable
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

^^^^^^^^^^^^^^
Il devrait donc trouver qprint. Si ce n'est pas le cas, c'est peut-être
que le PATH ne fait pas partie des variables d'environnement qui sont
« exportées » vers les scripts appelé.
Pour savoir s'il en fait partie :
env
Voire, pour le trouver directement s'il y est :
env | grep PATH
Si tu ne le vois pas, il faut ajouter un « export PATH » dans l'un
des scripts lancés au démarrage de la session ou du shell. Tu peux
d'ailleurs le faire systématiquement.
(aussi un chemin vers X11 et un autre vers WireShark, mais je sais
qu'AppleScript n'ira pas de lui même y regarder)
le seul répertoire "bin" qui ne soit pas verrouillé par le Système, même
en tant qu'admin, c'est /usr/local/bin
or AppleScript ne va pas y regarder non plus puisque qprint y est et
qu'on est obligé de lui donner explicitement le path (contrairement au
Terminal qui le voit)

Ah oui, j'aurais dû lire jusque là avant de commencer à répondre.
Moi je mets tous mes scripts persos dans un répertoire bin sous mon
home directory (c'est-à-dire ~/bin ou $HOME/bin),

Pas de dossier ~/bin sur mon Mac (ce qui aurait été une bonne idée) et

Il n'existe pas par défaut, il faut le créer par « mkdir bin »
je ne crois pas que le créer à la main lui donnera une quelconque valeur
aux yeux du Système du shell…

Sauf si tu as mis le code qui va bien dans ton .bashrc (ou .profile,
ou... ou... un truc qui se lance au démarrage de la session ou du
shell).
Bon je l'ai fait quand même et au prochain démarrage complet du Mac
j'irai voir à nouveau, mais pour l'instant il n'apparait pas dans le
$PATH même après relance du Terminal…
et j'ai ceci dans
mon .bashrc qui est lu au démarrage du shell bash :
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi


Voilà.
Et pour être sûr que le PATH est transmis, je te recommande même :
# set PATH so it includes user's private bin if it exists, and export it
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
export PATH
[...] Applescript va explorer /bin et ses sous-dossiers, mais c'est
verrouillé pour nous. (ou je ne sais pas comment contourner le blocage)

C'est quand même dommage d'être passé à du logiciel libre et de
tout bloquer par derrière. On dirait qu'Apple ne fait pas confiance
à l'intelligence de ses utilisateurs. :-(
[...]
C'est surtout Michel qui aura l'utilité de cet outil, pour ses tests de
MacCafé, mais je me suis bien fait plaisir à trifouiller un peu dans les
arcanes d'Unix et du Terminal.

Eh bien voilà qui répond à ta question de pourquoi j'ai fait tout ça :
pour me faire plaisir à trifouiller moi aussi ! En plus j'ai commencé
à apprendre des choses à propos de Mac OS X.
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 16/10/2019 00:25, Olivier Miakinen a écrit :
C'est surtout Michel qui aura l'utilité de cet outil, pour ses tests de
MacCafé, mais je me suis bien fait plaisir à trifouiller un peu dans les
arcanes d'Unix et du Terminal.

Eh bien voilà qui répond à ta question de pourquoi j'ai fait tout ça :
pour me faire plaisir à trifouiller moi aussi ! En plus j'ai commencé
à apprendre des choses à propos de Mac OS X.

Oups ! Pardon, c'est Michel qui me posait la question, je crois.
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 15/10/2019 07:58, M.V. a écrit :
C'est surtout Michel qui aura l'utilité de cet outil, pour ses tests de
MacCafé, mais je me suis bien fait plaisir à trifouiller un peu dans les
arcanes d'Unix et du Terminal.

Pas sûr d'en avoir besoin pour les tests de MacCafé mais moi aussi
j'ai pris bien du plaisir à participer à cet "agite-neurones"

Eh bien voilà, nous sommes au moins trois.
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 15/10/2019 16:05, M.V. a écrit :
[...] on se retrouve parfois
avec un sujet comportant plusieurs lignes comme celui-ci
<news: qnuof3$enp$ par exemple.
Comment règles-tu, toi, ce problème de transformation des 3 lignes en
une seule. Pour nous, en AppleScript, ça se fait aisément.

Pour le moment je l'ai réglé en passant les différents encoded-words
sur la même ligne, en paramètre de mon script.
Mais j'envisage de changer ce script pour qu'il fonctionne comme
un « filtre » (à la manière de qprint, base64 et iconv), c'est-à-dire
qu'il prenne les données sur stdin et les ressorte sur stdout.
Peut-être demain si j'ai le temps (je ne travaille pas demain mais
j'ai du bricolage à faire).
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 15/10/2019 16:31, Gilbert OLIVIER a écrit :
Pour le décodage je reforme moi même une chaine
sans saut de ligne que je décode ensuite.

Que veux-tu dire par "je reforme moi-même une chaine" ?

Le retour chariot marque la fin du champ sauf si la ligne suivante
commence par une espace. Donc quand je décompose le header en champ,
si la ligne suivante commence par une espace, je supprime le saut
ligne et l'espace (ça recolle tout le sujet en une seule chaine).

J'espère que tu ne fais pas ça ! En fait je suis à peu près sûr que
tu ne fais pas ça, sinon tu (enfin Mac Café) n'aurais pas pu décoder
les titres en MIME sur plusieurs lignes.
Ce qu'il faut faire -- et qui est sûrement ce que tu as fait -- c'est
supprimer le saut de ligne *mais pas l'espace*.
--
Olivier Miakinen
Avatar
josephb
Bonjour,
Olivier Miakinen <om+ s'étonna :
C'est quand même dommage d'être passé à du logiciel libre et de
tout bloquer par derrière. On dirait qu'Apple ne fait pas confiance
à l'intelligence de ses utilisateurs. :-(

Un utilisateur "intelligent" est une menace pour le business d'Apple.
Déjà du temps de l'Apple II, Wozniak qui pensait sa machine ouverte
(slots d'extension…) se heurtait à Jobs qui voulait une machine dont
Apple garderait la maîtrise des évolutions et les utilisateurs sous sa
dépendance.
Alors que l'Apple II commençait à être un vrai succès commercial, Jobs
l'a sciemment torpillé (et son descendant l'Apple III) pour réorienter
ses équipes vers un concept totalement propriétaire (certes
révolutionnaire pour l'époque) le Lisa, trop compliqué, trop cher, dont
l'avatar réussi cette fois a été le Macintosh et dans le même temps a
fermement poussé Wozniak à se soumettre ou se démettre, ce qu'il fit de
guerre lasse.
Dans l'éthique de Jobs, il n'y avait aucune honte, ou retenue à avoir, à
s'approprier ce qu'un tiers avait abandonné sur le domaine publique de
son plein gré.
Comment le Mac a "hérité" de BSD et Mach est une histoire qui mérite
d'être lue entre les lignes du récit officiel, mais j'arrête là parce
que ce n'est pas le lieu pour refaire l'icône à Sa Grandeur S. Jobs ; en
tous cas ce qu'on peut dire c'est que l'ADN d'Apple est la réplication à
l'infini de celui de son charismatique co-créateur.
--
J. B. sur Mac depuis 30 ans…
Avatar
M.V.
Ainsi parlait Olivier Miakinen le 15 octobre 2019 :
Eh bien voilà, nous sommes au moins trois.

;-)
D'autres questions me viennent : hormis les champs "Subject:",
"From:", "Reply to:" et "Organization:", j'espère ne pas me tromper
en disant qu'aucun autre champ ne peut être encodé ?
Et tout ces champs peuvent comporter plusieurs lignes ? Il n'y a pas
de restrictions ?
Bonne soirée.
--
Michel VAUQUOIS - http://michelvauquois.fr
Avatar
Gilbert OLIVIER
Le 15 octobre 2019, Olivier Miakinen a écrit:
Le 15/10/2019 16:31, Gilbert OLIVIER a écrit :
Pour le décodage je reforme moi même une chaine
sans saut de ligne que je décode ensuite.

Que veux-tu dire par "je reforme moi-même une chaine" ?

Le retour chariot marque la fin du champ sauf si la ligne suivante
commence par une espace. Donc quand je décompose le header en champ,
si la ligne suivante commence par une espace, je supprime le saut
ligne et l'espace (ça recolle tout le sujet en une seule chaine).

J'espère que tu ne fais pas ça ! En fait je suis à peu près sûr que
tu ne fais pas ça, sinon tu (enfin Mac Café) n'aurais pas pu décoder
les titres en MIME sur plusieurs lignes.

heu.. oui, tout à fait, d'ailleur c'est comme ça dans MacCafé, Je
pensai à autre chose.
Merci d'avoir corrigé.
Ce qu'il faut faire -- et qui est sûrement ce que tu as fait -- c'est
supprimer le saut de ligne *mais pas l'espace*.

Ce que j'ai trouvé et qui était bien interprété par MacSoup et à
priori n'avait pas fait "crier" le serveur, et qui a bien sur créé
quelques problème dans MacCafé avant que je le trouve, c'est: saut de
ligne Tab. Si me je souviens bien, c'était dans le champs références.

--
Gilbert
Avatar
Olivier Miakinen
Le 16/10/2019 15:11, Joseph-B a écrit :
Un utilisateur "intelligent" est une menace pour le business d'Apple.
[suivi de tout un pan de l'histoire des machines Apple]

Ça fait peur...
--
Olivier Miakinen
2 3 4 5 6