Salut les agrumes !
Je viens ici vous présenter une nouvelle bibliothèque Java (en fait compatible avec n’importe quel langage qui utilise la JVM, normalement) : confusable-homoglyphs.
Quel est donc le but de cette bibliothèque ?
Les humains utilisent divers systèmes d’écriture, et ce qui devait arriver, arriva : il y a des caractères qui se ressemblent (voire qui sont graphiquement identiques, selon la police d’écriture) mais qui sont différents.
Comme je le décrivais dans ce tuto, ça peut avoir des conséquences fâcheuses :
- L’utilisateur
ΑlaskaJazz
(le premier Α est un alpha majuscule grec) peut se faire passer pour l’utilisateurAlaskaJazz
(uniquement des lettres latines) - On peut vous inciter à vous connecter sur
www.microsоft.com
ouwww.faϲebook.com
au lieu dewww.microsoft.com
ouwww.facebook.com
Unicode fournit des listes de caractères qui prêtent à confusion, mais difficilement utilisables en l’état parce que c’est des fichiers textes, qui plus est hébergés sur un serveur à la stabilité et à l’accès très relatifs.
Cette bibliothèque permet de gérer ces cas en détectant et donnant des informations sur les caractères qui présentent des risques de confusion.
C’est en réalité une réimplémentation en Java du projet d’origine en Python, par @cepus.
À propos du projet
Les intentions de votre renard préféré
En réalité je n’ai pas besoin de cette lib, au-delà du fait que je trouve qu’elle manque à Java. Je voulais aussi et surtout :
- Connaitre la difficulté à porter une lib de Python à Java
- Voir ce que c’est de créer un projet, seul, de A à Z et complet (avec documentation et tout)
- Essayer de déployer quelque chose sur Maven (en tant que fournisseur)
Les contraintes
- Licence libre (Apache)
- Java 8, pour garder une bonne compatibilité avec les projets actuels et les différents langages qui utilisent la JVM
- Une API aussi proche de possible que l’originale
- Disponible sur Maven Central, pour être utilisable comme n’importe quelle lib Java
- Avec une doc complète
- Avec une couverture de tests correcte
- Avec de l’intégration continue
Ce que j’ai appris du projet
Il y aura un billet complet et dédié à ce sujet. Ce qu’on peut en retenir en bref, c’est que le code c’est que 20 % du projet, que Java gère Unicode de façon assez étrange, et que l’écosystème Java (pousser un truc sur Maven Central) est une vraie catastrophe ergonomique (et GPG n’y est pas pour rien).
Alors, ce projet ?
On le trouve sur Maven Central. Le développement est basé sur Github.
Ça s’utilise ainsi :
Déclaration de la dépendance (Maven ou Gradle) :
<dependency>
<groupId>fr.spacefox</groupId>
<artifactId>confusable-homoglyphs</artifactId>
<version>1.0.1</version>
</dependency>
compile group: 'fr.spacefox', name: 'confusable-homoglyphs', version: '1.0.1'
On initialise une classe :
Categories categories = Categories.fromInternal();
Confusables confusables = Confusables.fromInternal();
// ou
Categories categories = Categories.fromJson("/full/path/to/categories.json");
Confusables confusables = fromJsons("/full/path/to/categories.json", "/full/path/to/confusables.json");
// (Confusables utilise Categories en interne).
Et on utilise les objets créés. Cette création est relativement longue par rapport à l’utilisation, il vaut mieux garder ces objets vivants entre deux appels.
Et maintenant ?
N’hésitez pas à utiliser cette bibliothèque, à créer des tickets voire des pull request, ou encore à me demander pourquoi tel ou tel choix.
Il y aura un jour une nouvelle version (v2 pour cause de semver) qui modifiera certaines API en s’éloignant de l’original.
À vous les studios !