17.14 MIME
17.14.1 Détection des type MIME
Lors de l'insertion d'un fichier dans le vault, son type MIME est détecté et
stocké en base de données aux côtés de son identifiant dans le vault (vid
).
On distingue deux notions sous le terme de type MIME :
- type MIME textuel (e.g.
OpenDocument Text
) : description du type du fichier dans un format "humain", - type MIME système (e.g.
application/vnd.oasis.opendocument.text
) : type MIME du fichier au format "machine" (tel que défini par le registre IANA par exemple).
Ce chapitre détaille les fonctions de détection du type MIME des fichiers.
17.14.1.1 Type MIME textuel (getTextMimeFile()
)
Le type MIME textuel est obtenu via l'utilisation de la fonction
getTextMimeFile()
qui prend les arguments suivants :
- (string)
filePath
- Le chemin d'accès du fichier dont on souhaite obtenir le type MIME
textuel (e.g.
/tmp/123DF423/rapport-FZ447BV.doc
). - (string)
fileName
(optionnel) -
Le nom du fichier (e.g.
rapport.doc
).Par défaut, le nom est vide.
La détection se base en premier sur le nom du fichier (voir
Paramétrage de la détection par le nom du fichier ci-
dessous). Si le type MIME ne peut pas être déduit à partir du nom du fichier,
alors la détection se base sur le contenu du fichier (via la commande système
file
).
17.14.1.2 Type MIME système (getSysMimeFile()
)
Le type MIME système est obtenu via l'utilisation de la fonction
getSysMimeFile()
qui prend les arguments suivants :
- (string)
filePath
- Le chemin d'accès au fichier dont on souhaite obtenir le type MIME
textuel (e.g.
/tmp/123DF423/rapport-FZ447BV.doc
). - (string)
fileName
(optionnel) -
Le nom du fichier (e.g.
rapport.doc
).Par défaut, le nom est vide.
La détection se base en premier sur le nom du fichier (voir
Paramétrage de la détection par le nom du fichier ci-
dessous). Si le type MIME ne peut pas être déduit à partir du nom du fichier,
alors la détection se base sur le contenu du fichier (via la commande système
file
).
17.14.1.3 Paramétrage de la détection par le nom du fichier
La détection du type MIME textuel et du type MIME système est paramétrable via des règles appliquées sur l'extension du nom du fichier.
Ces règles sont décrites au format XML dans le fichier config/user-mime.conf
.
Un fichier d'exemple est fournit par défaut dans config/user-mime.conf.sample
.
Exemple de définition des types MIME textuel et système pour les fichiers
d'extension .foo
et .bar
:
<?xml version="1.0" encoding="utf-8"?> <mimes> <mime ext="foo" sys="application/foo" text="Foo file" /> <mime ext="bar" sys="application/bar" text="Bar file" /> </mimes>
Chaque règle est décrite à l'aide d'un élément <mime/>
comportant l'extension
(sans le point de l'extension) sur laquelle elle s'applique (attribut ext
) et
le type MIME textuel et système correspond qui est retourné (attribut text
et
sys
).
Les règles sont évaluées dans l'ordre d'écriture dans le fichier XML. La détection s'arrête à la première règle qui correspond à l'extension du fichier.
Les règles du fichier config/user-mime.conf
sont évaluées en
priorités par rapport au jeu de règles fournit par défaut par Dynacase
(consultable dans le fichier config/mime.conf
).
17.14.2 Contrôle des types MIME servis inline
Lors de l'utilisation des fonctions Http_Download()
et Http_DownloadFile()
,
il est possible de demander que le téléchargement soit fait en mode
attachment
ou en mode inline
.
Le mode attachment
permet d'indiquer au navigateur que le contenu doit être
sauvegardé dans une fichier. Ce mode déclenche l'ouverture d'une boite de
dialogue par le navigateur afin que l'utilisateur choisisse le nom du fichier
dans lequel sera enregistré le contenu.
Le mode inline
permet d'indiquer au navigateur qu'il peut interpréter et
rendre le contenu directement s'il sait le gérer (e.g. images, HTML, etc.). Si
le navigateur ne sait pas gérer le contenu, alors le fichier sera enregistré
comme avec le mode attachment
.
Cependant, l'utilisation du mode inline
peut poser des problèmes de sécurité
dans le cas ou la donnée ou le fichier servit provient d'un utilisateur tiers.
Afin de limiter ces problèmes de sécurité, certains type MIME sont donc
interdits d'êtres servis en mode inline
lors de l'utilisation des fonctions
Http_Download()
et Http_DownloadFile()
, même lorsque le mode inline
est
explicitement demandé.
La configuration des types MIME autorisés/interdits en inline
est décrite
dans la section Paramétrage des téléchargements inline
ci-dessous.
17.14.2.1 Paramétrage des téléchargements inline
Afin de réduire le risque d'exécution de contenus malveillants qui pourraient être contenus dans des fichiers, certains type MIME de fichiers ne sont pas autorisés à être servis en mode « inline », et sont donc forcés en mode « attachment » afin que le navigateur présente une boite de dialogue pour sauver le fichiers.
Dynacase fournit par défaut une liste de type MIME autorisés/interdits a être
servis en inline dans le fichier de configuration statique
config/file-mime.xml
.
Pour modifier la liste de ces types MIME autorisés/interdits, il faut créer un
fichier config/file-mime-user.xml
avec les règles, pour un type
donné, à
remplacer ou à ajouter par rapport au fichier statique par défaut
config/file-mime.xml
.
Exemple de fichier config/file-mime-user.xml
:
<?xml version="1.0" encoding="utf-8"?> <rules> <inline> <deny type="text/html" comment="HTML" /> <deny type="application/xhtml+xml" comment="XHTML" /> <deny type="image/svg" comment="SVG" /> <deny type="image/svg+xml" comment="SVG" /> <deny type="application/hta" comment="Microsoft HTML Application" /> <deny type="application/x-xpinstall" comment="Mozilla XPI extensions" /> <deny type="application/vnd.mozilla.xul+xml" comment="Mozilla XUL" /> <deny type="application/x-shockwave-flash" comment="Adobe Flash" /> <allow type="*/*" /> </inline> </rule>
Les types MIME autorisés ou interdits à être servis en « inline » sont décrit à
l'aide d'un élément <allow />
(autoriser) ou <deny />
(interdire) avec le
type MIME correspondant déclaré dans la propriété type
.
La propriété type
doit être de la forme suivante :
-
[type] . "/" . [subtype]
: pour cibler un type et son subtype. Ex. :application/foo
; -
[type] . "/*"
: pour ne cibler d'un type (en acceptant n'importe quel subtype). Ex.application/*
; -
"*/*"
: pour cibler n'importe quel type et subtype. Ex.*/*
.
Lees règles sont évalués par ordre décroissant de spécificité du type MIME et l'évaluation s'arrête au premier type MIME qui correspond.
Ordre de spécificité de type
:
* "xxx/xxx" : évalué en premier ;
* "xxx/" : évalué en second ;
* "/*" : évalué en derner.