Lors du changement de licence sur OneGeo Suite, il est important d’examiner la compatibilité des dépendances avec Affero GPL. Au vu des implications qui en découlent, est-il surtout possible de vérifier que nos dépendances aient toujours une licence conforme ?
nnnnLa compatibilité entre les licences
nnnnLa compatibilité de licences inclut deux éléments clé à prendre en compte :
nnnn- n
- Le projet en lui-même (ex : un module Python, une bibliothèque de fonctions, etc.) ; nnnn
- Un travail dérivé (ex : un logiciel complet comme FireFox). Les travaux dérivés d’un projet, quant à eux, peuvent être des modifications du code du projet ou des produits intégrant le projet. n
Une compatibilité des licences sera possible lorsque le travail dérivé possède une licence qui n’enfreint pas les règles de la licence du projet.
nnnnLes licences « copyleft » obligent à redistribuer les travaux dérivés sous la même licence (ou une compatible) pour protéger les libertés du code et de l’utilisateur. A contrario, les licences permissives autorisent le changement de licence, et il est également possible de faire un produit propriétaire, en intégrant des composants sous ce type de licence. Par exemple, Sony base son système d’exploitation propriétaire de la Playstation sur FreeBSD, qui est un logiciel libre sous licence FreeBSD.
nnnn
nDans ce schéma, le code en domaine public est intégrable dans un produit MIT, lui-même dans un produit sous licence BSD, lui-même dans un produit licence Apache 2.0, et ainsi de suite jusqu’à la licence Affero GPL 3.
nnnnDeux catégories supplémentaires sont introduites par ce schéma :
nnnn- n
- Weakly protective (faiblement protectrice) : elle implique qu’une modification du code doit être sous la même licence (donc rester libre). Néanmoins, l’intégration du projet peut se faire dans un produit sous une autre licence (même propriétaire). nnnn
- Network Protective (protectrice des utilisateurs réseau) : la licence GPL protège les utilisateurs de la machine. Dans le cadre d’applications client-serveur, la partie serveur protège l’utilisateur du serveur, donc l’administrateur système. Une conformité à la GPL existe dans le cas où l’administrateur système de OneGeo Suite a accès aux sources modifiées du produit, mais pas l’utilisateur de la partie client. Les licences Network Protective permet aussi de protéger la liberté des utilisateurs du client. n
Notez bien les versions des licences : par exemple la licence Apache 2.0 est compatible avec la licence LGPL, alors que la version 1.1 ne l’est pas.
nnnnPour vous aiguiller, voici quelques incompatibilités à souligner :
nnnn- n
- Apache 1.1 ou MPL 1.1 (Mozilla Public Licence) ne sont pas compatibles avec les licences GPL, alors qu’une clause explicite de compatibilité existe dans les versions 2.0 de ces mêmes licences ; nnnn
- CC-BY-3.0 empêche de changer la licence, donc impossible à changer en AGPL. La version 4.0 permet explicitement de changer la licence en GPL 3.0 et donc en AGPL 3.0 ; nnnn
- Licence originelle BSD : elle forçait à indiquer une notice de copyright dans la documentation du produit final, ce qui peut poser problème quand il y a de nombreux composants avec cette licence dans un produit. n
Vérifier la conformité
nnnnEn pratique, la conformité de licence peut se vérifier grâce au DevOps.
nnnnPour illustrer nos projets, essentiellement en Python et Javascript, nous vous présentons deux outils simples qui pourront vous aider. Dans ces exemples, nous nous en servirons en ligne de commande, afin de comparer les licences des dépendances avec une liste validée de licences.
nnnnVérification des licences en Python
nnnnL’outil « pylic » analyse tous les modules Python installés dans l’environnement virtuel et compare leurs licences avec une section du pyproject.toml. S’il trouve un module avec une licence non validée, il sort en émettant erreur que l’on pourra exploiter dans une CI.
nnnnCommençons par installer le programme :
nnnn$ pip install pylic nnnnEnsuite, nous indiquons à “pylic” les licences compatibles avec notre logiciel, en lui donnant une liste de licences compatibles AGPL 3.0, dans la section tool.pylic de notre pyproject.toml :
nnnn$ cat << EOF >> pyproject.toml n[tool.pylic] nsafe_licenses = [ n"Apache Software License", n"BSD License", n"BSD", n"MIT License", n"MIT", n"Mozilla Public License 2.0 (MPL 2.0)", n"GNU Library or Lesser General Public License (LGPL)", n"GNU Lesser General Public License v3 or later (LGPLv3+)", n "Python Software Foundation License", n"Historical Permission Notice and Disclaimer (HPND)" n ] nEOF nnnnVous remarquerez que ces licences ont parfois des noms très similaires. En effet, “pylic” s’appuie sur le nom déclaré par le mainteneur du module python (dans le setup.cfg/setup.py…) qui n’est pas normalisé. Nous devons déclarer comme « safe » les deux identifiants « MIT » et « MIT License », alors que nous aurions pu utiliser les identifiants de licence SPDX dans la configuration du module Python.
Revenons à “pylic” et lançons une vérification :
nnnn$ pylic check n✨ All licenses ok ✨ nnnnComment peut-on faire en cas de non-conformité ?
nnnnEn commentant la licence « Apache Software License » de pyproject.toml, nous obtenons ce message :
nnnn$ pylic check nFound unsafe licenses: n nltk (3.8.1): Apache Software License n phonenumbers (8.13.8): Apache Software License n importlib-metadata (6.1.0): Apache Software Licensen bleach (6.0.0): Apache Software License n cryptography (42.0.1): Apache Software License n regex (2023.12.25): Apache Software License n django-onegeo-suite (1.0.2): Apache Software License n requests (2.31.0): Apache Software License n packaging (23.2): Apache Software License n pyOpenSSL (24.0.0): Apache Software License n tzdata (2023.4): Apache Software License n elasticsearch (7.17.9): Apache Software License n async-timeout (4.0.3): Apache Software License n josepy (1.14.0): Apache Software License n django-onegeo-rproxy-mapstore2 (1.0.0b2): Apache Software License nnnnPlutôt simple, non ?
nnnnnnnn
Vérification des licences en Javascript
nnnnDe la même façon, on peut vérifier les licences des projets javascript avec license-checker. ilIl n’est toujours pas au courant des licences qui existent donc il faudra construire la liste à la main.
L’utilisation est plutôt simple :
nnnn$ npx license-checker --onlyAllow "CC-BY-4.0;ISC;Apache-2.0;BSD-3-Clause;Custom: https://github.com/tmcw/jsonlint;BSD-2-Clause;Unlicense;UNLICENSED;BSD;Public Domain;CC0-1.0;MPL-2.0" --production nnnnPackage « @fortawesome/fontawesome-common-types@0.2.36 » is licensed under « MIT » which is not permitted by the –onlyAllow flag. Exiting.
nnnnOn obtient des erreurs pour chaque licence non autorisée.
nnnnL’option « –onlyAllow » permet de lister les licences autorisées séparées par des point virgules « ; ». Tandis que l’option « –production » permet d’écarter les licences des modules de la section « devDependencies » du package.json.
nnnnPensez aussi à corriger la section « license » du package.json pour ne pas perturber l’outil :
nnnn "license": "AGPL-3.0-only", nnnnJe vous conseille aussi d’ajouter un script dans le package.json pour automatiser les vérifications :
nnnncat package.json n{ n[...] n "scripts": { n[...] "lint": "vue-cli-service lint", n "license-checker": "license-checker --onlyAllow \"MIT;CC-BY-4.0;ISC;Apache-2.0;BSD-3-Clause;Custom: https://github.com/tmcw/jsonlint;BSD-2-Clause;Unlicense;UNLICENSED;BSD;Public Domain;CC0-1.0;MPL-2.0\" --production"n }, nnnnOn peut ainsi lancer simplement :
nnnn$ npm run license-checker nnnnnnnn
Conclusion
nnnnIl existe probablement des outils plus sophistiqués pour vérifier la compatibilité des licences des bibliothèque externes utilisées par votre projet, notamment en utilisant la matrice de compatibilité des licences de l’OSADL : https://www.osadl.org/html/CompatMatrix.html
nnnnMais pour une utilisation légère et rapide dans une CI, ces deux outils feront l’affaire, en investissant néanmoins un peu de temps pour vérifier les nouvelles licences qui peuvent apparaître pendant la vie de votre projet.
nnnnSources :
nnnnhttps://janelia-flyem.github.io/licenses.html : image compatibilité
nnnnhttps://www.gnu.org/licenses/license-list.html : informations sur les compatibilités avec la GPL
nnnnhttps://www.apache.org/licenses/GPL-compatibility.html : compatibilité Apache 2.0 et GPL
nnnnhttps://medium.com/@iharmandeep/easily-check-licenses-of-your-npm-dependencies-in-your-ci-pipeline-9102150d6907 : utilisation de license-checker
nnnnnnnn
Rédacteur : Sébastien DA ROCHA
nnnnn


