<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Blog</title><link href="https://yaal.coop/blog/" rel="alternate"/><link href="https://yaal.coop/blog/feeds/all.atom.xml" rel="self"/><id>https://yaal.coop/blog/</id><updated>2026-03-20T00:00:00+01:00</updated><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant l'hiver 2026</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-hiver-2026" rel="alternate"/><published>2026-03-20T00:00:00+01:00</published><updated>2026-03-20T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2026-03-20:/blog/dernieres-contributions-logiciels-libres-hiver-2026</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant l'hiver 2026&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Mécénat&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; pour son travail sur &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, un chouette framework CSS que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; pour son travail sur &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, une bibliothèque python d'authentification que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Contributions&lt;/h1&gt;
&lt;h2&gt;Il y a bien longtemps dans Python&lt;/h2&gt;
&lt;p&gt;Une &lt;a href="https://github.com/python/cpython/pull/4770"&gt;Pull Request&lt;/a&gt; à &lt;a href="https://www.python.org/"&gt;cpython&lt;/a&gt; ajoutant un gestionnaire de contexte à &lt;a href="https://docs.python.org/3/library/mailbox.html#mailbox.Mailbox"&gt;Mailbox&lt;/a&gt; a été intégrée après une longue période d'inactivité. Elle datait de 2017, ce qui en faisait la 27ième plus vieille PR ouverte sur cpython.&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://pygments.org/"&gt;Pygments&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque Python de coloration syntaxique&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pygments/pygments/pull/3052"&gt;Amélioration de l'analyse des architectures dans le lexeur 'Debian control'&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://debian.org/"&gt;Documentation Debian&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Document de référence pour les développeurs Debian : &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1128883"&gt;Remplacement du format de fichier sources.list par debian.sources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Notes de publication : &lt;a href="https://salsa.debian.org/ddp-team/release-notes/-/merge_requests/340"&gt;remplacements des chemins de signatures de paquets de &lt;em&gt;.gpg à &lt;/em&gt;.pgp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/authlib/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;La bibliothèque Python ultime pour construire des clients et serveurs OAuth et OpenID Connect. JWS, JWE, JWK, JWA, JWT inclus.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/850"&gt;Support de Python 3.10 à 3.14&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/853"&gt;Permettre la composition de AuthorizationServerMetadata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/854"&gt;Correction du comportement de &lt;code&gt;expires_at&lt;/code&gt; quand sa valeur est 0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/855"&gt;Rendre les parenthèses de require_oauth optionnelles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/864"&gt;Implémentation de la contre-mesure de rétrogradation PKCE rfc9700&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/865"&gt;Accepter l'URL de l'émetteur comme audience valide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;Canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Logiciel léger de gestion des identités et des autorisations&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/322"&gt;Correction de l'upload d'avatar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/323"&gt;Correction de l'autofocus des champs HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/324"&gt;Ajout d'une page « authentification » dans la section profil utilisateur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/325"&gt;Propriétaires de clients&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/327"&gt;Support CORS pour les endpoints OIDC et SCIM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/329"&gt;Correction des problèmes CSP de Fomantic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/330"&gt;Forcer auth-playground à utiliser le domaine client.localhost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/332"&gt;Correction de la réinitialisation des champs par HTMX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/333"&gt;Corrections de sécurité mineures et recommandations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/corydolphin/flask-cors"&gt;flask-cors&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Support du partage de ressources entre origines (CORS) pour Flask&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/corydolphin/flask-cors/pull/401"&gt;Support des origines &lt;em&gt;callable&lt;/em&gt; pour la validation dynamique&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-cli"&gt;scim2-cli&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;CLI de développement d'applications SCIM&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-cli/pull/23"&gt;Implémentation d'un environnement tox pyinstaller&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-client"&gt;scim2-client&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Construisez pythoniquement des requêtes SCIM et analysez les réponses SCIM&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/36"&gt;Rendre le type de contenu optionnel pour les statuts 204&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/38"&gt;Les exceptions SCIM fournissent des objets d'erreur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/40"&gt;Utilisation des classes d'exception de scim2-models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/44"&gt;Correction du typage du client asynchrone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Sérialisation et validation de ressources SCIM avec Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/115"&gt;Demander un attribut donné inclut ses sous-attributs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/117"&gt;Refactorisation de la gestion des chemins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/118"&gt;Les schémas de ressources et d'extensions doivent être définis dans la classvar &lt;code&gt;__schema__&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/119"&gt;Refonte des erreurs et exceptions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/120"&gt;Auto-exclusion de l'attribut primaire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/121"&gt;Refonte des références&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/122"&gt;Implémentation de SCIMException.from_error&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/126"&gt;Correction de &lt;code&gt;model_json_schema&lt;/code&gt; pour Reference et Path&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/129"&gt;Correction des errata RFC6743&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-server"&gt;scim2-server&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Prototype léger de serveur SCIM2&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/16"&gt;Utilisation des exceptions natives de scim2-models&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-tester"&gt;scim2-tester&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Vérificateur de conformité aux RFC SCIM&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/45"&gt;Utilisation de la gestion native des chemins de scim2-models&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/Pylons/webtest"&gt;webtest&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Enveloppe n'importe quelle application WSGI et facilite l'envoi de requêtes de test à cette application, sans démarrer de serveur HTTP.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Pylons/webtest/pull/275"&gt;Migration du projet vers uv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pallets-eco/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Une bibliothèque flexible de validation et de rendu de formulaires pour Python.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/883"&gt;Support des versions de Python de 3.10 à 3.14&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Winter 2026 FOSS contributions by the Yaal Coop team</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-hiver-2026" rel="alternate"/><published>2026-03-20T00:00:00+01:00</published><updated>2026-03-20T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2026-03-20:/blog/en/dernieres-contributions-logiciels-libres-hiver-2026</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during winter 2026.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Sponsoring&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; for his work on &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, a nice CSS framework we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI is used on other tools we rely on, like &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; for his work on &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, a python authentication library we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Contributions&lt;/h1&gt;
&lt;h2&gt;A long time ago in Python&lt;/h2&gt;
&lt;p&gt;A &lt;a href="https://github.com/python/cpython/pull/4770"&gt;Pull Request&lt;/a&gt; to &lt;a href="https://www.python.org/"&gt;cpython&lt;/a&gt; adding a context manager to &lt;a href="https://docs.python.org/3/library/mailbox.html#mailbox.Mailbox"&gt;Mailbox&lt;/a&gt; has been merged after a long period of inactivity. It was created in 2017 and was the 27th oldest opened PR for cpython.&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://pygments.org/"&gt;Pygments&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Pygments is a generic syntax highlighter written in Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pygments/pygments/pull/3052"&gt;Improve architecture parsing in 'Debian control' lexer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://debian.org/"&gt;Debian Documentation&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Reference for Debian developers: &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1128883"&gt;Replace sources.list by debian.sources file format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Release notes: &lt;a href="https://salsa.debian.org/ddp-team/release-notes/-/merge_requests/340"&gt;Replace .gpg paths for package signatures by .pgp ones&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/authlib/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The ultimate Python library in building OAuth, OpenID Connect clients and servers. JWS, JWE, JWK, JWA, JWT included.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/850"&gt;Support from Python 3.10 to 3.14&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/853"&gt;Allow composition of AuthorizationServerMetadata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/854"&gt;Fix &lt;code&gt;expires_at&lt;/code&gt; behavior when its value is 0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/855"&gt;Make require_oauth parenthesis optional&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/864"&gt;Implement rfc9700 PKCE downgrade countermeasure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/865"&gt;Accept the issuer URL as a valid audience&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;Canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lightweight identity and authorization management software&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/322"&gt;Fix avatar upload&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/323"&gt;Fix HTML field autofocus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/324"&gt;Add an 'authentication' page in user profile section&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/325"&gt;Client owners&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/327"&gt;CORS support for OIDC and SCIM endpoints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/329"&gt;Fix Fomantic CSP issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/330"&gt;Force auth-playground to use the client.localhost domain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/332"&gt;Fix HTMX resetting inputs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/333"&gt;Minor security fixes and recommandations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/corydolphin/flask-cors"&gt;flask-cors&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;*Cross Origin Resource Sharing ( CORS ) support for Flask *&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/corydolphin/flask-cors/pull/401"&gt;Support callable origins for dynamic validation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-cli"&gt;scim2-cli&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM application development CLI&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-cli/pull/23"&gt;Implement a pyinstaller tox env&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-client"&gt;scim2-client&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Pythonically build SCIM requests and parse SCIM responses&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/36"&gt;Make content type optional for 204 statuses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/38"&gt;SCIM Exceptions provide errors objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/40"&gt;Use scim2-models exception classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/44"&gt;Fix async client typing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM resources serialization and validation with Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/115"&gt;Requesting a given attribute includes its sub-attributes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/117"&gt;Refactor path management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/118"&gt;Resource and extensions schemas must be defined in the &lt;code&gt;__schema__&lt;/code&gt; classvar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/119"&gt;Errors and exceptions overhaul&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/120"&gt;Primary attribute auto-exclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/121"&gt;Reference overhaul&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/122"&gt;Implement SCIMException.from_error&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/126"&gt;Fix &lt;code&gt;model_json_schema&lt;/code&gt; for Reference and Path&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/129"&gt;Fix RFC6743 erratas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-server"&gt;scim2-server&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lightweight SCIM2 server prototype&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/16"&gt;Use scim2-models native exceptions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-tester"&gt;scim2-tester&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM RFCs server compliance checker&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/45"&gt;Use scim2-models native path management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/Pylons/webtest"&gt;webtest&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Wraps any WSGI application and makes it easy to send test requests to that application, without starting up an HTTP server.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Pylons/webtest/pull/275"&gt;Migrate the project to uv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pallets-eco/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A flexible forms validation and rendering library for Python.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/883"&gt;Support Python versions from 3.10 to 3.14&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant l'automne 2025</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-automne-2025" rel="alternate"/><published>2025-12-21T00:00:00+01:00</published><updated>2025-12-21T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-12-21:/blog/dernieres-contributions-logiciels-libres-automne-2025</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant l'automne 2025.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Mécénat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; pour son travail sur &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, un chouette framework CSS que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; pour son travail sur &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, une bibliothèque python d'authentification que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://libretic.fr/"&gt;Libretic&lt;/a&gt; organise une levée de fonds pour financer la campagne de &lt;a href="https://www.demailnagement.net/"&gt;DéMAILnagement&lt;/a&gt; initiée par le collectif des &lt;a href="https://www.chatons.org/"&gt;Chatons&lt;/a&gt;. L'objectif de cette campagne est de fournir des solutions de contournement des géants du web.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/jnavila/git-manpages-l10n"&gt;git-manpages-l10n&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Traductions de la documentation de GIT&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Correction de &lt;a href="https://github.com/jnavila/git-manpages-l10n/pull/154"&gt;traductions manquantes concernant des noms de branche&lt;/a&gt; et de &lt;a href="https://github.com/jnavila/git-manpages-l10n/pull/152"&gt;coquilles dans des traductions de noms de branche&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ajout de traductions manquantes pour git-switch : &lt;a href="https://github.com/jnavila/git-manpages-l10n/pull/154"&gt;1&lt;/a&gt; et &lt;a href="https://github.com/jnavila/git-manpages-l10n/pull/162"&gt;2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/authlib/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;La bibliothèque Python ultime pour construire des clients et serveurs OAuth et OpenID Connect. Inclut JWS, JWE, JWK, JWA, JWT.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/843"&gt;La métadonnée client &lt;code&gt;id_token_signed_response_alg&lt;/code&gt; prend le pas sur &lt;code&gt;get_jwt_config&lt;/code&gt; du serveur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/844"&gt;&lt;code&gt;get_jwt_config&lt;/code&gt; prend un paramètre &lt;code&gt;client&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/joke2k/faker"&gt;faker&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Faker est un paquet Python qui génère des données fictives.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/joke2k/faker/pull/2279"&gt;Implémentation d'UniqueProxy localisé&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf"&gt;flask-wtf&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Intégration simple de Flask et WTForms.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/648"&gt;Support de Python 3.14&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/649"&gt;Migration du projet vers uv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/authlib/joserfc"&gt;joserfc&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Implémentations des RFC JOSE en Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/79"&gt;Le paramètre &lt;code&gt;names&lt;/code&gt; de &lt;code&gt;filter_algorithms&lt;/code&gt; vaut par défaut tous les algorithmes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/80"&gt;&lt;code&gt;check_key&lt;/code&gt; vérifie la compatibilité de la courbe avec EdDSA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/81"&gt;Support des objets KeySet pour &lt;code&gt;filter_algorithms&lt;/code&gt; et &lt;code&gt;guess_alg&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/83"&gt;Le paramètre &lt;code&gt;algorithm&lt;/code&gt; de &lt;code&gt;pick_random_key&lt;/code&gt; est optionnel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/84"&gt;Ajout de mypy à pre-commit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/felix-martel/pydanclick"&gt;pydanclick&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Ajoute des options click à partir d'un modèle Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/felix-martel/pydanclick/pull/55"&gt;Résolution des alias de validation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export"&gt;pydantic-settings-export&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Exportez facilement vos paramètres Pydantic vers de la documentation&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export/pull/46"&gt;Fin du support de Python 3.9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export/pull/47"&gt;Générateur Toml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export/pull/49"&gt;Expansion des paramètres imbriqués union/optionnels en variables d'environnement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export/pull/50"&gt;Mise en place des workflows GHA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export/pull/51"&gt;Export des instances de paramètres&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export/pull/53"&gt;Tests unitaires pour les générateurs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-client"&gt;scim2-client&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Construisez des requêtes SCIM et analysez des réponses SCIM de manière pythonique&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/33"&gt;Ajout du support de Python 3.14 et fin du support de Python 3.9&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Sérialisation et validation de ressources SCIM avec Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/112"&gt;Ajout du support de Python 3.14 et fin du support de Python 3.9&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-tester"&gt;scim2-tester&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Vérificateur de conformité aux RFC SCIM pour serveurs&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/43"&gt;Ajout du support de Python 3.14&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/bebleo/smtpdfix"&gt;smtpdfix&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Un serveur SMTP utilisable comme fixture pytest, implémentant le chiffrement et l'authentification.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bebleo/smtpdfix/pull/448"&gt;Accélération des connexions SSL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot"&gt;sphinxcontrib-screenshot&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/76"&gt;Implémentation du paramètre &lt;code&gt;:status-code:&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/78"&gt;Mode sombre automatique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/80"&gt;Support de Python 3.14&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/88"&gt;Personnalisation du timeout&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;Canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Logiciel léger de gestion d'identité et d'autorisation&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/297"&gt;Configuration d'hypercorn via variables d'environnement et options CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/298"&gt;Les jetons d'enregistrement de client OIDC sont des JWT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/301"&gt;Documentation des recommandations ANSSI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/302"&gt;Tests unitaires PostgreSQL et corrections de bugs diverses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/303"&gt;Implémentation du support OIDC du paramètre &lt;code&gt;ui_locales&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/304"&gt;Bouton de visibilité du mot de passe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/305"&gt;Correction de l'implémentation de ProxyFix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/306"&gt;Implémentation du multi-compte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/307"&gt;Implémentation du claim AMR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/308"&gt;Implémentation du support WebAuthn/Fido2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/309"&gt;Support des sessions côté serveur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/310"&gt;Implémentation de la protection par Captcha&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/311"&gt;Affichage de tous les messages flash sous la section d'en-tête&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/312"&gt;Inclusion des données Babel manquantes dans le binaire pyinstaller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/313"&gt;Support de Python 3.14&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/314"&gt;Suite de tests d'intégration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/315"&gt;La signature du jeton ID sélectionne une clé compatible avec &lt;code&gt;id_token_signed_response_alg&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/317"&gt;Les claims d'algorithmes de signature OIDC discovery sont calculés dynamiquement à partir des clés serveur&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Autumn 2025 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-automne-2025" rel="alternate"/><published>2025-12-21T00:00:00+01:00</published><updated>2025-12-21T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-12-21:/blog/en/dernieres-contributions-logiciels-libres-automne-2025</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during autumn 2025.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Sponsoring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; for his work on &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, a nice CSS framework we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI is used on other tools we rely on, like &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; for his work on &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, a python authentication library we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://libretic.fr/"&gt;Libretic&lt;/a&gt; is organizing a fundraising campaign to finance the &lt;a href="https://www.demailnagement.net/"&gt;DéMAILnagement&lt;/a&gt; campaign initiated by the &lt;a href="https://www.chatons.org/"&gt;Chatons&lt;/a&gt; collective. The goal of this campaign is to provide workarounds for the web giants.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/jnavila/git-manpages-l10n"&gt;git-manpages-l10n&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;GIT Documentation Translations&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix &lt;a href="https://github.com/jnavila/git-manpages-l10n/pull/154"&gt;missing branch name translations&lt;/a&gt; and &lt;a href="https://github.com/jnavila/git-manpages-l10n/pull/152"&gt;spellcheck branch name translations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add missing translations for git-switch: &lt;a href="https://github.com/jnavila/git-manpages-l10n/pull/154"&gt;1&lt;/a&gt; et &lt;a href="https://github.com/jnavila/git-manpages-l10n/pull/162"&gt;2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/authlib/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The ultimate Python library in building OAuth, OpenID Connect clients and servers. JWS, JWE, JWK, JWA, JWT included.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/843"&gt;Client &lt;code&gt;id_token_signed_response_alg&lt;/code&gt; metadata takes precedence over server &lt;code&gt;get_jwt_config&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/844"&gt;&lt;code&gt;get_jwt_config&lt;/code&gt; takes a &lt;code&gt;client&lt;/code&gt; parameter.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/joke2k/faker"&gt;faker&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Faker is a Python package that generates fake data for you.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/joke2k/faker/pull/2279"&gt;Implement localized UniqueProxy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf"&gt;flask-wtf&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/648"&gt;Support for Python 3.14&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/649"&gt;Migrate the project to uv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/authlib/joserfc"&gt;joserfc&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Implementations of JOSE RFCs in Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/79"&gt;&lt;code&gt;filter_algorithms&lt;/code&gt; names parameter default to all algs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/80"&gt;check_key checks the curve compatibility with EdDSA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/81"&gt;KeySet objects support for &lt;code&gt;filter_algorithms&lt;/code&gt; and &lt;code&gt;guess_alg&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/83"&gt;&lt;code&gt;pick_random_key&lt;/code&gt; &lt;code&gt;algorithm&lt;/code&gt; parameter is optional&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/84"&gt;add mypy to pre-commit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/felix-martel/pydanclick"&gt;pydanclick&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Add click options from a Pydantic model&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/felix-martel/pydanclick/pull/55"&gt;Resolve validation aliases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export"&gt;pydantic-settings-export&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Export your Pydantic settings to documentation with ease!&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export/pull/46"&gt;Stop support for Python 3.9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export/pull/47"&gt;Toml generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export/pull/49"&gt;Expand union/optional nested settings to environment variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export/pull/50"&gt;Setup GHA workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export/pull/51"&gt;Export settings instances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jag-k/pydantic-settings-export/pull/53"&gt;Unit tests for the generators&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-client"&gt;scim2-client&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Pythonically build SCIM requests and parse SCIM responses&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/33"&gt;Add support for Python 3.14 and remove support for Python 3.9&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM resources serialization and validation with Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/112"&gt;Add support for Python 3.14 and remove support for Python 3.9&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-tester"&gt;scim2-tester&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM RFCs server compliance checker&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/43"&gt;Add support for Python 3.14&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/bebleo/smtpdfix"&gt;smtpdfix&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A SMTP server for use as a pytest fixture that implements encryption and authentication.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bebleo/smtpdfix/pull/448"&gt;Speed-up ssl connections&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot"&gt;sphinxcontrib-screenshot&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/76"&gt;Implement :status-code: parameter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/78"&gt;Automatic dark mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/80"&gt;Python 3.14 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/88"&gt;Timeout customization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;Canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lightweight identity and authorization management software&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/297"&gt;Configure hypercorn with environment vars and CLI options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/298"&gt;OIDC client registration tokens are JWTs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/301"&gt;Document ANSSI recommandations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/302"&gt;PostgreSQL unittest and various bugfixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/303"&gt;Implement OIDC ui_locales support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/304"&gt;Password visibility toggle button&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/305"&gt;Fix ProxyFix implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/306"&gt;Implement multi account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/307"&gt;Implement AMR claim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/308"&gt;Implement WebAuthn/Fido2 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/309"&gt;Server-side sessions support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/310"&gt;Implement captcha protection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/311"&gt;Display all the flash messages under the header section&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/312"&gt;Include missing Babel data in the pyinstaller binary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/313"&gt;Python 3.14 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/314"&gt;Integration test suite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/315"&gt;ID token signing selects a key compatible with id_token_signed_response_alg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/317"&gt;OIDC discovery signing algorithm claims are dynamically computed from server keys&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Canaille passe en version bêta</title><link href="https://yaal.coop/blog/canaille-beta" rel="alternate"/><published>2025-11-13T00:00:00+01:00</published><updated>2025-11-13T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-11-13:/blog/canaille-beta</id><summary type="html">&lt;p&gt;Après plusieurs années de développement, Canaille passe en version bêta.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Nos derniers travaux sur Canaille financés par la &lt;a href="https://nlnet.nl"&gt;fondation NLNet&lt;/a&gt; nous amènent à sortir une version bêta. Faisons le point.&lt;/p&gt;
&lt;h1&gt;Derniers travaux&lt;/h1&gt;
&lt;h2&gt;Gestionnaire de tâches&lt;/h2&gt;
&lt;p&gt;Nous avons implémenté un gestionnaire de tâches qui permet à Canaille d'effectuer les tâches longues de manière asynchrone.
C'est utilisé notamment pour propager les requêtes &lt;a href="https://scim.libre.sh"&gt;SCIM&lt;/a&gt; ou les envois de mail.
L'implémentation utilise &lt;a href="https://dramatiq.io"&gt;dramatiq&lt;/a&gt;, et nous avons publié le paquet &lt;a href="https://codeberg.org/yaal/dramatiq-eager-broker"&gt;dramatiq-eager-broker&lt;/a&gt; qui permet de conserver un comportement synchrone dans la suite de tests, et dans le cas où le gestionnaire de tâches ne serait pas configuré.&lt;/p&gt;
&lt;h2&gt;Certification OpenID Connect&lt;/h2&gt;
&lt;p&gt;&lt;a href="canaille-oidc-certification"&gt;Nous vous en parlions récemment&lt;/a&gt;, Canaille a obtenu au mois de septembre dernier la certification de la fondation OpenID Connect.
Cela garanti que Canaille a un comportement conforme pour la plupart des opérations OpenID Connect courantes.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://openid.net/developers/certified-openid-connect-implementations/"&gt;&lt;img alt="Canaille OIDC certification" src="/media/blog/articles/canaille-oidc-certification.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Le processus de certification a révélé beaucoup d'erreurs d'interprétation, souvent mineures mais parfois importantes.
Nous avons corrigé la plupart des problèmes directement dans &lt;a href="https://github.com/authlib/authlib"&gt;Authlib&lt;/a&gt;, la bibliothèque sous-jacente d'implémentation des normes.&lt;/p&gt;
&lt;h2&gt;Securité&lt;/h2&gt;
&lt;p&gt;Nous avons implémenté les recommandations restantes issues de l'audit de &lt;a href="https://www.radicallyopensecurity.com"&gt;Radically Open Security&lt;/a&gt;.
La plupart étaient des recommandations mineures relevant des bonnes pratiques, mais il y avait tout de même une vulnérabilité à niveau de risque élevé.
Tout est corrigé désormais. &lt;a href="/media/blog/articles/NGIE Canaille penetration test report 2025 1.0.pdf"&gt;Voici le rapport de sécurité&lt;/a&gt;.
Nous avons aussi &lt;a href="https://canaille.readthedocs.io/fr/latest/references/security.html"&gt;documenté&lt;/a&gt; les &lt;a href="https://cyber.gouv.fr/publications/recommandations-relatives-lauthentification-multifacteur-et-aux-mots-de-passe"&gt;recommandations de l'ANSSI&lt;/a&gt; concernant l'authentification et la gestion des mots de passe, que Canaille implémente.
La plupart des recommandations sont implémentées, il reste principalement à &lt;a href="https://gitlab.com/yaal/canaille/-/issues/296"&gt;supporter WebAuthn&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Documentation&lt;/h2&gt;
&lt;p&gt;Nous travaillons continuellement sur la documentation, et visons de suivre les recommandations de &lt;a href="https://diataxis.fr"&gt;Diátaxis&lt;/a&gt;.
Nous avons écrit des chapitres pour &lt;a href="https://canaille.readthedocs.io/fr/latest/tutorials/getting-started.html"&gt;le premier lancement de Canaille&lt;/a&gt; et la &lt;a href="https://canaille.readthedocs.io/en/latest/tutorials/oidc-client.html"&gt;configuration du premier client OpenID Connect&lt;/a&gt;.
Ces premières étapes nous indirectement fait travailler sur &lt;a href="https://github.com/jag-k/pydantic-settings-export"&gt;pydantic-settings-export&lt;/a&gt;, qui permet notamment aux utilisateurs d'exporter un fichier de configuration avec toutes les valeurs par défaut commentées et décrites, ce qui offre un bon point de départ pour commencer à adapter la configuration. Nous utilisons encore une implémentation personnalisée, le temps de faire remonter toutes les modifications dont nous avons besoin dans le projet original.&lt;/p&gt;
&lt;h1&gt;La suite&lt;/h1&gt;
&lt;p&gt;Canaille vise la simplicité et son périmètre fonctionnel est donc assez restreint.
Nous limitons donc le nombre de fonctionnalités que nous souhaitons implémenter, cepedant il en reste quelques unes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le &lt;a href="https://gitlab.com/yaal/canaille/-/issues/296"&gt;support de WebAuthn&lt;/a&gt; comme facteur d'authentification.
  Cela nous permettra d'implémenter les dernières recommandations de l'ANSSI qui manquent.&lt;/li&gt;
&lt;li&gt;Le &lt;a href="https://gitlab.com/yaal/canaille/-/issues/211"&gt;support d'une méthode de Captcha&lt;/a&gt;.
  Il est à première vue étonnant d'inclure cette fonctionnalité à l'heure où la pertinence des Captchas s'amoindrit avec l'apparition des IAs.
  Nous notons cependant que c'est une fonctionnalité essentielles pour certains utilisateurs, comme en témoigne le &lt;a href="https://lacontrevoie.fr/blog/2024/comparatif-de-onze-solutions-de-sso-libres"&gt;comparatif très poussé de solutions de SSO libres&lt;/a&gt; publié par la Contre-Voie l'année dernière.&lt;/li&gt;
&lt;li&gt;L'implémentation d'un système de &lt;a href="https://gitlab.com/yaal/canaille/-/issues/301"&gt;greffons personnalisés pour Canaille&lt;/a&gt;.
  C'est à un horizon plus lointain, mais nous aimerions proposer une API pour que des développeurs puissent implémenter leur propre facteur d'authentification pour Canaille, ou bien leur propre connecteur de base de données.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;À par ces fonctionnalités visibles, l'essentiel des évolutions à venir viendra sous le capot :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'amélioration de la &lt;a href="https://github.com/python-scim"&gt;pile SCIM&lt;/a&gt;, notamment pour apporter le support des &lt;a href="https://gitlab.com/yaal/canaille/-/issues/274"&gt;filtres SCIM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;L'amélioration de la &lt;a href="https://github.com/authlib/authlib"&gt;pile OIDC&lt;/a&gt; pour apporter le support de nouvelles normes.
  Notamment celles qui ont a trait à la &lt;a href="https://gitlab.com/yaal/canaille/-/issues/155"&gt;déconnexion centralisée&lt;/a&gt; ou bien à la sécurité.&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/><category term="canaille"/></entry><entry><title>Canaille beta is out</title><link href="https://yaal.coop/blog/en/canaille-beta" rel="alternate"/><published>2025-11-13T00:00:00+01:00</published><updated>2025-11-13T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-11-13:/blog/en/canaille-beta</id><summary type="html">&lt;p&gt;After several years of development, Canaille is now in beta version.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Our recent work on Canaille funded by &lt;a href="https://nlnet.nl"&gt;NLNet Foundation&lt;/a&gt; brings us to release a beta version. Let's have a look on what changed.&lt;/p&gt;
&lt;h1&gt;Recent Work&lt;/h1&gt;
&lt;h2&gt;Task Manager&lt;/h2&gt;
&lt;p&gt;We implemented a task manager that allows Canaille to perform long-running tasks asynchronously.
This is notably used to propagate &lt;a href="https://scim.libre.sh"&gt;SCIM&lt;/a&gt; requests or send emails.
The implementation uses &lt;a href="https://dramatiq.io"&gt;dramatiq&lt;/a&gt;, and we published the &lt;a href="https://codeberg.org/yaal/dramatiq-eager-broker"&gt;dramatiq-eager-broker&lt;/a&gt; package which allows maintaining synchronous behavior in the test suite, and when the task manager is not configured.&lt;/p&gt;
&lt;h2&gt;OpenID Connect Certification&lt;/h2&gt;
&lt;p&gt;As we &lt;a href="canaille-oidc-certification"&gt;mentioned recently&lt;/a&gt;, Canaille obtained OpenID Connect Foundation certification last September.
This guarantees that Canaille behaves in compliance with most common OpenID Connect operations.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://openid.net/developers/certified-openid-connect-implementations/"&gt;&lt;img alt="Canaille OIDC certification" src="/media/blog/articles/canaille-oidc-certification.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The certification process revealed many interpretation errors, often minor but sometimes significant.
We fixed most issues directly in &lt;a href="https://github.com/authlib/authlib"&gt;Authlib&lt;/a&gt;, the underlying library implementing the standards.&lt;/p&gt;
&lt;h2&gt;Security&lt;/h2&gt;
&lt;p&gt;We implemented the remaining recommendations from the &lt;a href="https://www.radicallyopensecurity.com"&gt;Radically Open Security&lt;/a&gt; audit.
Most were minor recommendations following best practices, but there was a high threat finding. Now everything is now in place. &lt;a href="/media/blog/articles/NGIE Canaille penetration test report 2025 1.0.pdf"&gt;You can have a look at the report&lt;/a&gt;.
We also &lt;a href="https://canaille.readthedocs.io/en/latest/references/security.html"&gt;documented&lt;/a&gt; the &lt;a href="https://cyber.gouv.fr/publications/recommandations-relatives-lauthentification-multifacteur-et-aux-mots-de-passe"&gt;ANSSI recommendations&lt;/a&gt; regarding authentication and password management, which Canaille implements.
Most recommendations are implemented, the main remaining task is to &lt;a href="https://gitlab.com/yaal/canaille/-/issues/296"&gt;support WebAuthn&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Documentation&lt;/h2&gt;
&lt;p&gt;We continuously work on documentation, aiming to follow &lt;a href="https://diataxis.fr"&gt;Diátaxis&lt;/a&gt; recommendations.
We wrote chapters for &lt;a href="https://canaille.readthedocs.io/en/latest/tutorials/getting-started.html"&gt;getting started with Canaille&lt;/a&gt; and &lt;a href="https://canaille.readthedocs.io/en/latest/tutorials/oidc-client.html"&gt;configuring the first OpenID Connect client&lt;/a&gt;.
These initial steps indirectly led us to work on &lt;a href="https://github.com/jag-k/pydantic-settings-export"&gt;pydantic-settings-export&lt;/a&gt;, which notably allows users to export a configuration file with all default values commented and described, providing a good starting point to begin adapting the configuration. We're still using a custom implementation while we upstream all the changes we need to the original project.&lt;/p&gt;
&lt;h1&gt;What's Next&lt;/h1&gt;
&lt;p&gt;Canaille aims for simplicity and its functional scope is therefore quite limited.
We thus limit the number of features we want to implement, however a few remain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/issues/296"&gt;WebAuthn support&lt;/a&gt; as an authentication factor.
  This will allow us to implement the last missing ANSSI recommendations.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/issues/211"&gt;Captcha method support&lt;/a&gt;.
  At first glance it's surprising to include this feature at a time when the relevance of Captchas is diminishing with the emergence of AIs.
  However, we note that this is an essential feature for some users, as evidenced by the &lt;a href="https://lacontrevoie.fr/blog/2024/comparatif-de-onze-solutions-de-sso-libres"&gt;very thorough comparison of open source SSO solutions&lt;/a&gt; published by La Contre-Voie last year.&lt;/li&gt;
&lt;li&gt;Implementation of a &lt;a href="https://gitlab.com/yaal/canaille/-/issues/301"&gt;custom plugin system for Canaille&lt;/a&gt;.
  This is on a more distant horizon, but we would like to offer an API so developers can implement their own authentication factor for Canaille, or their own database connector.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Besides these visible features, most upcoming developments will be under the hood:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improving the &lt;a href="https://github.com/python-scim"&gt;SCIM stack&lt;/a&gt;, notably to bring support for &lt;a href="https://gitlab.com/yaal/canaille/-/issues/274"&gt;SCIM filters&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Improving the &lt;a href="https://github.com/authlib/authlib"&gt;OIDC stack&lt;/a&gt; to bring support for new standards.
  Particularly those related to &lt;a href="https://gitlab.com/yaal/canaille/-/issues/155"&gt;centralized logout&lt;/a&gt; or security.&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions, canaille"/></entry><entry><title>Geek Camp automne 2025</title><link href="https://yaal.coop/blog/geek-camp-automne-2025" rel="alternate"/><published>2025-10-03T00:00:00+02:00</published><updated>2025-10-03T00:00:00+02:00</updated><author><name>Sébastien Birolleau &lt;sebastien@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-10-03:/blog/geek-camp-automne-2025</id><summary type="html"/><content type="html">&lt;p&gt;Retour sur ma participation au Geek Camp organisé par l'association Okiwi.&lt;/p&gt;
&lt;p&gt;Geek Camp automne 2025
Organisé par l'association Okiwi, le Geek Camp rassemble le temps d'un week-end convivial la communauté tech bordelaise. L'organisation s'articule autour d'un grand forum ouvert, et qui dit ouvert, dit ouvert, donc si tu n'es ni de la tech ni de Bordeaux, tu es la·e bienvenu·e !&lt;/p&gt;
&lt;p&gt;L'événement commence le vendredi soir et se termine le dimanche en début d'après midi. Et bien sûr, c'est ouvert aussi sur ces points : on peut ne venir que pour une partie ou juste pour dire bonjour ! C'est vraiment ouvert quoi. Le lieu, c'est la salle des fêtes de Ruffiac dans le 47. Un lieu très vert avec une jolie vue. Venez et vous verrez (inscriptions ici).&lt;/p&gt;
&lt;p&gt;J'étais déjà venu à un Geek Camp juste avant de débuter chez Yaal Coop (encore merci Sam), lors de la session du printemps 2024. J'avais vraiment hâte de revenir pour profiter de cette ambiance si pleine de bienveillance et de passionné·e·s, curieux·se·s, brillant·e·s et animé·e·s d'un fort désir de partage.&lt;/p&gt;
&lt;p&gt;Vendredi
Je suis arrivé le vendredi soir et déjà les discussions s'animaient tout en préparant les lieux et invoquant le feu pour les grillades.
Entre retrouvailles et discussions, la soirée s'est déroulée dans une ambiance de simplicité et de convivialité.&lt;/p&gt;
&lt;p&gt;Sur un grand écran, Manu et Fabien présentent leurs projets en cours et invitent qui veut à participer à la résolution des problèmes du moment.
Autour des tables, on s'arrête pour échanger sur l'incroyable ergonomic split keyboard cutomisé de Romain.
Alors que certains n'ont pas encore regagné leur tente, nous partageons un moment ludique rythmé par les rires et les encouragements des observateurs.&lt;/p&gt;
&lt;p&gt;Un forum ouvert, c'est quoi au fait ?
Merci de me poser la question, je suis toujours heureux d'expliquer le principe. Et c'est très simple. Chacun pourra proposer un (ou plusieurs) atelier, thème de discussion, activité, présentation, demande d'aide, etc. en proposant une heure de début et une durée approximative (et même un lieu pour se retrouver). Ce moment, c'est la place de marché.
Au préalable on a rappelé les règles et la loi qui régissent un forum ouvert:
- règle 1 : ça commence quand ça commence et ça finit quand ça finit. Oui, il n'est pas toujours facile de commencer à l'heure promise. Parfois, on commence même plus tôt et pas à l'endroit convenu. Parfois, au bout de 10 minutes, on a fait le tour, répondu au besoin et on n'a pas tenu le temps prévu. Parfois on déborde.
- règle 2 : les personnes présentes sont les bonnes personnes. On aurait peut-être aimé attirer cet expert·e sur le sujet, mais il fait autre chose. Alors on fait le sujet avec les personnes présentes. Peut-être même que celui qui voulait de l'aide va se retrouver à en apporter ou à initier. Et c'est très bien comme ça.
- règle 3 : ce qui arrive est la meilleur chose qui pouvait se passer. Les trois règles forment un ensemble cohérent. Je n'ai pas eu le temps de faire mon atelier ? Alors c'est que j'ai certainement fait ce que je devais faire. Et c'est tout simplement ce qui pouvait arriver de mieux.
- loi de la mobilité (dite des deux pieds) : si je suis quelque part et que je n'apprends rien et que je n'apporte rien, je dois faire autre chose. Ainsi, il est tout à fait admis de quitter un atelier et de revenir plus tard, il n'y a pas lieu de se vexer, on ne fait que se soumettre à cette loi.
Il est tout à fait autorisé de buller dans son coin ou de faire ce que l'on veut seul ou accompagné. On peut aussi papillonner en passant d'un atelier à l'autre ou butiner telle une abeille en apportant un peu ici et là.
Bref, un forum ouvert, c'est OUVERT dans tous les sens du terme. et, oui, ça a un côté assez magique, parce que ça fonctionne drôlement bien.&lt;/p&gt;
&lt;p&gt;Samedi
Le samedi va commencer tout doucement, tellement doucement que l'ouverture du forum ouvert (la place du marché) ne se fera qu'en fin de matinée.&lt;/p&gt;
&lt;p&gt;Les premiers ateliers commencent vers 15h. Nous sommes un peu plus d'une vingtaine de participants et tout le monde est ravi·e et impatient·e de s'y mettre. Bon nombre d'entre nous se rendent devant le tableau pour choisir leur premier rendez-vous. J'ai choisi de rejoindre Sam et Manu qui préparaient un futur atelier pour Agenux. Un fizzbuzz en C#, SOLID, CUPID and cute DDD. Je ne connais pas le C#. J'ai l'habitude de ne pas savoir, je suis junior. Alors je m'assois et j'écoute, je regarde. Bonne nouvelle, je ne comprends certes pas les problèmes, mais j'arrive à suivre le fil. Alors, ça me va.&lt;/p&gt;
&lt;p&gt;Vers 16h, je rejoins Arnaud qui souhaite tester un atelier de dev qui s'appuie sur le lambda-calcul pour le meet up lambda Nantes. Là, clairement, je n'ai pas le niveau et en plus, c'est la première fois que j'entends parler de lambda-calcul. Mais ça m'intéresse de suivre et Arnaud me fait rire. Je vais passer un bon moment à suivre les retours et les difficultés à capter les ressorts de l'exercice par les participants.&lt;/p&gt;
&lt;p&gt;Vers 18h, je vais participer à la présentation d'un outil de craft présenté par Fabien. Son outil vise à identifier les difficultés d'une tâche afin d'évaluer aussi ce que je peux apprendre grâce aux autres, par moi-même ou ce qui doit être reporté ou vite abattu pour permettre d'avancer sans chercher à faire de la qualité. Nous échangeons à 4 ou 5 autour du sujet, proposons des amélioration, soulevons des question pour faire évoluer l'outil.&lt;/p&gt;
&lt;p&gt;Je n'ai malheureusement pas eu le temps d'animer mon atelier : "gagner la confiance client". C'est ce qui devait arriver. Mais alors que la journée touche à sa fin, Florimond puis Fabien (un autre Fabien) me disent qu'ils auraient aimé y assister. Alors je décale mon atelier au dimanche matin 10h.&lt;/p&gt;
&lt;p&gt;Le soir venu, le Geek Camp prend l'allure d'une soirée entre amis. On parle de tout et de rien, on rigole beaucoup, on échange nos idées, on parle de nous. Un beau moment entouré de gens qui ne jugent pas, juste du partage.&lt;/p&gt;
&lt;p&gt;Certains enchaîneront les petits jeux, d'autre feront un gros jeu et, Arnaud, Guillaume et moi un trop gros. 3h pour le premier tour seulement. Arnaud avait eu le courage de découvrir les règles de ce wargame imposant durant la journée. C'était vraiment chouette : les bonnes personnes qui vivent ce qui pouvait se passer de meilleur.&lt;/p&gt;
&lt;p&gt;Dimanche
Le dimanche matin, je vais attendre que Florimond et Fabien soient prêts et je lance ma présentation. Nous serons rejoints par 6 ou 7 personnes. Je suis content de voir que le sujet intéresse. Je réponds à quelques questions puis on continue sur le sujet avant de dériver et de beaucoup rire de l'anecdote du chat de Florimond.&lt;/p&gt;
&lt;p&gt;En fin de matinée, alors que Mikael remplace Xavier à la crêpière, nous faisons la clôture du forum ouvert. On va tous pouvoir s'exprimer en se promettant de tout faire pour que le prochain dure plus longtemps. Après tout avec le télétravail, ça devrait être possible. Certains se motivent pour organiser une promenade dans les environs.&lt;/p&gt;
&lt;p&gt;Après un dernier repas, et un dernier coup d'éponge, chacun rentre chez soi, des souvenirs pleins la tête avec la ferme intention de revenir profiter le plus tôt possible.&lt;/p&gt;
&lt;p&gt;Pour conclure, je tiens à remercier l'engagement et l'énergie de Xavier, Stéfanie et Sam (membres du bureau d'Okiwi) qui ont permis de faire de cette session une nouvelle réussite. Merci à vous !&lt;/p&gt;</content><category term="Vie coopérative"/><category term="Vie coopérative"/></entry><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant l'été 2025</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-ete-2025" rel="alternate"/><published>2025-09-21T00:00:00+02:00</published><updated>2025-09-21T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-09-21:/blog/dernieres-contributions-logiciels-libres-ete-2025</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant l'été 2025.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Mécénat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; pour son travail sur &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, un chouette framework CSS que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; pour son travail sur &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, une bibliothèque python d'authentification que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Soutien « bronze » à la convention &lt;a href="https://pycon.fr/2025"&gt;PyConFR&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://magic-wormhole.readthedocs.io"&gt;Magic-Wormhole&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Obtenir des fichiers d'un ordinateur à l'autre, en toute sécurité&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/56"&gt;Suppression de warnings sur des échappements dans des chaînes de caractères&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Remplacement de formatage de chaînes de caractères en f-strings sur &lt;a href="https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/57"&gt;le serveur boîte aux lettres&lt;/a&gt; et &lt;a href="https://github.com/magic-wormhole/magic-wormhole-transit-relay/pull/57"&gt;le serveur relai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/magic-wormhole/magic-wormhole-transit-relay/pull/56"&gt;Fichiers générés par les tests ignorés par git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Utilisation de la syntaxe disponible sur les versions de Python 3.9+, réalisée grâce à &lt;a href="https://github.com/domdfcoding/pyupgrade-directories"&gt;pyupgrade-directories&lt;/a&gt;, pour le &lt;a href="https://github.com/magic-wormhole/magic-wormhole/pull/658"&gt;client&lt;/a&gt;, &lt;a href="https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/58"&gt;le serveur boîte aux lettres&lt;/a&gt; et &lt;a href="https://github.com/magic-wormhole/magic-wormhole-transit-relay/pull/58"&gt;le serveur relai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Remplacement de l'appel &lt;code&gt;pkg_resources.resource_string()&lt;/code&gt; obsolète par &lt;code&gt;importlib.resources.file()&lt;/code&gt; pour &lt;a href="https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/59"&gt;le serveur boîte aux lettres&lt;/a&gt; et &lt;a href="https://github.com/magic-wormhole/magic-wormhole-transit-relay/pull/59"&gt;le serveur relai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/60"&gt;Ajout d'une variable d'environnement pour corriger un test&lt;/a&gt; en ayant la même sortie standard&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/repos/authlib/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;La bibliothèque Python ultime pour construire des clients et serveurs OAuth, OpenID Connect. JWS, JWE, JWK, JWA, JWT inclus.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/791"&gt;Restauration temporaire du paramètre body OAuth2Request&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/800"&gt;Correction de la génération d'id_token avec l'algorithme EdDSA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/802"&gt;Signature des id_token OIDC selon les métadonnées client id_token_signed_response_alg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/803"&gt;Ajout de la vérification diff-cover dans GHA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/804"&gt;Migration de pre-commit vers prek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/805"&gt;Exécution des tests unitaires GHA avec uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/810"&gt;Correction du déclenchement d'&lt;code&gt;InsecureTransportError&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/811"&gt;Ajout du hook pre-commit conventional-commits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/812"&gt;Correction de response_mode=form_post avec le client Starlette&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/813"&gt;Migration des tests vers le paradigme pytest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/824"&gt;Utilisation d'URLs *.test explicites dans les tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/825"&gt;Ajout d'un paramètre &lt;code&gt;request&lt;/code&gt; aux méthodes RFC7591 &lt;code&gt;generate_client_info&lt;/code&gt; et &lt;code&gt;generate_client_secret&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/repos/pytest-dev/pytest-iam"&gt;pytest-iam&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Un serveur OAuth2 / OpenID Connect (OIDC) / SCIM léger et entièrement fonctionnel à utiliser dans les suites de tests.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest-iam/pull/6"&gt;Correction des exceptions fake_users et fake_groups&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/repos/python-scim/scim2-client"&gt;scim2-client&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Construire des requêtes SCIM et analyser les réponses SCIM de manière pythonique&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/31"&gt;Support des opérations PATCH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/32"&gt;Support d'extensions multiples pour les ressources&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/repos/python-scim/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Sérialisation et validation de ressources SCIM avec Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/96"&gt;Validation que &lt;code&gt;PatchOp.path&lt;/code&gt; est défini pour les opérations &lt;code&gt;remove&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/97"&gt;Validation des chemins pour les attributs SearchRequest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/98"&gt;Validations sur PatchOp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/100"&gt;Validatinos sur PatchOp.patch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/101"&gt;Ignorance des attributs invalides et excluded_attributes lors de la sérialisation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/102"&gt;Les champs typés avec &lt;code&gt;Any&lt;/code&gt; ne sont pas normalisés&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/106"&gt;Les valeurs non canoniques sont autorisées pour les Enums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/107"&gt;Une seule valeur d'attribut complexe primaire ne peut être vraie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/109"&gt;Sous-attributs ComplexAttribute explicites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/repos/python-scim/scim2-server"&gt;scim2-server&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Prototype de serveur SCIM2 léger&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/10"&gt;Correction d'une erreur survenant lors du PUT d'un champ d'extension vers une instance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/11"&gt;Correction du comportement quand patch supprime des champs null non-éditables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/12"&gt;Correction du patching racine d'extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/repos/python-scim/scim2-tester"&gt;scim2-tester&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Vérificateur de conformité serveur aux RFC SCIM&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/31"&gt;Implémentation des vérifications PATCH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/32"&gt;Implémentation du filtrage des vérifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/33"&gt;Implémentation d'un gestionnaire de ressources pour gérer les objets déchets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/35"&gt;Implémentation de tests supplémentaires sur les ressources de base&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/40"&gt;Gestion des réponses vides des opérations PATCH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/42"&gt;Gestion correcte de la génération de valeurs dans les sous-attributs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Summer 2025 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-ete-2025" rel="alternate"/><published>2025-09-21T00:00:00+02:00</published><updated>2025-09-21T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-09-21:/blog/en/dernieres-contributions-logiciels-libres-ete-2025</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during summer 2025.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Sponsoring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; for his work on &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, a nice CSS framework we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI is used on other tools we rely on, like &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; for his work on &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, a python authentication library we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Bronze tier sponsoring for the &lt;a href="https://pycon.fr/2025"&gt;PyConFR&lt;/a&gt; convention.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://magic-wormhole.readthedocs.io"&gt;Magic-Wormhole&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Get files from one computer to another, safely&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/56"&gt;Remove warnings about invalid escape sequence in strings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Replace formatted strings to f-strings for &lt;a href="https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/57"&gt;the mailbox server&lt;/a&gt; and &lt;a href="https://github.com/magic-wormhole/magic-wormhole-transit-relay/pull/57"&gt;the relay server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/magic-wormhole/magic-wormhole-transit-relay/pull/56"&gt;Git ignores files generated when the tests run&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update syntax to 3.9+ Python versions, done with &lt;a href="https://github.com/domdfcoding/pyupgrade-directories"&gt;pyupgrade-directories&lt;/a&gt;, for the &lt;a href="https://github.com/magic-wormhole/magic-wormhole/pull/658"&gt;client&lt;/a&gt;, &lt;a href="https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/58"&gt;the mailbox server&lt;/a&gt; and &lt;a href="https://github.com/magic-wormhole/magic-wormhole-transit-relay/pull/58"&gt;the relay server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Replace deprecated &lt;code&gt;pkg_resources.resource_string()&lt;/code&gt; call by &lt;code&gt;importlib.resources.file()&lt;/code&gt; for &lt;a href="https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/59"&gt;the mailbox server&lt;/a&gt; and &lt;a href="https://github.com/magic-wormhole/magic-wormhole-transit-relay/pull/59"&gt;the relay server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/60"&gt;Set environment variable to fix a test&lt;/a&gt; by having the same stdout output&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/repos/authlib/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The ultimate Python library in building OAuth, OpenID Connect clients and servers. JWS,JWE,JWK,JWA,JWT included.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/791"&gt;Temporarily restore OAuth2Request body parameter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/800"&gt;Fix id_token generation with EdDSA alg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/802"&gt;Sign OIDC id_token  according to id_token_signed_response_alg client metadata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/803"&gt;Add diff-cover check in GHA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/804"&gt;Move from pre-commit to prek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/805"&gt;Run GHA unit tests with uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/810"&gt;Fix &lt;code&gt;InsecureTransportError&lt;/code&gt; raising&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/811"&gt;Add conventional-commits pre-commit hook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/812"&gt;Fix response_mode=form_post with Starlette client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/813"&gt;Migrate tests to pytest paradigm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/824"&gt;Use explicit *.test urls in unit tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/825"&gt;Add a &lt;code&gt;request&lt;/code&gt; param to RFC7591 &lt;code&gt;generate_client_info&lt;/code&gt; and &lt;code&gt;generate_client_secret&lt;/code&gt; methods&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/repos/pytest-dev/pytest-iam"&gt;pytest-iam&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A lightweight and fully functional OAuth2 / OpenID Connect (OIDC) / SCIM server to be used in test suites.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest-iam/pull/6"&gt;Fix fake_users and fake_groups exceptions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/repos/python-scim/scim2-client"&gt;scim2-client&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Pythonically build SCIM requests and parse SCIM responses&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/31"&gt;Support for PATCH operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/32"&gt;Allow testing resources with multiple extensions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/repos/python-scim/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM resources serialization and validation with Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/96"&gt;Ensure &lt;code&gt;PatchOp.path&lt;/code&gt; is set for &lt;code&gt;remove&lt;/code&gt; operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/97"&gt;Implement proper path validation for SearchRequest attributes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/98"&gt;Implement PatchOp validation checks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/100"&gt;Implement PatchOp.patch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/101"&gt;Ignore invalid attributes and excluded_attributes on serialization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/102"&gt;Don't normalize fields typed with &lt;code&gt;Any&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/106"&gt;Allow non canonical values for Enums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/107"&gt;Only allow one primary complex attribute value to be true&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/109"&gt;Explicit ComplexAttribute sub-attributes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/repos/python-scim/scim2-server"&gt;scim2-server&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lightweight SCIM2 server prototype&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/10"&gt;Fix an error happening when PUT-ing an extension field to an instance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/11"&gt;Fix behavior when patch removes null uneditable fields&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/12"&gt;Fix extension root patching&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/repos/python-scim/scim2-tester"&gt;scim2-tester&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM RFCs server compliance checker&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/31"&gt;Implement PATCH checks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/32"&gt;Implement check filtering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/33"&gt;Implement a resource manager to take care of garbages objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/35"&gt;Implement additional tests on the core resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/40"&gt;Handle empty response of PATCH operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/42"&gt;Correctly handle value generation in sub-attributes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Chapitre 2024</title><link href="https://yaal.coop/blog/chapitre-2024" rel="alternate"/><published>2025-09-15T00:00:00+02:00</published><updated>2025-09-15T00:00:00+02:00</updated><author><name>Brunélie Lauret &lt;brunelie@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-09-15:/blog/chapitre-2024</id><summary type="html">&lt;p&gt;Notre rapport de gestion, bilan de 2024 !&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Chapitre 2024 - Réseau, recrutement et parentalité&lt;/h1&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Bienvenue dans ce bilan de l'année 2024 de Yaal Coop !
Comme chaque année, nous tentons de vous raconter notre année en évènements, en (bonnes) pratiques (de l'ESS), en projets et en chiffres. Il s'agit d'une retranscription, un poil re-travaillée, de notre rapport de gestion annuel.&lt;/p&gt;
&lt;p&gt;Dans l'introduction du &lt;a href="https://yaal.coop/blog/chapitre-2023"&gt;Chapitre 2023&lt;/a&gt;, on écrivait "Yaal Coop recrute !". Eh ben... Yaal Coop a recruté !&lt;/p&gt;
&lt;p&gt;Notre AGO de clôture de l'année 2024 s'est déroulée le 26 mai 2025, et en voilà le rapport de gestion :&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Bonnes pratiques ESS de la coopérative&lt;/h2&gt;
&lt;h3&gt;Gouvernance démocratique :&lt;/h3&gt;
&lt;p&gt;Conformément à nos statuts et à nos pratiques internes, Yaal Coop maintient et met à jour sa gouvernance en suivant les principes de l’holacratie, adaptés à la taille de la structure.&lt;/p&gt;
&lt;p&gt;Les réunions de revue de notre gouvernance, servant à confirmer, modifier, supprimer ou ajouter des rôles de gestion se tiennent toujours de façon trimestrielle.&lt;/p&gt;
&lt;p&gt;Cette année, le rôle d’orchestration de la stratégie de communication de Yaal Coop a fait son retour, suite à un besoin ressenti pour la coopérative de se faire connaître en ligne et dans nos réseaux.&lt;/p&gt;
&lt;p&gt;Les rotations des rôles ont lieu lors de leur arrivée à échéance, au cours des réunions hebdomadaires.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les rôles tournants définis actuellement sont les suivants :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💌 Facteur·rice (qui relève le courrier entrant de nos différents boîtes mail et postale communes) - 2 semaines&lt;/li&gt;
&lt;li&gt;📟 Sentinelle (qui surveille les alertes levées par notre système de monitoring technique) - 2 semaines&lt;/li&gt;
&lt;li&gt;✒️ Secrétaire (qui programme et prend des notes de nos réunions régulières) - 3 mois&lt;/li&gt;
&lt;li&gt;🗨️ Facilitateur·rice (qui anime nos réunions régulières) - 3 mois&lt;/li&gt;
&lt;li&gt;🏦 Billetterie (qui fait la paie) - 3 mois&lt;/li&gt;
&lt;li&gt;🍲 Ticket-Restaurateur·rice (qui gère la distribution des tickets restaurants) - 3 mois&lt;/li&gt;
&lt;li&gt;📜 Marteau de la Justice (qui s'assure que Yaal Coop respecte ses obligations légales) - 6 mois&lt;/li&gt;
&lt;li&gt;🕊️ Libre Entrepriseur·euse (qui représente Yaal Coop au sein du réseau Libre-entreprise) - 6 mois&lt;/li&gt;
&lt;li&gt;😽 Chaton·ne (qui représente Yaal Coop au sein du collectif CHATONS) - 1 an&lt;/li&gt;
&lt;li&gt;🪙 Argentier·e (qui suit et budgétise la trésorerie) - 1 an suivi de 1 an en backup&lt;/li&gt;
&lt;li&gt;🎊 Grand·e Coopérateur·rice (qui porte le mandat de Président·e, organise les Assemblées Générales et le sociétariat et s'assure que les formalités administratives sont traitées) - 2 ans&lt;/li&gt;
&lt;li&gt;🎙️ Barde (qui porte la stratégie de communication de Yaal Coop) – 3 mois&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Ils sont complétés par 4 rôles permanents occupés par tous les salariés :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🚀 Responsable projet/prospect (qui est le référent d'un projet et le contact privilégié de ses éventuels clients)&lt;/li&gt;
&lt;li&gt;🛠️ Producteur·rice (qui produit du travail de qualité et se forme sur son métier)&lt;/li&gt;
&lt;li&gt;🎯 Chasseur·euse cueilleur·euse (qui s'occupe de la communication et du commerce)&lt;/li&gt;
&lt;li&gt;👤 Salarié·e (qui remplit ses obligations de salariés)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tous ces rôles ont une liste de redevabilités associées qui évolue également en fonction des besoins et des constats/manques éventuels observés.&lt;/p&gt;
&lt;p&gt;Nos réunions hebdomadaires de suivi de l'activité et les réunions trimestrielles de stratégie sur l'investissement réunissant les salarié·es sont toujours en place.&lt;/p&gt;
&lt;h3&gt;Stratégie et organisation de Yaal Coop :&lt;/h3&gt;
&lt;p&gt;La stratégie et l’organisation à court terme de Yaal Coop s’articulent autour des réunions hebdomadaires qui réunissent les salarié·es et les associé·es pour la revue des actions réalisées ou non lors de la semaine précédente, la revue des projets en cours, des rôles expirés, et des tensions à évoquer.&lt;/p&gt;
&lt;p&gt;Au long terme, ce sont nos points de "Rétro d’investissement" qui structurent la stratégie globale de la coopérative : nous y révisons les objectifs du trimestre passé, notre gestion du temps, et y fixons de façon commune les objectifs du trimestre à suivre. Les salarié·es et les associé·es salarié·es y participent de concert.&lt;/p&gt;
&lt;h3&gt;Egalité :&lt;/h3&gt;
&lt;p&gt;Conformément à nos décisions collectives et aux statuts de Yaal Coop, les associé·es salarié·es sont à salaire égal.&lt;/p&gt;
&lt;h3&gt;ESS :&lt;/h3&gt;
&lt;p&gt;Yaal Coop favorise toujours les acteurs de l'économie sociale et solidaire en plus des missions de service public, et en particulier les coopératives, dans son choix de clients et de fournisseurs.
Nous n'avons pas souscrit de nouvelles parts de capital social mais nous possédons toujours celles de notre banque Crédit Coopératif (10 parts pour un montant de 152,50€), notre cabinet comptable Finacoop (1 part de 100€), notre cabinet de paie Assistea (1 part de 100€), et notre fournisseur téléphonique mobile et client Telecoop (1 part de 100€).&lt;/p&gt;
&lt;h3&gt;Impact environnemental :&lt;/h3&gt;
&lt;p&gt;Conformément à nos convictions, et comme les années précédentes, Yaal Coop a versé à l'ensemble de l'équipe salariée le forfait mobilité durable à hauteur de 700€ par an, pour maintenir et encourager l'utilisation de mobilités douces (le vélo principalement) dans les déplacements du domicile au lieu de travail.&lt;/p&gt;
&lt;p&gt;Les abonnements aux transports en commun (train, réseau TBM) sont intégralement remboursés aux salarié·es.&lt;/p&gt;
&lt;p&gt;Pour limiter son empreinte écologique, Yaal Coop a choisi d’investir dans un matériel de travail améliorable et réparable sur le long terme, notamment avec l’achat d’un ordinateur portable Framework.&lt;/p&gt;
&lt;p&gt;Enfin la question du numérique soutenable est toujours une question d'intérêt pour la coopérative. Nous continuons de choisir soigneusement les projets sur lesquels nous travaillons pour éviter de contribuer à l'impact du numérique sur des projets que nous jugeons peu utiles voire contre-productifs.&lt;/p&gt;
&lt;p&gt;De façon plus anecdotique, sur les logiciels que nous développons (tels que canaille), nous utilisons les outils d’audit à notre disposition pour travailler sur la légèreté des pages générées. Nous essayons notamment de suivre quelques référentiels de bonnes pratiques de conception et de développement :&lt;/p&gt;
&lt;p&gt;• Le GR491
 • Le Référentiel général d’écoconception de services numériques (RGESN)
 • Les fiches de bonnes pratiques GreenIT&lt;/p&gt;
&lt;p&gt;Afin de réduire les transferts réseau, nous prenons soin de réduire les tailles de nos images, de n’afficher que le contenu nécessaire sur des pages volontairement simples, de réduire la taille du code source que nous transférons. Nous visons des scores d’au moins 90 % ou B sur les outils que nous utilisons pour mesurer la performance de nos pages (tels que lighthouse ou ecoindex.fr).&lt;/p&gt;
&lt;h1&gt;🟡&lt;/h1&gt;
&lt;h2&gt;Réseaux&lt;/h2&gt;
&lt;p&gt;Cette année, Yaal Coop maintient sa participation au sein du Collectif CHATONS, avec la solution d'hébergement, de messagerie et d'e-mail Nubla.&lt;/p&gt;
&lt;p&gt;La coopérative participe à quelques réunions mensuelles du collectif au cours de l'année, s'exprime et vote lors des prises de décision qui animent le collectif, comme l’audit des candidats du collectif. Yaal Coop a également été représentée au Camp CHATONS, moment clé de la vie du collectif, lors de l’été 2024.&lt;/p&gt;
&lt;p&gt;Yaal Coop maintient également sa participation dans le réseau Libre Entreprise, avec le partage de comptes-rendu mensuels résumant les projets de la coopérative, sa vie et son activité, avec la participation aux réunions mensuelles du réseau.&lt;/p&gt;
&lt;p&gt;Yaal Coop est toujours adhérente du pôle de compétences régional en logiciels et technologies libres et open source NAOS.&lt;/p&gt;
&lt;h1&gt;🟡&lt;/h1&gt;
&lt;h2&gt;Favoriser l'utilisation et le développement de logiciels libres&lt;/h2&gt;
&lt;p&gt;Même s'il ne s'agit pas d'une condition exclusive, la majeure partie de nos projets en 2023 a été réalisée sur du code libre, qu'il s'agisse de nos projets internes (Canaille, Nubla) ou de nos prestations (Portail RSE, PodEduc, B3Desk).&lt;/p&gt;
&lt;h3&gt;Contributions de l'année à des logiciels libres&lt;/h3&gt;
&lt;p&gt;Les contributions sont résumées chaque saison dans des articles de blog visibles sur notre &lt;a href="https://yaal.coop/blog"&gt;site web&lt;/a&gt;. Elles sont, soit limitées à quelques modifications ciblées sur des logiciels utilisés, soit des contributions au long cours sur quelques bibliothèques et outils spécifiques (en particulier autour de l'écosystème de Canaille).&lt;/p&gt;
&lt;h3&gt;Participations&lt;/h3&gt;
&lt;p&gt;En plus de nos contributions en développement et/ou design, nous avons décidé de contribuer financièrement à 2 projets libres sur Github que nous utilisons, à hauteur de 20 $/mois.&lt;/p&gt;
&lt;h1&gt;🟡&lt;/h1&gt;
&lt;h2&gt;Situation et activité de la Coopérative pendant l'année écoulée&lt;/h2&gt;
&lt;h3&gt;Embauches :&lt;/h3&gt;
&lt;p&gt;Après le départ d’Éloi au mois de Juin, il a été nécessaire d’échanger sur la stratégie de Yaal Coop ainsi que sur la répartition du travail dans les projets en cours et ceux à venir. Manquant notamment de disponibilités pour la réalisation des développements NLNet et de flexibilité sur notre avenir, nous avons décidé de lancer une phase de recrutement d’un·e développeur·euse python pour compléter notre équipe.&lt;/p&gt;
&lt;p&gt;Après plus d’une dizaine d’entretiens en discussion et d’entretiens techniques, nous avons décidé de recruter deux développeurs junior, dont les profils sont complémentaires à nos yeux, Sébastien et Félix.&lt;/p&gt;
&lt;p&gt;Ils ont rejoint notre équipe respectivement en septembre et en octobre, après une période de POEI (préparation opérationnelle à l'emploi individuelle) durant l’été pour Sébastien.&lt;/p&gt;
&lt;h3&gt;Evolution de l’activité :&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Projets et revenus :&lt;/strong&gt; En 2024, la majorité des revenus de Yaal Coop sont issus de la mission sur Portail RSE, avec 3 personnes sur le projet en début d’année, puis 2 en milieu d’année, et Stéphane sur la fin de l’année. Le projet est toujours en cours et Camille a été réintégrée à l’équipe à l’issue de son congé maternité, début 2025.&lt;/p&gt;
&lt;p&gt;Toutefois, nous aimerions être moins dépendants d’un seul projet pour la pérennité de la coopérative, d’autant que l’initiative Beta Gouv et les projets qui en dépendent sont aussi dépendants de la politique intérieure changeante du pays.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Activité sociale :&lt;/strong&gt; Éloi quitte Yaal Coop le 20 juin 2024, un départ temporaire choisi pour des raisons personnelles, et avec un retour prévu dans l’année suivante.&lt;/p&gt;
&lt;p&gt;L’été suivant le départ d’Éloi est rythmé par la recherche d’un·e développeur·euse pour compléter l’équipe. Sébastien, l’un des développeurs retenu par la coopérative, est formé par Yaal Coop en POEI pendant l’été.&lt;/p&gt;
&lt;p&gt;Camille est en congé parental à partir de septembre 2024, et c’est également en septembre 2024 que Sébastien rejoint l’équipe de Yaal Coop, en CDI.&lt;/p&gt;
&lt;p&gt;Début octobre 2024, Félix rejoint à son tour l’équipe, en CDI également.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Activité financière :&lt;/strong&gt; Le chiffre d’affaires 2024 s’élève à 235 866 €, il est de 26 % inférieur à celui de 2023.&lt;/p&gt;
&lt;p&gt;La baisse d’activité s’explique par la réduction progressive de l’effectif sur le projet Portail RSE notammment, ainsi que par le départ d’Éloi en milieu d’année, réduisant le nombre de développeur·euses senior disponibles sur des projets apportant des revenus à la Coop.&lt;/p&gt;
&lt;p&gt;Elle s’explique également par la réalisation de moins de développements que prévu sur certains de nos projets.&lt;/p&gt;
&lt;p&gt;En parallèle, sur la fin d’année, les coûts augmentent pour la coopérative avec le recrutement de deux développeurs junior en CDI.&lt;/p&gt;
&lt;p&gt;Ainsi, le résultat de 2024 de Yaal Coop est de 14 858 €.&lt;/p&gt;
&lt;p&gt;Côté trésorerie, Yaal Coop est à 144,1k€ fin 2024, après un remboursement de compte courant de 100k€ auquel s’additionne les salaires, qui représentent la majorité de nos dépenses, s’élevant à 190k€ sur l’année.&lt;/p&gt;
&lt;h1&gt;🟡&lt;/h1&gt;
&lt;h2&gt;Evolution des affaires et projets en cours&lt;/h2&gt;
&lt;h3&gt;Projets réalisés ou en cours en 2024 :&lt;/h3&gt;
&lt;h4&gt;&lt;a href="https://canaille.readthedocs.io"&gt;Canaille&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Canaille est notre logiciel libre de gestion d'identité et d'autorisations développé en interne.&lt;/p&gt;
&lt;p&gt;Un nouveau financement de 45 500€ nous a été accordé pour le développement de Canaille de la part de la fondation européenne NLNet. Les développements ont été réalisés en partie début 2024, et l’autre partie fin 2024 et début 2025, permettant à Yaal Coop de débloquer 37 000€ sur les 45 500 prévus initialement.&lt;/p&gt;
&lt;p&gt;Les développements en 2024 ont été réalisés par Éloi en début d’année, et par Brunélie,&lt;/p&gt;
&lt;p&gt;Félix et Sébastien en fin 2024 et début 2025.&lt;/p&gt;
&lt;h4&gt;&lt;a href="https://portail-rse.beta.gouv.fr"&gt;Portail RSE&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Camille et Stéphane poursuivent le développement de la plateforme Portail RSE (anciennement Projet IMPACT), Start-up d'État faisant partie du programme beta.gouv et pilotée par la Direction Générale des Entreprises.&lt;/p&gt;
&lt;p&gt;Brunélie quitte le projet fin avril, et Camille est en congé maternité à partir de&lt;/p&gt;
&lt;p&gt;Septembre, réduisant donc la part de revenus liés à ce projet pour Yaal Coop.&lt;/p&gt;
&lt;p&gt;La plateforme se concentre sur la pédagogie et l’aide à la saisie du rapport répondant à la réglementation CSRD pour les entreprises.&lt;/p&gt;
&lt;h4&gt;&lt;a href="https://podeduc.apps.education.fr"&gt;Podeduc&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;PodEduc est un projet d’hébergement et de montage de vidéos à destination de l’éducation nationale.&lt;/p&gt;
&lt;h4&gt;&lt;a href="https://github.com/numerique-gouv/b3desk"&gt;B3Desk&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;B3Desk est un projet de gestion des accès aux plateformes de visioconférences utilisées par l’éducation nationale.&lt;/p&gt;
&lt;h4&gt;&lt;a href="https://nubla.fr"&gt;Nubla&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Nubla est notre service d'e-mail, cloud et messagerie à destination des particuliers et professionnels.&lt;/p&gt;
&lt;p&gt;Cette année, nous n’avons pas eu beaucoup de temps à accorder au développement de Nubla. Nous avons maintenu et renouvelé le service pour nos clients actuels.&lt;/p&gt;
&lt;h4&gt;&lt;a href="https://telecoop.fr"&gt;Telecoop&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Yaal Coop développe un backoffice de gestion des lignes téléphoniques et des factures pour Télécoop. Un contrat cadre a été signé, provisionnant quelques jours par mois pour le développement régulier du projet, par Loan.&lt;/p&gt;
&lt;h1&gt;🟡&lt;/h1&gt;
&lt;h2&gt;Quels risques et incertitudes ?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;L’un des principaux risques pour l’activité de Yaal Coop actuellement est la proportion de revenus liée à un seul client, Portail RSE, dont la pérennité dépend de politiques publiques.&lt;/li&gt;
&lt;li&gt;De façon récurrente, la coopérative manque de compétences en commerce et en communication : Trouver de nouveaux clients est complexe, et il est donc aujourd’hui difficile de dire quels seront nos revenus et nos missions futures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En réponse à cette problématique, Yaal Coop augmente sa présence au sein de ses réseaux et rejoint des groupements d’entreprise pour répondre à des marchés publics.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La disponibilité des développeur·euses senior est limitée, et rend complexe l’embarquement des développeur·euses junior sur des projets existants et sur le lancement de nouveaux projets.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;🟡&lt;/h1&gt;
&lt;h2&gt;Ce qu'il s'est passé entre la clôture de l'année et l'AG :&lt;/h2&gt;
&lt;p&gt;Début 2025, Loan est en congé paternité. Fin janvier 2025, l’équipe est de nouveau au complet.&lt;/p&gt;
&lt;p&gt;Les derniers développements sur Canaille couverts par le financement NLNet sont réalisés en début d’année, et la dernière demande de financements acceptée début mai.&lt;/p&gt;
&lt;p&gt;Yaal Coop a accueilli les journées Libre Entreprise au printemps 2025.&lt;/p&gt;
&lt;h1&gt;🟡&lt;/h1&gt;
&lt;h2&gt;2025, et après ?&lt;/h2&gt;
&lt;p&gt;Yaal Coop a pour projet courant 2025 l’intégration à La Zone, union de coopératives dont l’objectif est la réponse à des marchés publics, notamment les marchés interministériels d’attributaires comme beta.gouv.&lt;/p&gt;
&lt;p&gt;La coopérative répond également à différents marchés publics en cours, en groupement avec d’autres coopératives.&lt;/p&gt;
&lt;p&gt;Les projets en cours sont poursuivis.&lt;/p&gt;
&lt;p&gt;Yaal Coop se regroupe avec d’autres acteurs du logiciel libre et de la fourniture de services cloud, IndieHosters, OpenSource Politics et Le Bureau coop pour proposer La Suite.coop, une suite d’outils numériques libres pour les organisations collaboratives.&lt;/p&gt;
&lt;p&gt;Nous n’excluons pas de faire de nouveau appel à la fondation NLNet pour de futurs développements sur Canaille.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Une conclusion ?&lt;/h2&gt;
&lt;p&gt;Et voilà, c'est le clap de fin pour ce résumé de notre année 2024, et un extrait de ce qu'il s'est passé pour nous début 2025.&lt;/p&gt;
&lt;p&gt;On espère que la lecture vous a plu, ou au moins un petit peu informé, et on se retrouve l'an prochain.&lt;/p&gt;
&lt;p&gt;Brunélie, pour Yaal Coop&lt;/p&gt;</content><category term="Vie coopérative"/><category term="coop"/><category term="vie coopérative"/></entry><entry><title>Canaille obtient la certification OpenID Connect</title><link href="https://yaal.coop/blog/canaille-oidc-certification" rel="alternate"/><published>2025-09-12T00:00:00+02:00</published><updated>2025-09-12T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-09-12:/blog/canaille-oidc-certification</id><summary type="html">&lt;p&gt;Depuis sa version 0.0.82, notre gestionnaire d'identité léger Canaille est certifié par la fondation OpenID.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Depuis sa version 0.0.82, &lt;a href="https://canaille.readthedocs.io"&gt;Canaille&lt;/a&gt; a obtenu la certification OpenID Connect par la fondation OpenID pour les profils &lt;em&gt;Basic&lt;/em&gt; et &lt;em&gt;Dynamic&lt;/em&gt;.
Canaille est désormais listée parmi &lt;a href="https://openid.net/developers/certified-openid-connect-implementations/"&gt;les implémentations officielles&lt;/a&gt;.
Ce développement fait partie de notre &lt;a href="https://yaal.coop/blog/canaille-nlnet-pytest-iam"&gt;subvention par la fondation NLNet&lt;/a&gt;, et a nécessité que nous améliorions la bibliothèque logicielle &lt;a href="https://github.com/authlib/authlib"&gt;Authlib&lt;/a&gt; sur laquelle Canaille s'appuie.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://openid.net/developers/certified-openid-connect-implementations/"&gt;&lt;img alt="Canaille OIDC certification" src="/media/blog/articles/canaille-oidc-certification.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Il ne nous reste &lt;a href="https://gitlab.com/yaal/canaille/-/milestones"&gt;plus grand chose&lt;/a&gt; avant de quitter la version Alpha !&lt;/p&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Canaille obtains the OpenID Connect certification</title><link href="https://yaal.coop/blog/en/canaille-oidc-certification" rel="alternate"/><published>2025-09-12T00:00:00+02:00</published><updated>2025-09-12T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-09-12:/blog/en/canaille-oidc-certification</id><summary type="html">&lt;p&gt;Since version 0.0.82, our lightweight identity provider Canaille is certified by the OpenID foundation.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Since version 0.0.82, &lt;a href="https://canaille.readthedocs.io"&gt;Canaille&lt;/a&gt; obtained the OpenID Connect certification by the OpenID for the &lt;em&gt;Basic&lt;/em&gt; and &lt;em&gt;Dynamic&lt;/em&gt; profiles
It is now listed among the &lt;a href="https://openid.net/developers/certified-openid-connect-implementations/"&gt;official implementations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This development is part of our &lt;a href="https://yaal.coop/blog/en/canaille-nlnet-pytest-iam"&gt;grant by the NLNet foundation&lt;/a&gt;,
and required that we improve the &lt;a href="https://github.com/authlib/authlib"&gt;Authlib&lt;/a&gt; library on which Canaille relies upon.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://openid.net/developers/certified-openid-connect-implementations/"&gt;&lt;img alt="Canaille OIDC certification" src="/media/blog/articles/canaille-oidc-certification.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is &lt;a href="https://gitlab.com/yaal/canaille/-/milestones"&gt;only a few things to achieve&lt;/a&gt; before we can leave the Alpha versions!&lt;/p&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Je code, je coop</title><link href="https://yaal.coop/blog/interview-je-code-je-coop" rel="alternate"/><published>2025-08-06T00:00:00+02:00</published><updated>2025-08-06T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-08-06:/blog/interview-je-code-je-coop</id><summary type="html">&lt;p&gt;L’interview d’Éloi pour le projet « Je code, je coop », porté par la coopérative bordelaise Noesya.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Chez Yaal Coop, nous proposons régulièrement des temps d'échange informel avec des gens qu'on ne connaît pas encore, mais avec qui on pense partager des centres d'intérêt ou des valeurs.
Souvent ce sont des contributeurs de logiciels libres ou bien d'autres coopératives dans l'informatique.
Parmi elles, le mois dernier nous rencontrions &lt;a href="https://www.hizkia.eu"&gt;Hizkia&lt;/a&gt; une SCOP de Bayonne qui développe des outils industriels et de gestion,
&lt;a href="https://hashbang.coop"&gt;Hashbang&lt;/a&gt;, une SCOP de Pythonistes à Lyon,
et nos voisins de &lt;a href="https://noesya.coop"&gt;Noesya&lt;/a&gt; à Bordeaux, qui se spécialisent dans l'éco-conception et la réalisation de sites légers et accessibles. De belles rencontres chacune.&lt;/p&gt;
&lt;p&gt;Noesya développe le projet « &lt;a href="https://jecode.coop"&gt;Je code, je coop&lt;/a&gt; », qui recense des interviews de développeurs dans des coopératives.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jecode.coop"&gt;&lt;img alt="Je code, je coop" src="/media/blog/articles/logo-jecode-jecoop.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Éloi a joué le jeu de l'interview, que vous pouvez consulter ici :&lt;/p&gt;
&lt;div style="padding:56.25% 0 0 0;position:relative;"&gt;&lt;iframe src="https://player.vimeo.com/video/1101491412?badge=0&amp;amp;autopause=0&amp;amp;player_id=0&amp;amp;app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerpolicy="strict-origin-when-cross-origin" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Interview Je code, je coop avec Eloi - 2025:07:11 13-56 CEST - Recording"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;script src="https://player.vimeo.com/api/player.js"&gt;&lt;/script&gt;

&lt;p&gt;Et d'ailleurs en octobre 2024 on répondait à une interview écrite pour le site &lt;a href="https://codecode.coop/temoignages/yaal-coop.html"&gt;codecode.coop&lt;/a&gt;, qui est un projet similaire porté par &lt;a href="https://www.codeursenliberté.fr"&gt;Codeurs en liberté&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://codecode.coop"&gt;&lt;img alt="Code code coop" src="/media/blog/articles/logo-codecodecoop.webp"&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="Vie coopérative"/><category term="coop"/><category term="vie coopérative"/></entry><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant le printemps 2025</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-printemps-2025" rel="alternate"/><published>2025-06-21T00:00:00+02:00</published><updated>2025-06-21T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-06-21:/blog/dernieres-contributions-logiciels-libres-printemps-2025</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant le printemps 2025.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Mécénat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; pour son travail sur &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, un chouette framework CSS que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; pour son travail sur &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, une bibliothèque python d'authentification que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://django-sesame.readthedocs.io"&gt;django-sesame&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Authentication facile par des liens magiques pour tout projet Django&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/aaugustin/django-sesame/pull/113"&gt;Utilisation de f-string pour les messages d'exception&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://magic-wormhole.readthedocs.io"&gt;Magic-Wormhole&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Obtenir des fichiers d'un ordinateur à l'autre, en sécurité&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suppression des préfixes 'u' des chaînes de caractères pour &lt;a href="https://github.com/magic-wormhole/magic-wormhole/pull/636"&gt;le client&lt;/a&gt; et &lt;a href="https://github.com/magic-wormhole/magic-wormhole-transit-relay/pull/51"&gt;le serveur relai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Utilisation directe de classes plutôt que des appels à &lt;code&gt;type()&lt;/code&gt; pour &lt;a href="https://github.com/magic-wormhole/magic-wormhole/pull/637"&gt;le client&lt;/a&gt; et le &lt;a href="https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/55"&gt;serveur mailbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mise-à-jour de la documentation (&lt;a href="https://github.com/magic-wormhole/magic-wormhole/pull/638"&gt;suppression de détails concernant les types de python2&lt;/a&gt;, &lt;a href="https://github.com/magic-wormhole/magic-wormhole/pull/634"&gt;mise-à-jour de la version minimale de Python dans le fichier README.md&lt;/a&gt; et &lt;a href="https://github.com/magic-wormhole/magic-wormhole-transit-relay/pull/52"&gt;mise-à-jour d'une URL&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/magic-wormhole/magic-wormhole/pull/642"&gt;Remplacement de formatage de chaînes de caractères en f-strings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pspdev.github.io/pspsdk/index.html"&gt;PSPSDK&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Ensemble d'outils et de bibliothèques pour la console PSP de Sony&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspdev.github.io/pull/84"&gt;Correction d'alertes (deprecation warnings) produit par CMake&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/271"&gt;Amélioration de la recherche et des liens vers des constantes&lt;/a&gt; dans la documentation produite par Doxygen&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/273"&gt;Correction d'alertes (deprecation warnings) liées à des configurations obsolètes&lt;/a&gt; dans la documentation produite par Doxygen&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/275"&gt;Déplacement de la documentation générée dans un répertoire dédié&lt;/a&gt; pour éviter de supprimer un fichier involontairement&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/280"&gt;Ajout du Code de Conduite&lt;/a&gt; dans la documentation produite par Doxygen&lt;/li&gt;
&lt;li&gt;Suppression de macros inutilisées (&lt;a href="https://github.com/pspdev/pspsdk/pull/281"&gt;1&lt;/a&gt; et &lt;a href="https://github.com/pspdev/pspsdk/pull/283"&gt;2&lt;/a&gt;) et de variables inutilisées (&lt;a href="https://github.com/pspdev/pspsdk/pull/284"&gt;1&lt;/a&gt; et &lt;a href="https://github.com/pspdev/pspsdk/pull/292"&gt;2&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/278"&gt;Définition unique d'une constante&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/291"&gt;Remplacement d'un test par une assignation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/294"&gt;Correction du but d'un fichier d'exemple dans le commentaire d'en-tête&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/Bogdanp/dramatiq"&gt;dramatiq&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Un exécuteur de tâches rapide et fiable pour Python 3&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Bogdanp/dramatiq/pull/688"&gt;La dépendence à Prometheus est désormais facultative&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/pytest-dev/pytest-scim2-server"&gt;pytest-scim2-server&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Une fixture fournissant un serveur SCIM2 pour Pytest&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/pytest-scim2-server/#history"&gt;3 nouvelles versions&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest-scim2-server/pull/1"&gt;Implémentation d'une option pour désactiver la journalisation du serveur&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/authlib/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque Python de gestion des identités et des accès&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/authlib/#history"&gt;2 nouvelles versions&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/728"&gt;Correction de caractères invalides dans les descriptions des erreurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/729"&gt;Interdiction d'utiliser des fragments d'URL dans les URIs de redirection&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/732"&gt;'none' et 'RS256' ne sont plus des valeurs obligatoires pour &lt;code&gt;request_object_signing_alg_values_supported&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/733"&gt;Correction d'une erreur lorsque RFC9207 est activée et que la réponse à la requête d'authentification n'est pas une redirection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/736"&gt;Utilisation de tox-uv et pre-commit-uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/739"&gt;Documentation sur la gestion des erreurs avec Flask et OAuth2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/742"&gt;Documentation sur l'utilisation de la méthode &lt;code&gt;generate_client_registration_info&lt;/code&gt; de la RFC7591&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/743"&gt;Support des paramètres 'acr' et 'amr' dans id_token&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/745"&gt;Suppression de la méthode dépréciée &lt;code&gt;check_token_endpoint_auth_method&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/746"&gt;Style d'assertions de Pytest dans les tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/748"&gt;Dépréciation de l'utilisation d'objets différents de &lt;code&gt;OAuth2Request&lt;/code&gt; dans la méthode &lt;code&gt;create_authorization_request&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/749"&gt;Implémentation de la spécification &lt;em&gt;RFC9101 JWT secured authentication requests (JAR)&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/750"&gt;Ajout du pre-commit &lt;em&gt;codespell&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/751"&gt;Correction du paramètre 'state' manquant dans les erreurs de requête d'authentification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/761"&gt;Correction de l'ordre des valeurs du paramètre &lt;code&gt;response_types&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/762"&gt;Les erreurs &lt;code&gt;unsupported_response_type&lt;/code&gt; sont redirigées&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/765"&gt;Mise à jour des URLs pour pointer vers le nouveau dépôt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/767"&gt;Les tests unitaires ignorent l'algorithme &lt;code&gt;xc20p&lt;/code&gt; lorsqu'il n'est pas disponible dans cryptodome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/774"&gt;Support du terminal OIDC &lt;em&gt;UserInfo&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/776"&gt;Clarify the license permissions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/authlib/joserfc"&gt;joserfc&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Implémentation des normes JOSE en Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/39"&gt;Respect RFC6749 character set in error descriptions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/43"&gt;Pre-commit configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/46"&gt;Add a tox configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/pytest-dev/pytest-iam"&gt;pytest-iam&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur OAuth2/OIDC léger pour suites de tests unitaires&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/pytest-iam/#history"&gt;3 nouvelles versions&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest-iam/pull/4"&gt;Implémentation d'un client de tests embarqué&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/authlib/otpauth"&gt;otpauth&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Implémentation de mots de passe à usage unique en Python.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/otpauth/pull/13"&gt;Support pour les caractères non-ascii&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/Pylons/webtest"&gt;webtest&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque de tests unitaires pour applications web&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Pylons/webtest/pull/268"&gt;Suppression des espaces autour de la valeurs des balises &lt;code&gt;&amp;lt;option&amp;gt;&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/15five/scim2-filter-parser"&gt;scim2-filter-parser&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Un analyseur / transpileur personnalisable pour les filtres SCIM2.0&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/15five/scim2-filter-parser/pull/62"&gt;Correction d'une erreurs dans le fichier README&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;Canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur d’identité et d'autorisations ultra-léger&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/canaille/#history"&gt;8 nouvelles versions&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/264"&gt;Implémentations de meilleurs valeurs de configuration par défaut&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/265"&gt;Correction d'une erreur sur la validation instantannée du champs « téléphone »&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/267"&gt;Correction de l'authentification par JWT des clients OIDC pour les flux &lt;code&gt;refresh_token&lt;/code&gt; et &lt;code&gt;password&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/268"&gt;Tous les &lt;code&gt;id_token&lt;/code&gt; ont une en-tête &lt;code&gt;kid&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/269"&gt;Support de la méthode POST sur le point terminal d'autorisation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/270"&gt;Implémentation des valeurs &lt;code&gt;login&lt;/code&gt; et &lt;code&gt;consent&lt;/code&gt; pour le paramètre OIDC &lt;code&gt;prompt&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/271"&gt;Les clients sans portée definie n'imposent pas de restriction sur la portée des jetons qu'ils émettent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/272"&gt;Correction du paramètre 'address' du point terminal &lt;em&gt;UserInfo&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/273"&gt;Implémentation de la norme &lt;em&gt;RFC9101 JWT-Secured Authorization Request (JAR)&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/274"&gt;Implémentation du point terminal &lt;em&gt;UserInfo&lt;/em&gt; avec Authlib&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/276"&gt;Refonte de la configuration JWKS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/279"&gt;Refonte du processus d'authentification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/280"&gt;Correction des problèmes de focus sur le champs « email »&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Spring 2025 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-printemps-2025" rel="alternate"/><published>2025-06-21T00:00:00+02:00</published><updated>2025-06-21T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-06-21:/blog/en/dernieres-contributions-logiciels-libres-printemps-2025</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during spring 2025.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Sponsoring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; for his work on &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, a nice CSS framework we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI is used on other tools we rely on, like &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; for his work on &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, a python authentication library we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://django-sesame.readthedocs.io"&gt;django-sesame&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Frictionless authentication with “Magic Links” for Django project&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/aaugustin/django-sesame/pull/113"&gt;Use f-string for exception messages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://magic-wormhole.readthedocs.io"&gt;Magic-Wormhole&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Get files from one computer to another, safely&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove 'u' prefix to strings for &lt;a href="https://github.com/magic-wormhole/magic-wormhole/pull/636"&gt;the client&lt;/a&gt; and &lt;a href="https://github.com/magic-wormhole/magic-wormhole-transit-relay/pull/51"&gt;the relay server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Use classes directly instead of type() calls for &lt;a href="https://github.com/magic-wormhole/magic-wormhole/pull/637"&gt;the client&lt;/a&gt; and the &lt;a href="https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/55"&gt;mailbox server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update documentation (&lt;a href="https://github.com/magic-wormhole/magic-wormhole/pull/638"&gt;remove details about python2 types&lt;/a&gt;, &lt;a href="https://github.com/magic-wormhole/magic-wormhole/pull/634"&gt;update minimal Python version in README.md&lt;/a&gt; and &lt;a href="https://github.com/magic-wormhole/magic-wormhole-transit-relay/pull/52"&gt;update tox URL&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/magic-wormhole/magic-wormhole/pull/642"&gt;Replace formatted strings to f-strings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://pspdev.github.io/pspsdk/index.html"&gt;PSPSDK&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Collection of tools and libraries written for Sony's Playstation Portable (PSP) gaming console&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspdev.github.io/pull/84"&gt;Fix CMake deprecation warnings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/271"&gt;Search improvement and link to constants&lt;/a&gt; in documentation generated by Doxygen&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/273"&gt;Fix obsolete tags warnings&lt;/a&gt; in documentation generated by Doxygen&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/275"&gt;Move generated documentation in dedicated directory&lt;/a&gt; to avoid to delete a file involuntary&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/280"&gt;Add Code of Conduct in generated documentation&lt;/a&gt; in documentation generated by Doxygen&lt;/li&gt;
&lt;li&gt;Delete unused macros (&lt;a href="https://github.com/pspdev/pspsdk/pull/281"&gt;1&lt;/a&gt; and &lt;a href="https://github.com/pspdev/pspsdk/pull/283"&gt;2&lt;/a&gt;) and unused variables (&lt;a href="https://github.com/pspdev/pspsdk/pull/284"&gt;1&lt;/a&gt; et &lt;a href="https://github.com/pspdev/pspsdk/pull/292"&gt;2&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/278"&gt;Only one constant definition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/291"&gt;Replace a statement by an assigment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/294"&gt;Fix goal of the file in the header comment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/Bogdanp/dramatiq"&gt;dramatiq&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A fast and reliable background task processing library for Python 3.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Bogdanp/dramatiq/pull/688"&gt;Make the Prometheus dependency optional&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/pytest-dev/pytest-scim2-server"&gt;pytest-scim2-server&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM2 server fixture for Pytest&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://pypi.org/project/pytest-scim2-server/#history"&gt;3 new versions&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest-scim2-server/pull/1"&gt;Option to disable server logging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/authlib/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The ultimate Python library in building OAuth, OpenID Connect clients and servers. JWS,JWE,JWK,JWA,JWT included.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://pypi.org/project/authlib/#history"&gt;2 new versions&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/728"&gt;Fix invalid characters in error descriptions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/729"&gt;Forbid URL fragments in redirection URIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/732"&gt;Allow &lt;code&gt;request_object_signing_alg_values_supported&lt;/code&gt; to not contain 'none' and 'RS256'&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/733"&gt;Fix an issue when RFC9207 is enabled and the authorization response is not a 302&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/736"&gt;Use tox-uv and pre-commit-uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/739"&gt;Update Flask OAuth2 example to show error management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/742"&gt;Example for RFC7591 &lt;code&gt;generate_client_registration_info&lt;/code&gt; usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/743"&gt;Support for 'acr' and 'amr' claims in id_token&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/745"&gt;Remove deprecated &lt;code&gt;check_token_endpoint_auth_method&lt;/code&gt; method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/746"&gt;Use pytest style assertions in the test suite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/748"&gt;Deprecate passing non &lt;code&gt;OAuth2Request&lt;/code&gt; objects in &lt;code&gt;create_authorization_request&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/749"&gt;Implement RFC9101 JWT secured authentication requests (JAR)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/750"&gt;Add codespell pre-commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/751"&gt;Fix missing 'state' param in authorization error responses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/761"&gt;Fix &lt;code&gt;response_types&lt;/code&gt; order unwanted strictness during dynamic client registration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/762"&gt;&lt;code&gt;unsupported_response_type&lt;/code&gt; errors are redirected&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/765"&gt;Update links to match the new repository URL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/767"&gt;Skip &lt;code&gt;xc20p&lt;/code&gt; algorithm unit tests when unavailable in cryptodome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/774"&gt;OIDC userinfo endpoint support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/776"&gt;Clarify the license permissions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/authlib/joserfc"&gt;joserfc&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Implementations of JOSE RFCs in Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/39"&gt;Respect RFC6749 character set in error descriptions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/43"&gt;Pre-commit configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/joserfc/pull/46"&gt;Add a tox configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/pytest-dev/pytest-iam"&gt;pytest-iam&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A lightweight and fully functional OAuth2 / OpenID Connect (OIDC) / SCIM server to be used in test suites.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://pypi.org/project/pytest-iam/#history"&gt;3 new versions&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest-iam/pull/4"&gt;Implement an embedded test client&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/authlib/otpauth"&gt;otpauth&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Implements two-step verification of HOTP/TOTP. Also known as one time password.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/otpauth/pull/13"&gt;Handle non-ascii characters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/Pylons/webtest"&gt;webtest&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Wraps any WSGI application and makes it easy to send test requests to that application, without starting up an HTTP server.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Pylons/webtest/pull/268"&gt;Strip HTML option tag text&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/15five/scim2-filter-parser"&gt;scim2-filter-parser&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A customizable parser/transpiler for SCIM2.0 filters&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/15five/scim2-filter-parser/pull/62"&gt;Fix a typo in the README&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;Canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lightweight identity and authorization management software&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We released &lt;a href="https://pypi.org/project/canaille/#history"&gt;8 new versions&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/264"&gt;Better configuration defaults&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/265"&gt;Fix the phone number HTMX form raising a 400 error&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/267"&gt;Fix client JWT authentication for OIDC refresh_token and password grants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/268"&gt;Ensure &lt;code&gt;id_token&lt;/code&gt; has a &lt;code&gt;kid&lt;/code&gt; header&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/269"&gt;Support for POST method at the Authorization endpoint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/270"&gt;Implement OIDC login and consent prompts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/271"&gt;Clients without scope defined don't restrict scopes for token emission&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/272"&gt;Fix userinfo 'address' claim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/273"&gt;Implement RFC9101 JWT-Secured Authorization Request (JAR)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/274"&gt;Implement the UserInfo endpoint with Authlib&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/276"&gt;Rework the JWKS configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/279"&gt;Authentication process overhaul&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/280"&gt;Fix the email field focus with HTMX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Yaal Coop accueille les journées Libre Entreprise 2025</title><link href="https://yaal.coop/blog/yaal-coop-accueille-les-journees-libre-entreprise" rel="alternate"/><published>2025-05-05T00:00:00+02:00</published><updated>2025-05-05T00:00:00+02:00</updated><author><name>Sébastien Birolleau &lt;sebastien@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-05-05:/blog/yaal-coop-accueille-les-journees-libre-entreprise</id><summary type="html">&lt;p&gt;Yaal Coop a accueilli pour la première fois les journées Libre Entreprise.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Les 24 et 25 avril 2025 se sont déroulées les journées Libre Entreprises comme chaque année. C'est l'occasion pour le réseau de se retrouver pour un moment convivial et de partage. Cette année, Yaal Coop accueillait pour la première fois l'événement.&lt;/p&gt;
&lt;h2&gt;Libre Entreprise, c'est quoi ?&lt;/h2&gt;
&lt;p&gt;Le réseau &lt;a href="https://libre-entreprise.org/"&gt;Libre entreprise&lt;/a&gt; est un groupement d'entreprises qui partagent des valeurs communes fortes : la promotion du logiciel libre, la transparence, l'horizontalité, l'autogestion et une juste répartition de la rémunération.&lt;/p&gt;
&lt;p&gt;Initié par 3 entreprises fondatrices, le réseau voit le jour en 2000. Aujourd'hui, &lt;a href="https://libre-entreprise.org/liste-des-entreprises/"&gt;12 entreprises&lt;/a&gt; libres continuent de faire vivre et évoluer ces valeurs avec autant de conviction qu'il y a 25 ans.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://libre-entreprise.org/charte/"&gt;Notre charte&lt;/a&gt; le raconte à sa manière.&lt;/p&gt;
&lt;h2&gt;À la découverte du réseau LE&lt;/h2&gt;
&lt;p&gt;Entre nous, on parle du réseau LE ou simplement LE que l'on prononce : "elleux".
&lt;em&gt;Un heureux hasard quand on défend aussi l'inclusivité au sein de nos entreprises libres.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;J'ai intégré &lt;a href="https://yaal.coop/"&gt;Yaal Coop&lt;/a&gt; il y a quelques mois, en octobre 2024. Ma rencontre du réseau Libre entreprise est une totale découverte, et les journées LE une grande première.&lt;/p&gt;
&lt;p&gt;Au delà des personnalités engagées et ouvertes du réseau, j'ai surtout découvert un collectif porteur d'une ambition vieille de 25 ans et qui récolte aujourd'hui quelques lauriers. Le logiciel libre aurait très bien pu finir oublié ou relégué à un système marginal, mais les promoteurs et créateurs ont su, par leur engagement et leur persévérance faire connaître et reconnaître ses valeurs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la liberté d'utiliser le logiciel&lt;/li&gt;
&lt;li&gt;la liberté de copier le logiciel&lt;/li&gt;
&lt;li&gt;la liberté d'étudier le logiciel&lt;/li&gt;
&lt;li&gt;la liberté de modifier le logiciel et de redistribuer les versions modifiées.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Derrière ces principes, se dressent des idées plus grandes, plus larges, des valeurs humaines au-delà du logiciel, une vision sociétale qui vise à replacer la coopération des individus au centre et en priorité des rapports de rentabilité, de profit et de propriété.&lt;/p&gt;
&lt;h2&gt;Les journées LE&lt;/h2&gt;
&lt;p&gt;Organisées en forum ouvert (ou non-convention), plusieurs sujets ont été proposés puis traités sous formes diverses : débats, ateliers, présentation, échanges d'expériences, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le tout régit par des règles contraignantes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les personnes présentes sont les bonnes personnes,&lt;/li&gt;
&lt;li&gt;ça commence quand ça commence,&lt;/li&gt;
&lt;li&gt;ça finit quand ça finit,&lt;/li&gt;
&lt;li&gt;ce qui se passe est ce qui pouvait arriver de meilleur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Et une loi impérative :&lt;/strong&gt;
la loi des deux pieds. Si je ne participe pas et que je n'apprends rien, alors je suis mes deux pieds pour faire autre chose, quoique ce soit. Ainsi, on peut sortir et rejoindre un sujet quand bon nous semble et personne ni ne se vexe, ni ne juge, puisque nous sommes contraints de nous soumettre à cette loi supérieure entre toutes.&lt;/p&gt;
&lt;h4&gt;Immersion&lt;/h4&gt;
&lt;p&gt;Après un temps de proposition d'ateliers et réservations de salles et créneaux, notre &lt;strong&gt;première journée&lt;/strong&gt; pouvait commencer.
Un suivi en direct de tout ce qui est abordé est possible grâce à une prise de note commune. Ainsi, tout en assistant à une présentation, je peux suivre le débat qui a lieu quelques mètres plus loin via le pad.&lt;/p&gt;
&lt;p&gt;J'ai d'abord assisté à l'atelier de création d'une matrice des compte-rendus LE. Chaque mois, chaque entreprise libre produit un compte rendu à l'attention du réseau. Ces compte rendus sont l'occasion de générer des échanges et de provoquer des résolutions et conseils au sein du réseau. Il était important de revenir sur ce pilier de notre fonctionnement en proposant une matrice qui recense les sujets attendus par les lecteurs.&lt;/p&gt;
&lt;p&gt;Nous avons ensuite enchaîné avec la Communication du réseau. Nous avons réfléchi à comment marquer notre identité et comment communiquer sur le réseau LE et ses membres au sens large. Nous allons tester à petite échelle sur &lt;a href="https://matrix.to/#/#bonjour-libre-entreprise:codelutin.com"&gt;notre salon public&lt;/a&gt; dans un premier temps. Nos efforts pourraient également aboutir à la création d'un forum LE.&lt;/p&gt;
&lt;p&gt;J'ai ensuite suivi les échanges entre plusieurs membres historiques du réseau sur leurs problématiques liées au nombre de salariées, au besoin d'un nouveau souffle, au manque d'implication, etc. Ces échanges sont éloignées des problématiques d'une jeune coopérative comme Yaal Coop, mais il n'en reste que ces flux d'expériences et de diversité sont très enrichissants.&lt;/p&gt;
&lt;p&gt;Cette première journée s'est poursuivi autour d'un verre suivi d'un dîner au restaurant. Miam !&lt;/p&gt;
&lt;p&gt;Lors de la &lt;strong&gt;deuxième journée&lt;/strong&gt;, l'organisation a été plus informelle. Un nouveau sujet était proposée à la volée à la clôture du précédent. S'en suivaient alors des échanges entre les participants jusqu'à clôture du sujet. Nous avons échangé sur les méthodes de communication et les formations afférentes, l'équilibre vie pro/perso, Les finances, la communication interne...&lt;/p&gt;
&lt;p&gt;J'ai malheureusement manqué certains ateliers, dont j'ai pu saisir la teneur via les compte-rendus. Ainsi, bien d'autres sujets ont été abordés et débattus : les embauches, la protection du gérant, la gouvernance et la prise de décision, (...), et notre projet commun : le Label RSE Libre Entreprise&lt;/p&gt;
&lt;h2&gt;En conclusion&lt;/h2&gt;
&lt;p&gt;Cette expérience enrichissante (que je serai ravi de renouveler l'année prochaine) m'aura appris à mieux comprendre et connaître les motivations et les enjeux de notre réseau d'entreprises libres. Nous avons à cœur de nous soutenir et de nous entraider avec l'ambition d'agir sur notre société, de créer une proposition nouvelle. Du moins, être innovants au sein de nos structures, c'est déjà beaucoup. Chaque entité du réseau se questionne sur le rapport au travail, sur la qualité de vie, sur notre impact sociétal. chacune multiplie aussi les tentatives et reste à l'écoute pour toujours améliorer et parfaire nos fonctionnements internes et nos rapports avec nos partenaires et clients.&lt;/p&gt;
&lt;p&gt;Le réseau &lt;a href="https://libre-entreprise.org/"&gt;Libre entreprise&lt;/a&gt; transcende le logiciel libre pour devenir un espace d'entraide et d'engagement afin de promouvoir des modèles plus justes et respectueux de l'humain.&lt;/p&gt;</content><category term="Vie coopérative"/><category term="Vie coopérative"/></entry><entry><title>Dernières nouvelles et fonctionnalités de Canaille</title><link href="https://yaal.coop/blog/canaille-nlnet-features-releases" rel="alternate"/><published>2025-03-28T00:00:00+01:00</published><updated>2025-03-28T00:00:00+01:00</updated><author><name>Brunélie Lauret &lt;brunelie@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-03-28:/blog/canaille-nlnet-features-releases</id><summary type="html">&lt;p&gt;Résumé des derniers développements sur notre logiciel de gestion d'identités et d'authentification, Canaille.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Nos dernières nouvelles&lt;/h1&gt;
&lt;p&gt;L'année 2024 s'est terminée avec de nombreux nouveaux développements sur Canaille, financés par &lt;a href="https://nlnet.nl/"&gt;NLNet&lt;/a&gt; ! Vous pouvez en lire plus à ce sujet sur &lt;a href="https://yaal.coop/blog/canaille-nlnet-security-features"&gt;l'article de blog dédié à ces développements&lt;/a&gt;. Nous avons poursuivi ces développements, toujours grâce au même financement. Lisez la suite pour en savoir plus !&lt;/p&gt;
&lt;h2&gt;Audit de sécurité et correctifs&lt;/h2&gt;
&lt;p&gt;Un audit de sécurité a été conduit par &lt;a href="https://www.radicallyopensecurity.com/"&gt;Radically Open Security&lt;/a&gt; courant février, avec pour objectif la découverte de potentielles failles dans notre produit, et l'implémentation de correctifs avant la fin mars.&lt;/p&gt;
&lt;h3&gt;Amélioration de la sécurité de la réinitialisation du mot de passe&lt;/h3&gt;
&lt;p&gt;L'ajout de la variable de configuration de flask &lt;code&gt;TRUSTED_HOSTS&lt;/code&gt; (&lt;a href="https://flask.palletsprojects.com/en/stable/config/#TRUSTED_HOSTS"&gt;documentation ici&lt;/a&gt;) évite à nos liens magiques d'inscription et de réinitialisation de mot de passe d'être falsifiés par des hôtes malveillants.&lt;/p&gt;
&lt;p&gt;Nous avons également amélioré la façon dont ces liens sont générés pour les rendre plus sécurisés et leur implémenter une durée de validité définie.&lt;/p&gt;
&lt;h3&gt;Vulnérabilité de récupération de logo&lt;/h3&gt;
&lt;p&gt;Nous avons corrigé une vulnérabilité qui aurait pu théoriquement permettre la falsification de requêtes serveur (SSRF) au moment de récupérer le logo de l'application.&lt;/p&gt;
&lt;h3&gt;Meilleure validation d'URL&lt;/h3&gt;
&lt;p&gt;La validation de l'adresse de site internet d'utilisateur a été améliorée, elle est mainteant plus restrictive.&lt;/p&gt;
&lt;h3&gt;Implémentation de la Content Security Policy&lt;/h3&gt;
&lt;p&gt;Content Security Policy (CSP) a été implémentée dans Canaille via &lt;a href="https://github.com/GoogleCloudPlatform/flask-talisman"&gt;Flask-Talisman&lt;/a&gt;. CSP rend notre application plus robuste, notamment face aux attaques "cross-site scripting" (XSS).&lt;/p&gt;
&lt;h2&gt;Certification OIDC&lt;/h2&gt;
&lt;p&gt;Le processus de certification OpenID a été beaucoup plus complexe que prévu pour notre équipe. Nous avons fait de nombreux progrès et implémenté de nombreuses fonctionnalités liées à OpenID, dans le but d'obtenir la certification et d'en faire passer les tests automatisés. Dans ce cadre, nous avons contribué et soulevé des &lt;em&gt;issues&lt;/em&gt; chez &lt;a href="https://github.com/lepture/authlib/issues"&gt;Authlib&lt;/a&gt;, pour un meilleur support de la spécification OpenID en amont.&lt;/p&gt;
&lt;p&gt;Nous avons notamment :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implémenté la spécification sur la validation d'URIs de redirection&lt;/li&gt;
&lt;li&gt;Mis à jour nos modèles pour implémenter les attribus requis par OIDC.&lt;/li&gt;
&lt;li&gt;Affiché les liens vers les conditions d'utilisation et les politiques de confidentialité lorsque le client demandant l'autorisation nous les fournit.&lt;/li&gt;
&lt;li&gt;Affiché la plupart des erreurs de requête en format JSON.&lt;/li&gt;
&lt;li&gt;Implémenté les réponses au format JSON Web Token lorsque le client le requiert.&lt;/li&gt;
&lt;li&gt;Amélioré la gestion des JWT et des JWKS  de Canaille.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Paquets : Image Docker&lt;/h2&gt;
&lt;p&gt;Canaille peut être testé plus facilement grâce à la création d'une image docker, hébergée sur un répertoire public. Les utilisateurs peuvent découvrir Canaille avec un profil administrateur.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;La création de cette image docker a été rendue possible par la construction d'un paquet nix.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Audit d'accessibilité et améliorations&lt;/h2&gt;
&lt;p&gt;Canaille a bénéficié d'un audit d'accessibilité conduit par &lt;a href="https://www.hanuniversity.com/en/"&gt;HAN accessibility lab&lt;/a&gt;. Les résultats ont souligné plusieurs problèmes de contrastes ainsi qu'un manque de différenciation entre les liens et le texte non interactif, et quelques soucis de navigation au clavier.&lt;/p&gt;
&lt;h3&gt;Améliorations d'accessibilité&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;La plupart des soucis de contraste ont été corrigés.&lt;/li&gt;
&lt;li&gt;La plupart des soucis de différentiation des liens et des éléments interactifs ont été corrigés.&lt;/li&gt;
&lt;li&gt;Un lien d'évitement a été ajouté en haut de chaque page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Approvisionnement SCIM&lt;/h2&gt;
&lt;p&gt;Canaille fournissait déjà une implémentation de serveur SCIM depuis notre &lt;a href="https://yaal.coop/blog/en/canaille-nlnet-security-features"&gt;dernière mise à jour de sécurité&lt;/a&gt;. Maintenant, l'application dispose également des fonctionnalités de client SCIM, permettant à une instance Canaille de propager automatiquement les changements d'utilisateurs et de groupes aux applications client. Cette fonctionnalité devrait rendre plus simple le maintien de la synchronisation entre toutes les applications sans plus d'intervention utilisateur.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Merci de nous avoir lu ! Nous vous tiendrons au courant de nos prochaines avancées, et vous pouvez dès maintenant lire nos autres contributions au logiciel libre dans nos articles de contributions saisonnières.&lt;/p&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>New features and latest news on Canaille</title><link href="https://yaal.coop/blog/en/canaille-nlnet-features-releases" rel="alternate"/><published>2025-03-28T00:00:00+01:00</published><updated>2025-03-28T00:00:00+01:00</updated><author><name>Brunélie Lauret &lt;brunelie@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-03-28:/blog/en/canaille-nlnet-features-releases</id><summary type="html">&lt;p&gt;Summary of the latest developments on our identity and authentication management software, Canaille.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Our latest news&lt;/h1&gt;
&lt;p&gt;2024 ended with a lot of new developments on Canaille, funded by &lt;a href="https://nlnet.nl/"&gt;NLNet&lt;/a&gt;. You can read it all on &lt;a href="https://yaal.coop/blog/canaille-nlnet-security-features"&gt;our dedicated blog post&lt;/a&gt;. We went through another round of developments, still under the same fund. You can read it all on this page!&lt;/p&gt;
&lt;h2&gt;Security audit and improvements&lt;/h2&gt;
&lt;p&gt;Canaille started 2025 with a security audit, conducted by &lt;a href="https://www.radicallyopensecurity.com/"&gt;Radically Open Security&lt;/a&gt;. Our main objectives were to know the weaknesses of our product and implement fixes before the end of march.&lt;/p&gt;
&lt;h3&gt;Better password reset security&lt;/h3&gt;
&lt;p&gt;The implementation of the flask &lt;code&gt;TRUSTED_HOSTS&lt;/code&gt; (&lt;a href="https://flask.palletsprojects.com/en/stable/config/#TRUSTED_HOSTS"&gt;see documentation here&lt;/a&gt;) configuration variable prevents our "magic links" at user registration and password reset to be falsified and hijacked by a malicious host.&lt;/p&gt;
&lt;p&gt;We also improved the way these links are generated to make them more secure and introduce a time limit in their validity.&lt;/p&gt;
&lt;h3&gt;Logo retrieval vulnerability&lt;/h3&gt;
&lt;p&gt;We removed a vulnerability that could theoretically permit a server-side request forgery (SSRF) when retrieving the logo of the application.&lt;/p&gt;
&lt;h3&gt;Better user URL validation&lt;/h3&gt;
&lt;p&gt;We improved the validation of the user website's URL to make it more restrictive.&lt;/p&gt;
&lt;h3&gt;Implementation of Content Security Policy&lt;/h3&gt;
&lt;p&gt;Content Security Policy (CSP) has been implemented on Canaille via &lt;a href="https://github.com/GoogleCloudPlatform/flask-talisman"&gt;Flask-Talisman&lt;/a&gt;. CSP makes it harder to disrupt our application, for example with cross-site scripting (XSS) attacks.&lt;/p&gt;
&lt;h2&gt;OIDC Certification&lt;/h2&gt;
&lt;p&gt;The OpenID Certification process was expected to be much less trouble than it was. We made a lot of progress on making the certification tests pass but still have a lot to do in order to be certified. We implemented features and fixes as well as raised issues and contributed to &lt;a href="https://github.com/lepture/authlib/issues"&gt;Authlib&lt;/a&gt; to get better support of the OpenID Specification.&lt;/p&gt;
&lt;p&gt;Part of the progress done was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Match OIDC specification on redirect URIs validation.&lt;/li&gt;
&lt;li&gt;Update our models to implement attributes required by OIDC.&lt;/li&gt;
&lt;li&gt;Displaying Terms of Service and Privacy policy links if the client requesting authorization issues them.&lt;/li&gt;
&lt;li&gt;Displaying most request errors as JSON error pages.&lt;/li&gt;
&lt;li&gt;Responding with JSON web tokens when requested by the client.&lt;/li&gt;
&lt;li&gt;Improvement on Canaille's handling of JWTs and JWKS.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Packaging: Docker image&lt;/h2&gt;
&lt;p&gt;Canaille can be tested more easily thanks to a docker image hosted on a public hub docker repository. Users can discover Canaille via an administrator profile.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The creation of this docker image was made possible by building a nix package.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Accessibility audit and improvements&lt;/h2&gt;
&lt;p&gt;Canaille benefited from an Accessibility audit as well, conducted by &lt;a href="https://www.hanuniversity.com/en/"&gt;HAN accessibility lab&lt;/a&gt;. The results provided underlined several contrast issues and lack of differentiation of links from regular text, and a few keyboard navigation issues.&lt;/p&gt;
&lt;h3&gt;Accessibility improvements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Most color contrast issues have been fixed.&lt;/li&gt;
&lt;li&gt;Most link differentiation and visual changes on focus and hover have been fixed.&lt;/li&gt;
&lt;li&gt;A skip link has been added at the top of every page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SCIM Provisioning&lt;/h2&gt;
&lt;p&gt;Canaille already provided a SCIM server implementation since our &lt;a href="https://yaal.coop/blog/en/canaille-nlnet-security-features"&gt;last security update&lt;/a&gt;. It now also supports SCIM client features, allowing a Canaille instance to automatically broadcast changes on users and groups to client applications. This should make it easier for all applications to remain synchronized without needing additional user intervention.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Thanks for reading, we will keep you updated on our next progress, and you can still read about our other free software contributions on our *seasonal contributions* blog posts.&lt;/p&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant l'hiver 2025</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-hiver-2025" rel="alternate"/><published>2025-03-20T00:00:00+01:00</published><updated>2025-03-20T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-03-20:/blog/dernieres-contributions-logiciels-libres-hiver-2025</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant l'hiver 2025.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Mécénat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; pour son travail sur &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, un chouette framework CSS que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; pour son travail sur &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, une bibliothèque python d'authentification que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pypi.org/project/markdownmail/"&gt;MarkdownMail&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque d'envoi d'e-mails dont le contenu HTML est généré automatiquement&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/markdownmail/-/commit/317d667d2b4956b0bead0678f08a84545bf6b27e"&gt;Correction de la capture d'écran&lt;/a&gt;, puis publication de la version 0.11.1.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://ergol.org/"&gt;Ergo-L&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Disposition de clavier optimisée pour le français, l’anglais et la programmation&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Nuclear-Squid/ergol/pull/297"&gt;Correction du rendu du '^' comme touche&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Nuclear-Squid/ergol/pull/296"&gt;Ajout du besoin de &lt;code&gt;pandoc&lt;/code&gt; pour générer le site web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Nuclear-Squid/ergol/pull/300"&gt;Présentation minimale de l'usage sur la page d'accueil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Nuclear-Squid/ergol/pull/301"&gt;Ajout de caractères manquants ('ß' et 'ñ' ) dans le fichier ergo.svg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot"&gt;sphinxcontrib-screenshot&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Génération dynamique de captures d'écran pour les documentations Sphinx&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/26"&gt;Ability to take screenshots from local WSGI applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/30"&gt;Pass import path instead of callable in `screenshot_apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/31"&gt;Python 3.12 and 3.13 GHA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/33"&gt;Pre-commit configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/34"&gt;&lt;code&gt;:color-scheme:&lt;/code&gt; option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/35"&gt;Tox configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/36"&gt;Consider the color scheme when building the image hash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/37"&gt;Implement default size configuration parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/39"&gt;Move from setup.cfg to pyproject.toml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/41"&gt;Allow &lt;code&gt;file://&lt;/code&gt; url schemes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/42"&gt;Use the raw URL value to build the image hash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/43"&gt;Add a &lt;code&gt;screenshot_default_color_scheme&lt;/code&gt; parameter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/44"&gt;Add &lt;code&gt;:full-page:&lt;/code&gt; option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/45"&gt;Custom request headers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/46"&gt;Custom contexts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/48"&gt;Add &lt;code&gt;:browser:&lt;/code&gt; option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/49"&gt;Documentation creation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/50"&gt;Documentation fixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/53"&gt;The &lt;code&gt;screenshot&lt;/code&gt; directive inherits from &lt;code&gt;figure&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime"&gt;python-libfaketime&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Une alternative rapide à freezegun pour mocker les dates, en utilisant libfaketime&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/issues/85"&gt;Désactivation de &lt;code&gt;FAKETIME_FORCE_MONOTONIC_FIX&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/issues/86"&gt;Mise-à-jour de pre-commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/issues/87"&gt;Support pour Python 3.13&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/lepture/authlib"&gt;Authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque Python de gestion des identités et des accès&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/Authlib/#history"&gt;2 nouvelles versions&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/701"&gt;Implémentation côté serveur de la spécification RFC9207&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/702"&gt;Ajout d'un paramètre &lt;code&gt;kid&lt;/code&gt; à &lt;code&gt;generate_id_token&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/703"&gt;Migrate de flake8 vers ruff&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/706"&gt;Ajout de descriptions à &lt;code&gt;InvalidClientError&lt;/code&gt; et &lt;code&gt;UnauthorizedClientError&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/707"&gt;Implémentation de la spécification « OpenID Connect Dynamic Client Registration »&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/708"&gt;Utilisation de groupes de dépendances pour les tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/715"&gt;Correction du paramètre &lt;code&gt;iss&lt;/code&gt; de la RFC9207&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/boxed/mutmut"&gt;mutmut&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Système de tests par mutations&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/boxed/mutmut/issues/363"&gt;Annotation des &lt;code&gt;dict&lt;/code&gt; mutants pour corriger la compatibilité avec Pydantic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boxed/mutmut/issues/364"&gt;Évite de muter les métaclasses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-cli"&gt;scim2-cli&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Outil en ligne de commandes pour interagir avec des applications SCIM&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/scim2-cli/#history"&gt;1 nouvelle version&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-cli/issues/22"&gt;Implémentation du paramètre &lt;code&gt;--no-verify&lt;/code&gt; pour éviter les vérifications de certificats&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Sérialisation et validation de ressources SCIM avec Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/scim2-models/#history"&gt;1 nouvelle version&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/issues/89"&gt;Correction des limites basses de &lt;code&gt;startIndex&lt;/code&gt; et &lt;code&gt;count&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/issues/90"&gt;&lt;code&gt;ListResponse.total_results&lt;/code&gt; est un paramètre obligatoire&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;Canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur d’identité et d'autorisations ultra-léger&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/canaille/#history"&gt;8 nouvelles versions&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/209"&gt;Option CLI &lt;code&gt;--version&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/211"&gt;Implémentation du paramètre &lt;code&gt;--all&lt;/code&gt; de la commande &lt;code&gt;get&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/212"&gt;L'interface CLI peut afficher les mots de passes chiffrés&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/214"&gt;Migrations SQL avec flask-alembic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/215"&gt;Correction du remplissage automatique du champs de mot de passe à la réinitialisation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/216"&gt;Intégration HTMX avec le formulaire de confirmation d'emails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/217"&gt;Ajout automatique de captures d'écran dans la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/219"&gt;Implementation de la commande &lt;code&gt;run&lt;/code&gt; qui lance un serveur hypercorn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/221"&gt;Le paramètre &lt;code&gt;SECRET_KEY&lt;/code&gt; est facultatif&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/223"&gt;Commande d'export de la configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/224"&gt;Fichier unique exécutable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/225"&gt;Correction de la commande d'installation en SQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/226"&gt;Correction de l'internationalisation dans l'exécutable unique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/227"&gt;Paramètre &lt;code&gt;kid&lt;/code&gt; dans le JWKS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/228"&gt;Gestion du paramètre &lt;code&gt;jwks&lt;/code&gt; lors de l'enregistremnet dynamique des clients OIDC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/229"&gt;Implémentation de la RFC7523&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/232"&gt;Utilisation d'une image docker LDAP personnalisée pour la démo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/233"&gt;Implémentation du paramètre de configuration &lt;code&gt;LOGIN_ATTRIBUTES&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/234"&gt;Implémentation de la norme « OIDC Dynamic Client Registration »&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/237"&gt;Émission de signaux lors des évènements importants des objets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/238"&gt;Mise-à-jour vers Fomantic 2.9.4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/242"&gt;Implémentation de RFC9207 avec Authlib&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/243"&gt;Renommage de &lt;code&gt;Client.preconsent&lt;/code&gt; vers &lt;code&gt;Client.trusted&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/253"&gt;Maintien de l'ordre d'ajout dans les tables SQL relationnelles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/255"&gt;Implémentation naïve de la commande &lt;code&gt;restore&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/256"&gt;La commande &lt;code&gt;delete&lt;/code&gt; prends des paramètres de filtrage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/257"&gt;Correction de la command &lt;code&gt;restore&lt;/code&gt; avec LDAP et des données partielles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/258"&gt;Les comptes verrouillés ne peuvent pas réinitialiser leurs mots de passe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/259"&gt;Suppression d'un correctif temporaire pour l'affichage d'icônes en CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/260"&gt;Découverte automatique des serveurs SMTP locaux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/261"&gt;Enrichissement des paramètres de permissions par défaut&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/262"&gt;Correction de diverses erreurs dans l'interface web lorsqu'un utilisateur n'a aucune adresse email définie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/222"&gt;Résoud de l'enregistrement de clients sans périmètre&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/230"&gt;Correction: Autorise un client à accéder à "userinfo" avec le périmètre openid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/239"&gt;Résoud "S'assurer que le lien de redirection du client ne contient pas de composant fragment à l'enregistrement"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/240"&gt;Correctif de sécurité : Il n'y a plus de lien magique dans la réinitisation de mot de passe si la variable TRUSTED_HOSTS n'est pas configurée&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/241"&gt;Résoud "Ensure authorization requests have a valid redirect URI"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/244"&gt;Résoud "Accessibilité : Ajout d'un lien d'évitement dans toutes les pages"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/245"&gt;Remplace la regec par urlparse dans validate_uri&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/246"&gt;Utilisation de HMAC pour construire les hashes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/248"&gt;Résoud "Accessibilité : Corrige le ratio de contraste sur les boutons et les textes"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/249"&gt;Amélioration de la lisibilité des paginations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/251"&gt;Affiche les liens vers la politique de confidentialité et les conditions d'utilisation sur les pages d'autorisation client, si définis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/252"&gt;Les erreurs d'URI avec fragments sont maintenant affichées en json&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pspdev.github.io/pspsdk/index.html"&gt;PSPSDK&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Ensemble d'outils et de bibliothèques pour la console PSP de Sony&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/260"&gt;Ajout de descriptions sur des bibliothèques&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Winter 2025 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-hiver-2025" rel="alternate"/><published>2025-03-20T00:00:00+01:00</published><updated>2025-03-20T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2025-03-20:/blog/en/dernieres-contributions-logiciels-libres-hiver-2025</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during winter 2025.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Sponsoring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; for his work on &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, a nice CSS framework we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI is used on other tools we rely on, like &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; for his work on &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, a python authentication library we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pypi.org/project/markdownmail/"&gt;MarkdownMail&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Library to send e-mails with generated HTML content&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/markdownmail/-/commit/317d667d2b4956b0bead0678f08a84545bf6b27e"&gt;Fix screenshot picture&lt;/a&gt;, then release 0.11.1.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://ergol.org/"&gt;Ergo-L&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Keyboard layout optimised for French, English and programming&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Nuclear-Squid/ergol/pull/297"&gt;Fix '^' rendering as key pressed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Nuclear-Squid/ergol/pull/296"&gt;Add &lt;code&gt;pandoc&lt;/code&gt; requirement to generate the website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Nuclear-Squid/ergol/pull/300"&gt;Explain basic usage on the homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Nuclear-Squid/ergol/pull/301"&gt;Add missing characters ('ß' and 'ñ' ) in ergo.svg file&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot"&gt;sphinxcontrib-screenshot&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Generate dynamic screenshots in Sphinx documentation&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/26"&gt;Ability to take screenshots from local WSGI applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/30"&gt;Pass import path instead of callable in `screenshot_apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/31"&gt;Python 3.12 and 3.13 GHA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/33"&gt;Pre-commit configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/34"&gt;&lt;code&gt;:color-scheme:&lt;/code&gt; option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/35"&gt;Tox configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/36"&gt;Consider the color scheme when building the image hash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/37"&gt;Implement default size configuration parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/39"&gt;Move from setup.cfg to pyproject.toml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/41"&gt;Allow &lt;code&gt;file://&lt;/code&gt; url schemes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/42"&gt;Use the raw URL value to build the image hash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/43"&gt;Add a &lt;code&gt;screenshot_default_color_scheme&lt;/code&gt; parameter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/44"&gt;Add &lt;code&gt;:full-page:&lt;/code&gt; option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/45"&gt;Custom request headers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/46"&gt;Custom contexts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/48"&gt;Add &lt;code&gt;:browser:&lt;/code&gt; option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/49"&gt;Documentation creation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/50"&gt;Documentation fixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/issues/53"&gt;The &lt;code&gt;screenshot&lt;/code&gt; directive inherits from &lt;code&gt;figure&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime"&gt;python-libfaketime&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A fast time mocking alternative to freezegun that wraps libfaketime.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/issues/85"&gt;Disable FAKETIME_FORCE_MONOTONIC_FIX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/issues/86"&gt;Pre-commit update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/issues/87"&gt;Python 3.13 support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The ultimate Python library in building OAuth, OpenID Connect clients and servers. JWS,JWE,JWK,JWA,JWT included.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/Authlib/#history"&gt;2 releases&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/701"&gt;Server-side RFC9207 implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/702"&gt;&lt;code&gt;kid&lt;/code&gt; parameter for &lt;code&gt;generate_id_token&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/703"&gt;Migrate from flake8 to ruff&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/706"&gt;Add descriptions to &lt;code&gt;InvalidClientError&lt;/code&gt; and &lt;code&gt;UnauthorizedClientError&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/707"&gt;OpenID Connect Dynamic Client Registration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/708"&gt;Use dependency groups for tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/issues/715"&gt;Fix RFC9207 &lt;code&gt;iss&lt;/code&gt; parameter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/boxed/mutmut"&gt;mutmut&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Mutation testing system&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/boxed/mutmut/issues/363"&gt;Annotate mutant dicts and solve Pydantic compatibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boxed/mutmut/issues/364"&gt;Avoid to mutate metaclasses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-cli"&gt;scim2-cli&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM application development CLI&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/scim2-cli/#history"&gt;1 release&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-cli/issues/22"&gt;Implement &lt;code&gt;--no-verify&lt;/code&gt; to avoid perform certificate checks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM resources serialization and validation with Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/scim2-models/#history"&gt;1 release&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/issues/89"&gt;Fix startIndex and count lower limits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/issues/90"&gt;ListResponse.total_results is required&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;Canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lightweight identity and authorization management software&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/canaille/#history"&gt;8 releases&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/209"&gt;&lt;code&gt;--version&lt;/code&gt; CLI option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/211"&gt;feat: implement &lt;code&gt;--all&lt;/code&gt; option of &lt;code&gt;get&lt;/code&gt; command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/212"&gt;CLI commands can dump hashed passwords&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/214"&gt;SQL migrations with flask-alembic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/215"&gt;Fix password field auto-refilling when input is reset&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/216"&gt;HTMX integration with the email confirmation form&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/217"&gt;Add automatic screenshots in the documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/219"&gt;Implement &lt;code&gt;run&lt;/code&gt; server command based on hypercorn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/221"&gt;&lt;code&gt;SECRET_KEY&lt;/code&gt; is optional&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/223"&gt;Configuration export CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/224"&gt;Single binary bundle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/225"&gt;SQL install command fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/226"&gt;Fix bring i18n in the Canaille executable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/227"&gt;Fix dynamic &lt;code&gt;kid&lt;/code&gt; parameter for JWKs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/228"&gt;&lt;code&gt;jwks&lt;/code&gt; parameter management with OIDC client dynamic registration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/229"&gt;Implement RFC7523 client JWT authentication and grant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/232"&gt;Use a custom LDAP docker image for the demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/233"&gt;Implement the &lt;code&gt;LOGIN_ATTRIBUTES&lt;/code&gt; configuration parameter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/234"&gt;Full OIDC Dynamic Client Registration implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/237"&gt;Signals on object lifetime events&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/238"&gt;Update to Fomantic 2.9.4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/242"&gt;Implement RFC9207 with authlib&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/243"&gt;Rename &lt;code&gt;Client.preconsent&lt;/code&gt; in &lt;code&gt;Client.trusted&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/253"&gt;Order SQL relationship tables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/255"&gt;Naive &lt;code&gt;restore&lt;/code&gt; command implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/256"&gt;The delete command can take filter parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/257"&gt;Fix the LDAP restore command with partial payloads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/258"&gt;Prevent locked accounts from resetting their password&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/259"&gt;Remove CSS action label icons hotfix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/260"&gt;Automatic discovery of local SMTP server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/261"&gt;Set-up good default ACLs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/262"&gt;Fix various crashes in the web interface when users have no email configured&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/222"&gt;Resolve "Handle registration of clients without scopes"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/230"&gt;fix: allows client to access userinfo with openid scope&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/239"&gt;Resolve "Ensure that client redirection URI does not have a fragment component at registration"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/240"&gt;Security fix : magic link is not anymore in reset password e-mails unless TRUSTED_HOSTS is configured&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/241"&gt;Resolve "Ensure authorization requests have a valid redirect URI"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/244"&gt;Resolve "Accessibility : Add a skip link in base template"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/245"&gt;Replace regex with urlparse in validate_uri&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/246"&gt;Use HMAC to build hashes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/248"&gt;Resolve "Accessibility : Fix contrast ratio on buttons and text"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/249"&gt;Improve pagination legibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/251"&gt;Display policy and terms of service uri in client authorization page if set&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/252"&gt;URI with fragments error at client registration now returns a json error page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pspdev.github.io/pspsdk/index.html"&gt;PSPSDK&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Collection of tools and libraries written for Sony's Playstation Portable (PSP) gaming console&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspsdk/pull/260"&gt;Add description to libraries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant l'automne 2024</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-automne-2024" rel="alternate"/><published>2024-12-21T00:00:00+01:00</published><updated>2024-12-21T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-12-21:/blog/dernieres-contributions-logiciels-libres-automne-2024</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant l'automne 2024.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Mécénat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; pour son travail sur &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, un chouette framework CSS que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; pour son travail sur &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, une bibliothèque python d'authentification que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pygments.org/"&gt;Pygments&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque Python de coloration syntaxique&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pygments/pygments/issues/2747"&gt;Ajout d'un lexeur pour colorer les fichiers *.sources&lt;/a&gt;. Ce format de fichiers remplacera à terme les fichiers &lt;code&gt;sources.list&lt;/code&gt; dans Debian et dérivées.&lt;/li&gt;
&lt;li&gt;Suite à une réflexion faite par un mainteneur de &lt;code&gt;pygments&lt;/code&gt; concernant &lt;a href="https://github.com/pygments/pygments/issues/2603"&gt;l'utilisation du mauvais lexeur&lt;/a&gt; pour la coloration syntaxique dans Sphinx, des corrections ont été proposées dans &lt;a href="https://github.com/kivy/kivy/pull/8910"&gt;Kivy&lt;/a&gt;, &lt;a href="https://github.com/bokeh/bokeh/issues/14137"&gt;Bokeh&lt;/a&gt; (&lt;a href="https://github.com/bokeh/bokeh/pull/14138"&gt;rapport associé&lt;/a&gt;) et &lt;a href="https://github.com/PaddlePaddle/Paddle/pull/69135"&gt;Paddle&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pypi.org/project/pluralizefr/"&gt;Pluralizefr&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque Python pour obtenir un mot au pluriel à partir du singulier&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sblondon/pluralizefr/pull/8"&gt;Suppression des préfixes &lt;code&gt;u&lt;/code&gt;&lt;/a&gt; devant les chaînes de caractères&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sblondon/pluralizefr/commit/dd20244f8e510ceb8ebbd49bad57a17b4b1c34e2"&gt;Suppression de setup.py&lt;/a&gt;, remplacé par pyproject.toml&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sblondon/pluralizefr/pull/6"&gt;Ajout d'une commande pour envoyer des paquets vers pypi.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sblondon/pluralizefr/pull/9"&gt;Ajout de métadonnées dans pyproject.toml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sblondon/pluralizefr/pull/10"&gt;Correction du cas « oeil »&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Publications sur &lt;a href="https://pypi.org/project/pluralizefr/"&gt;pypi.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pspdev.github.io/pspsdk/index.html"&gt;PSPSDK&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Ensemble d'outils et de bibliothèques pour la console PSP de Sony&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amélioration de la lisibilité des valeurs du stick analogique dans le code d'exemple des controleurs &lt;a href="https://github.com/pspdev/pspsdk/pull/237"&gt;dans le dépôt principal&lt;/a&gt; et &lt;a href="https://github.com/pspdev/pspdev.github.io/pull/64"&gt;pour le site web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspdev.github.io/pull/63"&gt;Correction d'un commentaire dans du code d'exemple&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;apt-setup&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Partie de Debian-Installer. Produit un fichier /etc/apt/sources.list pour le système installé&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://salsa.debian.org/installer-team/apt-setup/-/merge_requests/19"&gt;Suppression du script inutilisé pour le cas d'une Ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/sblondon/bmg"&gt;bmg&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Déplace un fichier (ou répertoire) pendant 3 minutes. Une fois le délai expiré, le fichier (ou répertoire) revient.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Principalement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/sblondon/bmg/-/commit/2c4f149ca72562f146b3388a2045601702bd3bab"&gt;le faire fonctionner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;...et ajouter les notifications de bureau supplémentaires pour &lt;a href="https://gitlab.com/sblondon/bmg/-/commit/dc03615c792e560c785b90bd76ad816cb7535313"&gt;kdialog&lt;/a&gt;, &lt;a href="https://gitlab.com/sblondon/bmg/-/commit/430e464072ab73ba245e5c28eb638e802ab519f2"&gt;zenity et xmessage &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://canaille.readthedocs.io"&gt;Canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur d’identité et d'autorisations ultra-léger&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/Canaille/#history"&gt;1 nouvelle version&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/181"&gt;Correction d'un lien dans la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/182"&gt;Implémentation d'un indicateur de robustesse des mots de passe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/184"&gt;Mise à jour vers HTMX 2.0.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/185"&gt;Journalisation des évènements de sécurité&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/186"&gt;Support de Python 3.13&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/187"&gt;Migration de Poetry à uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/188"&gt;Test de la compromission des mots de passe avec l'API HIPB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/189"&gt;Documentation de la configuration de la ligne de commande&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/190"&gt;Mise en place de l'internationalisation de la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/191"&gt;Documentation des cas d'usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/192"&gt;Correction d'une coquille dans les URLs de certains mails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/193"&gt;Implémentation de mécanismes d'authentification multi-facteurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/194"&gt;Implémentation du verrouillage des comptes après tentatives de connexion infructueuses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/195"&gt;Correction d'une coquille&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/196"&gt;Implémentation du flux OIDC &lt;code&gt;client_credentials&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/197"&gt;Implémentation de l'API SCIM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/198"&gt;Correction d'une coquille&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/199"&gt;Correction de ponctuation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/201"&gt;Correction de ponctuation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/202"&gt;Documentation de l'habillage personnalisé&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/203"&gt;Implémentation de l'expiration des mots de passe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Divers correctifs sur les tests unitaires &lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/204"&gt;1&lt;/a&gt;, &lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/205"&gt;2&lt;/a&gt;, &lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/206"&gt;3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Sérialisation et validation de ressources SCIM avec Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/scim2-models/#history"&gt;11 nouvelles versions&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/79"&gt;Les attributs &lt;code&gt;attributes&lt;/code&gt; et &lt;code&gt;excluded_attributes&lt;/code&gt; de SearchRequest sont mutuellement exclusifs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models"&gt;Sérialisation des attributs &lt;code&gt;Base64&lt;/code&gt;,&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/81"&gt;Validateur s'assurant que les ids des Schemas sont des URIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/82"&gt;Migration de Poetry à uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/83"&gt;Configuration native de Tox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/87"&gt;Comparaison des attributs immutables dans les requêtes de remplacement de ressources&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-server"&gt;scim2-server&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Prototype de server SCIM2 ultra-léger&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/scim2-server/#history"&gt;1 nouvelle version&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/3"&gt;Le préfixe &lt;code&gt;/v2&lt;/code&gt; est facultatif&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/7"&gt;Migration de Poetry à uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/8"&gt;Support de Python 3.10&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-client"&gt;scim2-client&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Fabrication et analyse pythonique de requêtes SCIM&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/scim2-client/#history"&gt;12 nouvelles versions&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/23"&gt;Migration de Poetry à uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/24"&gt;Correction d'une erreur surverant lorsque les serveurs ne retournent pas l'en-tête &lt;code&gt;content-type&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/25"&gt;Vérification du typage avec Mypy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/27"&gt;Séparation des logiques métier et réseau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/28"&gt;Implémentation d'un moteur réseau basé sur Werkzeug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/29"&gt;Implémentation d'un moteur asynchrone basé sur HTTPX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-tester"&gt;scim2-tester&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Outil de vérification de conformité de serveurs aux normes SCIM&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/scim2-tester/#history"&gt;8 nouvelles versions&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/12"&gt;Migration de Poetry à uv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-cli"&gt;scim2-cli&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Outil en ligne de commandes pour interagir avec des applications SCIM&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/scim2-cli/#history"&gt;3 nouvelles versions&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-cli/pull/10"&gt;Documentation sur la manière de fabriquer des binaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-cli/pull/11"&gt;Migration de Poetry à uv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pallets-eco/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion de formulaires web&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/WTForms/#history"&gt;2 nouvelles versions&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/854"&gt;Migration vers l'organisation pallets-eco&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/855"&gt;Arrêt du support de Python 3.8, support de Python 3.13&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/856"&gt;Configuration de &lt;code&gt;pre-commit&lt;/code&gt; basée sur celle de Flask&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/857"&gt;Correction d'une coquille sur un message d'avertissement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/859"&gt;Suppression de code déprécié&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/860"&gt;Intégration continue basée sur celle de Flask&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/862"&gt;Correction d'une erreur d'import apparue avec la version 3.2.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf"&gt;flask-wtf&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Intégration de WTForms dans Flask&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/Flask-WTF/#history"&gt;1 nouvelle version&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/602"&gt;Migration vers l'organisation pallets-eco&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/603"&gt;Arrêt du support de Python 3.8, support de Python 3.13&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/604"&gt;Configuration de &lt;code&gt;pre-commit&lt;/code&gt; basée sur celle de Flask&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/607"&gt;Mise à jour de &lt;code&gt;pre-commit&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pallets-eco/wtforms-sqlalchemy"&gt;wtforms-sqlalchemy&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Intégration de SQLAlchemy dans WTForms&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/WTForms-SQLAlchemy/#history"&gt;1 nouvelle version&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms-sqlalchemy/pull/49"&gt;Méga-nettoyage (migration vers pallets-eco, support modèrne de Python, pre-commit, pyproject.toml)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms-sqlalchemy/pull/50"&gt;Mise à jour des dépendances de la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms-sqlalchemy/pull/51"&gt;Support de Python 3.13&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms-sqlalchemy/pull/51"&gt;Intégration continue basée sur celle de Flask&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pallets-eco/click"&gt;click&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Boîte à outil pour créer des programme en ligne de commande composables avec Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets/click/pull/2818"&gt;Ajout d'un paramètre &lt;code&gt;catch_exceptions&lt;/code&gt; à &lt;code&gt;CLIRunner&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/sphinx-contrib/jinja-autodoc"&gt;jinja-autodoc&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Documentation automatique des patrons Jinja avec Sphinx&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nous avons publié &lt;a href="https://pypi.org/project/jinja-autodoc/#history"&gt;3 nouvelles versions&lt;/a&gt; durant cette saison.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/offlinehacker/sphinxcontrib.jinjadomain"&gt;Fork du projet sphinxcontrib.jinjadomain, et hébergement dans l'organisation sphinx-contrib&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Autumn 2024 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-automne-2024" rel="alternate"/><published>2024-12-21T00:00:00+01:00</published><updated>2024-12-21T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-12-21:/blog/en/dernieres-contributions-logiciels-libres-automne-2024</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during autumn 2024.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Sponsoring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; for his work on &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, a nice CSS framework we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI is used on other tools we rely on, like &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; for his work on &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, a python authentication library we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pygments.org/"&gt;Pygments&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Pygments is a generic syntax highlighter written in Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pygments/pygments/issues/2747"&gt;Add a lexer to highlight *.sources files&lt;/a&gt;. This format will replace the &lt;code&gt;sources.list&lt;/code&gt; format in Debian and derivatives.&lt;/li&gt;
&lt;li&gt;An issue written by a &lt;code&gt;pygments&lt;/code&gt; maintainer about &lt;a href="https://github.com/pygments/pygments/issues/2603"&gt;the use of the wrong lexer&lt;/a&gt; for syntax highlighting in Sphinx, some fixes have been pushed to &lt;a href="https://github.com/kivy/kivy/pull/8910"&gt;Kivy&lt;/a&gt;, &lt;a href="https://github.com/bokeh/bokeh/issues/14137"&gt;Bokeh&lt;/a&gt; (&lt;a href="https://github.com/bokeh/bokeh/pull/14138"&gt;linked issue&lt;/a&gt;) and &lt;a href="https://github.com/PaddlePaddle/Paddle/pull/69135"&gt;Paddle&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pypi.org/project/pluralizefr/"&gt;Pluralizefr&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Python library to get plural word from singular one&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sblondon/pluralizefr/pull/8"&gt;Remove of &lt;code&gt;u&lt;/code&gt; prefix&lt;/a&gt; before strings&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sblondon/pluralizefr/commit/dd20244f8e510ceb8ebbd49bad57a17b4b1c34e2"&gt;Remove of setup.py&lt;/a&gt;, remplaced by pyproject.toml&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sblondon/pluralizefr/pull/6"&gt;Add a command to send package to pypi.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sblondon/pluralizefr/pull/9"&gt;Add metadata in pyproject.toml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sblondon/pluralizefr/pull/10"&gt;Fix 'oeil' case&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Publish releases on &lt;a href="https://pypi.org/project/pluralizefr/"&gt;pypi.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pspdev.github.io/pspsdk/index.html"&gt;PSPSDK&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Collection of tools and libraries written for Sony's Playstation Portable (PSP) gaming console&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make analog stick values more readable in basic control sample &lt;a href="https://github.com/pspdev/pspsdk/pull/237"&gt;in main repository&lt;/a&gt; and &lt;a href="https://github.com/pspdev/pspdev.github.io/pull/64"&gt;in website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pspdev/pspdev.github.io/pull/63"&gt;Fix a comment about sprite in example code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;apt-setup&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Part of Debian-Installer. Generate an /etc/apt/sources.list for the installed system&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://salsa.debian.org/installer-team/apt-setup/-/merge_requests/19"&gt;Delete unused ubuntu generator script&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/sblondon/bmg"&gt;bmg&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;It moves a file (or directory) for 3 minutes. At the time out, the file (or directory) comes back.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Mainly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/sblondon/bmg/-/commit/2c4f149ca72562f146b3388a2045601702bd3bab"&gt;get it works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;...and add additional desktop notifications for &lt;a href="https://gitlab.com/sblondon/bmg/-/commit/dc03615c792e560c785b90bd76ad816cb7535313"&gt;kdialog&lt;/a&gt;, &lt;a href="https://gitlab.com/sblondon/bmg/-/commit/430e464072ab73ba245e5c28eb638e802ab519f2"&gt;zenity and xmessage &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://canaille.readthedocs.io"&gt;Canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lightweight identity and authorization management software&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/Canaille/#history"&gt;1 release&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/181"&gt;Documentation link typo fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/182"&gt;Password strenght indicator implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/184"&gt;Update to HTMX 2.0.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/185"&gt;Security events logging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/186"&gt;Support for Python 3.13&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/187"&gt;Migration from Poetry to uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/188"&gt;Password compromission check against the HIPB API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/189"&gt;Documentation on CLI configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/190"&gt;Documentation translation setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/191"&gt;Documentation for use cases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/192"&gt;Fix a typo in some mail URLs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/193"&gt;Multiple factor authentication implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/194"&gt;Intruder lockout implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/195"&gt;Typo fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/196"&gt;OIDC &lt;code&gt;client_credentials&lt;/code&gt; flow implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/197"&gt;SCIM server API implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/198"&gt;Typo fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/199"&gt;Punctuation fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/201"&gt;Punctuation fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/202"&gt;Documentation on theming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/203"&gt;Password expiry implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Various unit tests fixes &lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/204"&gt;1&lt;/a&gt;, &lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/205"&gt;2&lt;/a&gt;, &lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/206"&gt;3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM resources serialization and validation with Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/scim2-models/#history"&gt;11 releases&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/79"&gt;SearchRequest 'attributes' and 'excluded_attributes' are mutually exclusive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models"&gt;Base64 attributes serialization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/81"&gt;Validator to ensure Schema ids are URIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/82"&gt;Migrate from Poetry to uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/83"&gt;Tox native configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/87"&gt;Compare immutable attributes in resource replacement requests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-server"&gt;scim2-server&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lightweight SCIM2 server prototype&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/scim2-server/#history"&gt;1 release&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/3"&gt;The &lt;code&gt;/v2&lt;/code&gt; prefix is optional&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/7"&gt;Migrate from Poetry to uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server/pull/8"&gt;Python 3.10 support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-client"&gt;scim2-client&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Pythonically build SCIM requests and parse SCIM responses&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/scim2-client/#history"&gt;12 releases&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/23"&gt;Migrate from Poetry to uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/24"&gt;Fix an error happening when server don't return the &lt;code&gt;content-type&lt;/code&gt; header&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/25"&gt;Type checking with Mypy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/27"&gt;Separation of business and network logic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/28"&gt;Werkzeug engine implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/29"&gt;Async HTTPX engine implementation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-tester"&gt;scim2-tester&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM RFCs server compliance checker&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/scim2-tester/#history"&gt;8 releases&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-tester/pull/12"&gt;Migrate from Poetry to uv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-scim/scim2-cli"&gt;scim2-cli&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM application development CLI&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/scim2-cli/#history"&gt;3 releases&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-cli/pull/10"&gt;Document how to build binaries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-cli/pull/11"&gt;Migrate from Poetry to uv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pallets-eco/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A flexible forms validation and rendering library for Python.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/WTForms/#history"&gt;2 releases&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/854"&gt;Migrate to the pallets-eco organization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/855"&gt;Stop support for Python 3.8, start support for Python 3.13&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/856"&gt;pre-commit configuration based of Flask&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/857"&gt;Typo on a warning message&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/859"&gt;Remove deprecated code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/860"&gt;GHA workflows based on Flask&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/862"&gt;Fix import issues appeared in the 3.2.0 release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf"&gt;flask-wtf&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/Flask-WTF/#history"&gt;1 release&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/602"&gt;Migrate to the pallets-eco organization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/603"&gt;Stop support for Python 3.8, start support for Python 3.13&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/604"&gt;pre-commit configuration based of Flask&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/607"&gt;pre-commit update&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pallets-eco/wtforms-sqlalchemy"&gt;wtforms-sqlalchemy&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;WTForms integration for SQLAlchemy&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/WTForms-SQLAlchemy/#history"&gt;1 release&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms-sqlalchemy/pull/49"&gt;mega clean-up (move to pallets-eco, modern python support, pre-commit, pyproject.toml)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms-sqlalchemy/pull/50"&gt;doc dependencies update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms-sqlalchemy/pull/51"&gt;support for Python 3.13&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms-sqlalchemy/pull/51"&gt;GHA workflow based on Flask&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pallets-eco/click"&gt;click&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Python composable command line interface toolkit&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets/click/pull/2818"&gt;Add a &lt;code&gt;catch_exceptions&lt;/code&gt; parameter to &lt;code&gt;CLIRunner&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/sphinx-contrib/jinja-autodoc"&gt;jinja-autodoc&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Automatically document your Jinja templates with Sphinx&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We published &lt;a href="https://pypi.org/project/jinja-autodoc/#history"&gt;3 releases&lt;/a&gt; during this season.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/offlinehacker/sphinxcontrib.jinjadomain"&gt;Fork from sphinxcontrib.jinjadomain, and hosting under the sphinx-contrib organization umbrella&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Nouvelles fonctionnalités de sécurité implémentées dans Canaille</title><link href="https://yaal.coop/blog/canaille-nlnet-security-features" rel="alternate"/><published>2024-12-19T00:00:00+01:00</published><updated>2024-12-19T00:00:00+01:00</updated><author><name>Sébastien Birolleau &lt;sebastien@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-12-19:/blog/canaille-nlnet-security-features</id><summary type="html">&lt;p&gt;De nouvelles fonctionnalités importantes portant sur la sécurité ont été ajoutées dans Canaille, notre logiciel de gestion d'identités et d'autorisations&lt;/p&gt;</summary><content type="html">&lt;p&gt;Nous avons travaillé récemment sur les principales caractéristiques de sécurité de Canaille, dans le cadre de notre &lt;a href="https://nlnet.nl"&gt;subvention NLNet&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Sécurité&lt;/h1&gt;
&lt;p&gt;Au cours de ce sprint, nous nous sommes concentrés sur la mise en œuvre des recommandations de sécurité conseillées par l'&lt;a href="https://cyber.gouv.fr/publications/recommandations-relatives-lauthentification-multifacteur-et-aux-mots-de-passe"&gt;agence publique française de cybersécurité "ANSSI"&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Authentification multifactorielle&lt;/h2&gt;
&lt;p&gt;Autrefois, il suffisait de demander un mot de passe pour vérifier l'identité d'une personne sur l'internet.
Cependant, il existe de multiples façons de deviner un mot de passe ou de le voler à quelqu'un, et les utilisateurs ont rapidement commencé à prendre des habitudes peu recommandables à leur égard, comme l'utilisation du même mot de passe sur tous les sites web.
Mais il n'y a pas que les mots de passe.
Les développeurs de logiciels se sont rendu compte que, surtout pour les applications sensibles, il n'est pas possible d'utiliser une seule méthode d'authentification : chacune d'entre elles présente des faiblesses et peut éventuellement être piratée.&lt;/p&gt;
&lt;p&gt;La solution a consisté à demander aux utilisateurs de s'authentifier à l'aide d'au moins deux méthodes d'authentification, ou facteurs - d'où le nom d'authentification multifactorielle.&lt;/p&gt;
&lt;p&gt;Pour un logiciel de gestion de l'identité comme Canaille, il s'agissait d'une fonctionnalité essentielle, et nous l'avons mise en œuvre pour quatre méthodes différentes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/HMAC-based_one-time_password"&gt;Mot de passe à usage unique basé sur HMAC (HOTP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Time-based_one-time_password"&gt;Mot de passe à usage unique basé sur le temps (TOTP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code envoyé par e-mail&lt;/li&gt;
&lt;li&gt;Code envoyé par SMS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les méthodes HOTP/TOTP exigent que l'utilisateur télécharge et configure une application mobile ou un logiciel d'authentification (comme &lt;a href="https://freeotp.github.io/"&gt;FreeOTP&lt;/a&gt;), qui produira à son tour des mots de passe à usage unique.
Ces mots de passe changent périodiquement (chaque fois que vous appuyez sur le bouton de votre authentificateur pour HOTP, ou après une période fixe pour TOTP), ce qui rend plus difficile pour les attaquants de mettre la main sur un mot de passe et de l'utiliser à temps.
Ce sont probablement les facteurs d'authentification les plus sûrs actuellement disponibles pour Canaille.&lt;/p&gt;
&lt;p&gt;Les deux autres facteurs (codes par e-mail ou SMS) sont plus basiques mais offrent une meilleure sécurité lorsqu'ils sont combinés au mot de passe.
Ils pourraient être adaptés à des cas d'utilisation où la facilité d'utilisation semble plus importante que la sécurité.
La méthode du e-mail exige que les administrateurs de l'instance Canaille aient configuré un serveur &lt;a href="https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol"&gt;SMTP&lt;/a&gt;.
De même, un serveur &lt;a href="https://en.wikipedia.org/wiki/Short_Message_Peer-to-Peer"&gt;SMPP&lt;/a&gt; fonctionnel est nécessaire pour la méthode SMS.&lt;/p&gt;
&lt;p&gt;Ces facteurs peuvent être cumulés, jusqu'à 3 facteurs différents (HOTP et TOTP, en utilisant la même application d'authentification, s'excluent mutuellement) en plus du mot de passe traditionnel.
L'utilisateur devra alors remplir tous les codes requis pour se connecter à son compte.
La fonction MFA peut également être complètement désactivée - dans ce cas, l'utilisateur n'aura besoin que de son mot de passe pour se connecter.&lt;/p&gt;
&lt;h2&gt;Verrouillage anti-intrusion&lt;/h2&gt;
&lt;p&gt;Pour empêcher les attaques par force brute sur les comptes Canaille, nous avons ajouté un délai entre chaque tentative de connexion échouée.
Ce délai est doublé chaque fois qu'un utilisateur saisit un mot de passe erroné.
Nous avons également envisagé de verrouiller les comptes après un certain nombre de tentatives infructueuses, mais cela aurait permis aux attaquants de verrouiller trop facilement tous les comptes d'utilisateurs.&lt;/p&gt;
&lt;h2&gt;Journalisation des événements de sécurité&lt;/h2&gt;
&lt;p&gt;Afin de faciliter la détection d'une attaque potentielle sur une instance de Canaille, nous avons ajouté la journalisation des événements sensibles.
Ces journaux sont marqués d'une étiquette spéciale "sécurité" pour faciliter leur récupération.&lt;/p&gt;
&lt;p&gt;Les événements de sécurité enregistrés comprennent les tentatives d'authentification, les mises à jour de mot de passe ou d'e-mail, l'émission ou la révocation de jetons OAuth, &lt;a href="https://canaille.readthedocs.io/en/latest/features.html#logging"&gt;etc&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Vérification de la compromission du mot de passe&lt;/h2&gt;
&lt;p&gt;Comme les utilisateurs ont tendance à réutiliser les mêmes mots de passe (avec quelques petites variations dans le meilleur des cas), il est désormais possible de vérifier si chaque nouveau mot de passe ne se trouve pas dans une base de données de mots de passe compromis, grâce à l'API de &lt;a href="https://haveibeenpwned.com/"&gt;Have I Been Pwned&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;HIBP offre un point de terminaison API gratuit qui peut être consulté pour les mots de passe compromis.&lt;/p&gt;
&lt;h2&gt;Politique d'expiration des mots de passe&lt;/h2&gt;
&lt;p&gt;Afin d'accroître la sécurité des comptes d'utilisateurs, il est désormais possible de déterminer une durée de vie pour les mots de passe.
Lorsqu'un mot de passe expire, les utilisateurs sont obligés de le mettre à jour lors de leur prochaine connexion, ou pendant leur session s'ils sont déjà connectés.&lt;/p&gt;
&lt;h1&gt;Approvisionnement avec SCIM&lt;/h1&gt;
&lt;p&gt;Canaille fournit une implémentation de serveur SCIM, qui peut être utilisée par les applications clientes pour gérer les utilisateurs et les groupes directement dans Canaille (avec les droits d'autorisation).
À l'avenir, nous aimerions créer une petite application de gestion d'abonnements à des services, et SCIM est un protocole bien adapté pour qu'une telle application puisse communiquer avec Canaille.&lt;/p&gt;
&lt;p&gt;Grâce à &lt;a href="https://yaal.coop/blog/en/scim2-toolbox"&gt;nos récents travaux sur SCIM&lt;/a&gt;, nous avions presque tout prêt pour ajouter une implémentation côté serveur de SCIM.
C'était aussi un moyen de tester nos bibliothèques SCIM en situation réelle.
Au final, cette intégration nous a fait corriger beaucoup de choses aussi bien dans notre boîte à outils SCIM que dans Canaille.&lt;/p&gt;
&lt;h1&gt;Documentation&lt;/h1&gt;
&lt;h2&gt;Internationalisation&lt;/h2&gt;
&lt;p&gt;Pour rendre Canaille plus accessible, nous avons passé du temps à rendre notre documentation traduisible.
L'interface de traduction est disponible sur &lt;a href="https://hosted.weblate.org/projects/canaille/documentation/"&gt;Weblate&lt;/a&gt;.
Nous avons également traduit la &lt;a href="https://canaille.readthedocs.io/fr"&gt;documentation en français&lt;/a&gt; pour valider le mécanisme.
Ce fut également l’occasion pour nous de revoir toute la documentation existante et de corriger les erreurs de formulation et les fautes de frappe.&lt;/p&gt;
&lt;h2&gt;Habillage&lt;/h2&gt;
&lt;p&gt;Nous avons également travaillé sur la &lt;a href="https://canaille.readthedocs.io/en/latest/tutorial/theming.html"&gt;documentation sur la personnalisation de l'habillage de Canaille&lt;/a&gt; pour aider les utilisateurs à personnaliser l'apparence de leur instance Canaille.
Nous souhaitions référencer et documenter &lt;a href="https://canaille.readthedocs.io/en/latest/references/templates.html"&gt;tous nos patrons&lt;/a&gt;, pour aider les designers à les modifier.
Pour y parvenir, nous avons dû &lt;a href="https://github.com/offlinehacker/sphinxcontrib.jinjadomain"&gt;transformer une ancienne bibliothèque non maintenue&lt;/a&gt; en une nouvelle bibliothèque &lt;a href="https://jinja-autodoc.readthedocs.io"&gt;jinja-autodoc&lt;/a&gt; pour la génération automatique de documentation de patrons.
Nous l'avons nettoyé, apporté quelques améliorations et l'avons placé sous l' organisation &lt;a href="https://github.com/sphinx-contrib"&gt;sphinx-contrib&lt;/a&gt;.&lt;/p&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>New security features implemented in Canaille</title><link href="https://yaal.coop/blog/en/canaille-nlnet-security-features" rel="alternate"/><published>2024-12-19T00:00:00+01:00</published><updated>2024-12-19T00:00:00+01:00</updated><author><name>Sébastien Birolleau &lt;sebastien@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-12-19:/blog/en/canaille-nlnet-security-features</id><summary type="html">&lt;p&gt;Important security features have been added to Canaille, our identity and authorization management software&lt;/p&gt;</summary><content type="html">&lt;p&gt;We have been working recently on key security features for Canaille, as parts of our &lt;a href="https://nlnet.nl"&gt;NLNet grant&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Security&lt;/h1&gt;
&lt;p&gt;During this sprint we focused on implementing security recommandations advised by the &lt;a href="https://cyber.gouv.fr/publications/recommandations-relatives-lauthentification-multifacteur-et-aux-mots-de-passe"&gt;French cybersecurity public agency "ANSSI"&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Multi-factor Authentication&lt;/h2&gt;
&lt;p&gt;In the old days, asking for a password was considered sufficient to verify the identity of a person on the internet.
However, there are multiple ways to guess a password or steal it from someone, and users quickly began to form less than ideal habits around them - like using the same password on every websites.
But it's not just passwords.
Software developers came to the realization that, especially for sensitive applications, you can't get away with using a single authentication method: every one of them has its weaknesses, and can eventually be cracked.&lt;/p&gt;
&lt;p&gt;The solution was found in asking users to authenticate themselves using two or more authentication methods, or factors - hence the name multi-factor authentication.&lt;/p&gt;
&lt;p&gt;For an identity management software like Canaille, this was a key feature to have, and we implemented it for four different methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/HMAC-based_one-time_password"&gt;HMAC-based one-time password (HOTP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Time-based_one-time_password"&gt;Time-based one-time password (TOTP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code sent via email&lt;/li&gt;
&lt;li&gt;Code sent via SMS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The HOTP/TOTP methods require the user to download and set up an authenticator mobile app or software (like &lt;a href="https://freeotp.github.io/"&gt;FreeOTP&lt;/a&gt;), which will in turn produce one-time passwords.
These passwords change periodically (each time you press the button in your authenticator for HOTP, or after a fixed period for TOTP), which makes it harder for attackers to get their hands on a password and use it in time.
These are probably the most secure authentication factors available now for Canaille.&lt;/p&gt;
&lt;p&gt;The remaining two factors (codes via email or SMS) are more basic but still offer a better security when combined with the password.
They might be adapted for use cases where ease of use appears more important than security.
The email method requires the administrators of the Canaille instance to have configured a &lt;a href="https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol"&gt;SMTP&lt;/a&gt; server.
Likewise, a functioning &lt;a href="https://en.wikipedia.org/wiki/Short_Message_Peer-to-Peer"&gt;SMPP&lt;/a&gt; server is needed for the SMS method.&lt;/p&gt;
&lt;p&gt;These factors can be stacked, up to 3 different factors (HOTP and TOTP, using the same authenticator app, are mutually exclusive) in addition to the traditional password.
The user will then need to fill out all the required codes in order to log in to their account.
The MFA feature can also be deactivated completely - in that case the user will only need their password to login.&lt;/p&gt;
&lt;h2&gt;Intruder lockout&lt;/h2&gt;
&lt;p&gt;To prevent brute-force attacks on Canaille accounts, we added a delay between each failed login attempt.
The delay doubles each time someone enters a wrong password.
We also considered locking accounts after a given number of failed attempts, but this would have made it too easy for attackers to lock all user accounts.&lt;/p&gt;
&lt;h2&gt;Security events logging&lt;/h2&gt;
&lt;p&gt;In order to facilitate the detection of a potential attack on a Canaille instance, we added logging for sensitive events.
Those logs are marked with a special "security" tag for easy retrieval.
They can be configured to be written in a separate file than usual log entries.&lt;/p&gt;
&lt;p&gt;Logged security events include authentication attempts, password or email updates, emission or revokation of OAuth tokens, and &lt;a href="https://canaille.readthedocs.io/en/latest/features.html#logging"&gt;more&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Password compromise investigation&lt;/h2&gt;
&lt;p&gt;Since users tend to reuse the same passwords (with some small variations in the best case), it is now possible to check if each new password is not in a compromised passwords database, thanks to the &lt;a href="https://haveibeenpwned.com/"&gt;Have I Been Pwned&lt;/a&gt;'s API.&lt;/p&gt;
&lt;p&gt;HIBP offers a free API endpoint that can be consulted for compromised passwords.&lt;/p&gt;
&lt;h2&gt;Password expiry policy&lt;/h2&gt;
&lt;p&gt;In order to increase the security of user accounts, it is now possible to determine a lifetime for passwords.
When a password expires, users are forced to update their password on their next login, or during their session if already logged in.&lt;/p&gt;
&lt;h1&gt;Provisioning with SCIM&lt;/h1&gt;
&lt;p&gt;Canaille provides a SCIM server implementation, that can be used by client applications to manage users and group directly in Canaille (given the rights permissions).
In the future we would love to build a small service subscription management application, and SCIM is a well suited protocol for such an application to communicate with Canaille.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="https://yaal.coop/blog/en/scim2-toolbox"&gt;our recent work on SCIM&lt;/a&gt; we had almost everything ready to add a server-side implementation of SCIM.
It was also a way to test our SCIM libraries in a real-world situation.
In the end, this integration made us fix a lot of things both in our SCIM toolbox and in Canaille.&lt;/p&gt;
&lt;h1&gt;Documentation&lt;/h1&gt;
&lt;h2&gt;Internationalization&lt;/h2&gt;
&lt;p&gt;To make Canaille more accessible, we spent some time to make our translation translatable.
The translation interface is available on &lt;a href="https://hosted.weblate.org/projects/canaille/documentation/"&gt;Weblate&lt;/a&gt;.
We also translated the &lt;a href="https://canaille.readthedocs.io/fr"&gt;documentation in French&lt;/a&gt; to validate the mechanism.
This was also an opportunity for us to review all the existing documentation and fix wording errors and typos.&lt;/p&gt;
&lt;h2&gt;Theming&lt;/h2&gt;
&lt;p&gt;We also have worked on the &lt;a href="https://canaille.readthedocs.io/en/latest/tutorial/theming.html"&gt;theming documentation&lt;/a&gt; to help users customize how their Canaille instance looks.
We wanted to reference and document &lt;a href="https://canaille.readthedocs.io/en/latest/references/templates.html"&gt;all our templates&lt;/a&gt;, to help designers modify them.
To achieve this we had to &lt;a href="https://github.com/offlinehacker/sphinxcontrib.jinjadomain"&gt;fork an old unmaintained library&lt;/a&gt; into a new library &lt;a href="https://jinja-autodoc.readthedocs.io"&gt;jinja-autodoc&lt;/a&gt; for automatic template documentation generation.
We cleaned it, made a few improvements, and pushed it under the &lt;a href="https://github.com/sphinx-contrib"&gt;sphinx-contrib&lt;/a&gt; organization.&lt;/p&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Boîte à outils SCIM en Python</title><link href="https://yaal.coop/blog/scim2-toolbox" rel="alternate"/><published>2024-12-05T00:00:00+01:00</published><updated>2024-12-05T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-12-05:/blog/scim2-toolbox</id><summary type="html">&lt;p&gt;Présentation des bibliothèques Python développées par Yaal Coop pour utiliser le protocole SCIM.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Nos copains d’&lt;a href="https://indiehosters.net"&gt;IndieHosters&lt;/a&gt; proposent à leurs utilisateurs un &lt;a href="https://indiehosters.net/apps"&gt;catalogue de services&lt;/a&gt; étoffé.
Leur métier est de gérer toute l’infrastructure autour de ces services, et un des enjeux importants du métier est la gestion des utilisateurs.&lt;/p&gt;
&lt;p&gt;Lorsqu’un nouveau compte utilisateur est créé auprès d’un serveur d’identité, généralement le jeton d'accès que l’utilisateur transmet aux services contient les informations nécessaires à la création du compte utilisateur auprès de ces services.
Prenons un exemple avec le serveur d’identité Keycloak et le service d’hébergement de fichiers Nextcloud :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;je crée mon compte utilisateur auprès de Keycloak (par exemple, en remplissant un formulaire d’inscription),&lt;/li&gt;
&lt;li&gt;je tente d’accéder à Nextcloud, mais je n’ai pas de session ouverte, je suis donc redirigé vers Keycloak,&lt;/li&gt;
&lt;li&gt;je m’identifie, Keycloak génère un jeton contenant mes informations personnelles,&lt;/li&gt;
&lt;li&gt;ce jeton est transmis à Nextcloud,&lt;/li&gt;
&lt;li&gt;Nextcloud lit mes informations personnelles dans le jeton.
  Si mon compte utilisateur n’existait pas sur Nextcloud, alors il est créé.
  Sinon, mes informations personnelles sont mises à jour dans Nextcloud.&lt;/li&gt;
&lt;li&gt;Nextcloud m’autorise enfin l’accès aux fichiers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C’est très pratique, mais ça ne couvre pas tous les cas de figure :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comment faire pour partager un document avec un utilisateur qui ne s’est jamais encore connecté à un service ? Pour le moment il est nécessaire d’attendre la première connexion d’un utilisateur avant que son compte ne soit créé sur Nextcloud.&lt;/li&gt;
&lt;li&gt;Un utilisateur édite une information le concernant sur le serveur d’identité, par exemple son nom d’affichage. Comment faire pour diffuser l'information instantanément auprès des services (par exemple un compte mail ou un chat qui identifie l'utilisateur par ce même Keycloak) ?Actuellement, les mises à jour d’informations personnelles ne sont répandues sur Nextcloud que lorsque les utilisateurs s’y connectent.&lt;/li&gt;
&lt;li&gt;Comment supprimer ou désactiver un compte utilisateur auprès de tous les services ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour effectuer toutes ces opérations, on utilise un protocole de &lt;a href="https://fr.wikipedia.org/wiki/Provisionnement"&gt;provisionnement&lt;/a&gt;.
&lt;em&gt;Provisionner&lt;/em&gt; consiste grossièrement à diffuser des modification sur un objet entre plusieurs services.
De nos jours, le protocole de provisionnement souvent utilisé dans l’industrie est &lt;a href="https://simplecloud.info"&gt;SCIM&lt;/a&gt;.
IndieHosters a préparé une &lt;a href="https://scim.libre.sh"&gt;page web d’explications sur le protocole&lt;/a&gt; que l’on vous invite à consulter.&lt;/p&gt;
&lt;p&gt;IndieHosters a obtenu un financement auprès de &lt;a href="https://nlnet.nl"&gt;NLNet&lt;/a&gt; pour développer SCIM dans l’écosystème des outils qu’ils utilisent, et ont fait appel à Yaal Coop pour une partie des travaux.
Nous avions plusieurs mission :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fournir un outil en ligne de commandes qui permette de communiquer avec un serveur SCIM, et de tester la conformité d’un serveur SCIM vis-à-vis de la norme.
  Ce projet a donné lieu à plusieurs sous-projets:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scim2-models.readthedocs.io"&gt;scim2-models&lt;/a&gt;, une bibliothèque Python de sérialisation et validation de ressources SCIM.
  Elle est basée sur &lt;a href="https://docs.pydantic.dev"&gt;Pydantic&lt;/a&gt; et fournit des objets natifs qui représentent des ressources SCIM et qui implémente une partie de la norme.
  Elle a pour but de servir de brique de base à des serveurs ou des clients SCIM.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scim2-client.readthedocs.io"&gt;scim2-client&lt;/a&gt;, une bibliothèque Python de fabrication et d’analyse pythonique de requêtes SCIM.
  Elle s’appuie sur scim2-models et sur &lt;a href="https://www.python-httpx.org"&gt;httpx&lt;/a&gt; pour créer des requêtes SCIM, et analyser les réponses des serveurs.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server"&gt;scim2-server&lt;/a&gt;, un prototype de serveur SCIM développé par &lt;a href="https://www.contact-software.com"&gt;CONTACT Software&lt;/a&gt; utilisant scim2-models, et co-maintenu par Yaal Coop.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scim2-tester.readthedocs.io"&gt;scim2-tester&lt;/a&gt;, une bibliothèque Python de test de conformité aux normes SCIM. Elle s’appuie sur scim2-client pour envoyer diverses requêtes à un serveur SCIM et observer son comportement en réponse.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scim2-cli.readthedocs.io"&gt;scim2-cli&lt;/a&gt;, un outil en ligne de commandes qui s’appuie sur scim2-client et scim2-tester et qui fournit une interface pour effectuer des opérations simples sur un serveur SCIM.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Proposer l’adoption de SCIM comme protocole officiel de provisionnement dans le protocole de messagerie instantanée &lt;a href="https://matrix.org"&gt;Matrix&lt;/a&gt;.
  Nous avons rédigé une proposition d’évolution de la norme (&lt;a href="https://github.com/matrix-org/matrix-spec-proposals/pull/4098"&gt;MSC4098&lt;/a&gt;), pour lesquelles les discussions sont en cours.
  À l’heure actuelle la proposition est toujours à l’étude, mais le principal argument contre est que le provisionnement est hors du périmètre fonctionnel que cherche à couvrir Matrix.&lt;/li&gt;
&lt;li&gt;Conjointement à la proposition d’évolution de la norme, nous avons proposé une &lt;a href="https://github.com/element-hq/synapse/pull/17144"&gt;implémentation de SCIM dans synapse&lt;/a&gt;, le serveur Matrix le plus utilisé actuellement.
  L’implémentation se base sur scim2-models.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SCIM nous apparaît comme une norme d'avenir pour le provisionnement et espérons que les bibliothèques que nous avons construites aideront son développement, grâce à de nouveaux outils Python et, à terme, sans ce limiter à ce langage.
Le provisionnement de services est une technique utile aux petit fournisseurs se services en ligne, comme ceux du collectif &lt;a href="https://chatons.org"&gt;CHATONS&lt;/a&gt;.
Ils font généralement fonctionner ensemble des services hétérogènes, et des normes telles que SCIM aident ces services à communiquer entre eux.
Nous espérons qu'à terme nos travaux permettront d'avoir un impact sur la qualité de service de ces petits fournisseurs, et ainsi aider leur développement.&lt;/p&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Python SCIM toolbox</title><link href="https://yaal.coop/blog/en/scim2-toolbox" rel="alternate"/><published>2024-12-05T00:00:00+01:00</published><updated>2024-12-05T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-12-05:/blog/en/scim2-toolbox</id><summary type="html">&lt;p&gt;Presentation of the Python libraries developed by Yaal Coop to interact with the SCIM protocol.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Our friends from &lt;a href="https://indiehosters.net"&gt;IndieHosters&lt;/a&gt; provide a rich &lt;a href="https://indiehosters.net/apps"&gt;catalog of services&lt;/a&gt; to their users.
They are specialized in infrastructure management of those services, and one of the major aspects of their work is the management of user accounts.&lt;/p&gt;
&lt;p&gt;When a new user account is created against an identity server, most of the time the access token that the users provide to the services contains information about the user. This information is generally enough to create the users account on the service provider.
Let us study an example with the Keycloak identity provider and a the Nextcloud file management service.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the users create their account against Keycloak (for instance by filling a subscription form),&lt;/li&gt;
&lt;li&gt;they try to access Nextcloud, but they have no open session, so they get redirected to Keycloak,&lt;/li&gt;
&lt;li&gt;they log in, Keycloak generates a token containing their personal information,&lt;/li&gt;
&lt;li&gt;this token is forwarded to Nextcloud,&lt;/li&gt;
&lt;li&gt;Nextcloud reads the personal information from the token.
  If the user account does not exist on Nextcloud, then it is created.
  Otherwise, the personal information is updated on Nextcloud.&lt;/li&gt;
&lt;li&gt;Nextcloud finally gives access to the user.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is convenient, but this does not cover all the use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How to share a document with users that never logged in yet?
  For the moment it is needed to wait for a first user login on Nextcloud before its Nextcloud account is created.&lt;/li&gt;
&lt;li&gt;Users edit their personal information on the identity server (for instance, their &lt;em&gt;display name&lt;/em&gt;).
  How to instantly spread the modification on all the services?
  Currently, personal information are only updated when users log-in anew on the services.&lt;/li&gt;
&lt;li&gt;How to delete or deactivate user accounts on all the services, once they have been created?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To achieve all those operations, it is needed to use a &lt;a href="https://en.wikipedia.org/wiki/Provisioning_(technology)"&gt;provisioning protocol&lt;/a&gt;.
&lt;em&gt;Provisioning&lt;/em&gt; is the action of forwarding objects (often user and groups) modifications between several services.
These days, the industry standard is &lt;a href="https://simplecloud.info"&gt;SCIM&lt;/a&gt;.
IndieHosters started a nice &lt;a href="https://scim.libre.sh"&gt;presentation webpage&lt;/a&gt; about SCIM.&lt;/p&gt;
&lt;p&gt;They obtained a &lt;a href="https://nlnet.nl"&gt;NLNet&lt;/a&gt; grant to develop SCIM in the ecosystem of their tools, and hired Yaal Coop for a part of the project.
We had several missions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provide a command line interface that would allow to easily communicate with a SCIM server, and test the conformity of a SCIM server towards the specifications.
  This project gave birth to several sub-projects:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scim2-models.readthedocs.io"&gt;scim2-models&lt;/a&gt;, a SCIM resources validation and serialization Python library.
  It relies on &lt;a href="https://docs.pydantic.dev"&gt;Pydantic&lt;/a&gt;, provides native objects that implement the SCIM specification.
  It aims to be used as a building block for SCIM server and client applications.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scim2-client.readthedocs.io"&gt;scim2-client&lt;/a&gt;, a Python library that creates and validates SCIM network requests.
  It uses &lt;a href="https://www.python-httpx.org"&gt;httpx&lt;/a&gt; to handle the network part.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-server"&gt;scim2-server&lt;/a&gt;, a SCIM server prototype that uses &lt;em&gt;scim2-models&lt;/em&gt; developped by &lt;a href="https://www.contact-software.com"&gt;CONTACT Software&lt;/a&gt;, and co-maintained by Yaal Coop.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scim2-tester.readthedocs.io"&gt;scim2-tester&lt;/a&gt;, a SCIM compliance testing Python library.
  It uses scim2-client to send various requests to a SCIM server, and check if it behaves as expected by the SCIM specifications.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scim2-cli.readthedocs.io"&gt;scim2-cli&lt;/a&gt;, a command line utility that uses scim2-client and scim2-tester, and provides an interface to perform various operations on SCIM servers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Discuss the adoption of SCIM as the official provisioning protocol for the instant messaging protocol &lt;a href="https://matrix.org"&gt;Matrix&lt;/a&gt;.
  We redacted an evolution request for the protocol (&lt;a href="https://github.com/matrix-org/matrix-spec-proposals/pull/4098"&gt;MSC4098&lt;/a&gt;), for which discussions are still opened.
  To this day the proposition has not been adopted, the main argument against is that provisioning is out of scope of the Matrix protocol.&lt;/li&gt;
&lt;li&gt;In parallel, we developed a &lt;a href="https://github.com/element-hq/synapse/pull/17144"&gt;SCIM implementation in synapse&lt;/a&gt;, the most famous Matrix server currently. The implementation uses scim2-models.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SCIM appears to us a future standard for provisioning and we hope that the libraries developed will help its development, thanks to new Python tools and eventually without limiting this language.
Provisioning is an useful technique for alternative online service providers, such as the ones in the &lt;a href="https://chatons.org"&gt;CHATONS&lt;/a&gt; collective.
They deploy heterogeneous sets of services, and specifications such as SCIM help those services to communicate.
We hope that in the long run our work will have an impact on the quality of service of those little providers, and help them grow.&lt;/p&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Introduction à l'UX, présentation d'une présentation</title><link href="https://yaal.coop/blog/sensibilisation-ux" rel="alternate"/><published>2024-09-23T00:00:00+02:00</published><updated>2024-09-23T00:00:00+02:00</updated><author><name>Brunélie Lauret &lt;brunelie@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-09-23:/blog/sensibilisation-ux</id><summary type="html">&lt;p&gt;Présentation d'un petit site statique d'introduction à l'UX réalisé pour une présentation aux coopérateur⋅ices&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Expérience utilisateur, sensibilisation et périmètre&lt;/h1&gt;
&lt;p&gt;Etant l'unique designer de l'équipe de Yaal Coop à ce jour et depuis l'ouverture de la SCIC en 2020, j'ai réalisé courant 2023 une petite présentation de sensibilisation à l'UX, ou Expérience Utilisateur, à destination du reste de l'équipe.&lt;/p&gt;
&lt;p&gt;On trouvait ça dommage de tout garder pour nous, alors c'est accessible à tous⋅tes !&lt;/p&gt;
&lt;p&gt;La présentation, en format pages web, est accessible à tous⋅tes sur notre site à l'adresse &lt;a href="https://yaal.coop/ux/index.html"&gt;https://yaal.coop/ux/index.html&lt;/a&gt;.
Elle regroupe quelques notions de base d'UX, comme son périmètre, son interconnexion avec les métiers adjacents (conception, développement, communication, support...), quelques éléments sur lesquels être vigilants à chaque étape de conception, et quelques outils pratiques d'expérience utilisateur et de design.&lt;/p&gt;
&lt;p&gt;La vision proposée dans cette courte présentation survole un sujet vaste et qui mérite beaucoup plus d'heures et d'assiduité pour connaître tous ses rouages. J'espère qu'elle peut inspirer des développeurs et développeuses à s'y pencher plus en profondeur !&lt;/p&gt;</content><category term="Design"/><category term="Design"/></entry><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant l'été 2024</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-ete-2024" rel="alternate"/><published>2024-09-22T00:00:00+02:00</published><updated>2024-09-22T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-09-22:/blog/dernieres-contributions-logiciels-libres-ete-2024</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant l'été 2024.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Mécénat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; pour son travail sur &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, un chouette framework CSS que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; pour son travail sur &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, une bibliothèque python d'authentification que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pygments.org/"&gt;Pygments&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque Python de coloration syntaxique&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pygments/pygments/pull/2757"&gt;Ajout du champ Changed-By au lexeur debian/control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pygments/pygments/pull/2767"&gt;Correction de l'interprétation de caractère de commentaire dans une chaîne de caractères&lt;/a&gt; entourées de guillemets dans le lexeur IniLexer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pspdev.github.io/pspsdk/index.html"&gt;PSPSDK&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Ensemble d'outils et de bibliothèques pour la console PSP de Sony&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amélioration de la documentation : &lt;a href="https://github.com/pspdev/pspsdk/pull/234"&gt;correction d'un lien vers la licence&lt;/a&gt;, &lt;a href="https://github.com/pspdev/pspsdk/pull/235"&gt;suppression d'un fichier README obsolète&lt;/a&gt; et &lt;a href="https://github.com/pspdev/pspsdk/pull/236"&gt;correction d'erreurs typographiques&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;apt-setup&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Partie de Debian-Installer. Produit un fichier /etc/apt/sources.list pour le système installé&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amélioration de la documentation : &lt;a href="https://salsa.debian.org/installer-team/apt-setup/-/merge_requests/18"&gt;rattrapage du comportement actuel de 01setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Sérialisation et validation de ressources SCIM avec Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/35"&gt;Modèles dynamiques à partir de schémas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/38"&gt;Support de modèles avec plusieurs extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/40"&gt;Export de modèles vers des schémas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/41"&gt;Correctif sur la casse des attributs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/44"&gt;Les extensions utilisent des champs Pydantic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/47"&gt;Correctif sur la casse des attributs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/52"&gt;Correctif sur l’ordre des schémas de &lt;code&gt;ListResponse&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/65"&gt;Correctifs sur le typage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/66"&gt;Utilisation de paramètres de types pour &lt;code&gt;ListResponse&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/67"&gt;Correctifs sur le typage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/68"&gt;Correctifs d’avertissements dans les tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/69"&gt;Réusinage du mécanisme d’extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/71"&gt;Tests des projets en aval dans l’intégration continue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/76"&gt;Correctif sur l’usage des discriminants Pydantic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/78"&gt;Les charges utiles des extensions sont facultatives&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-client"&gt;scim2-client&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Fabrication et analyse pythonique de requêtes SCIM&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-client/pull/20"&gt;Support des charset dans l’entête &lt;code&gt;Content-Type&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-tester"&gt;scim2-tester&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Outil de vérification de conformité de serveurs aux normes SCIM&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-tester/pull/5"&gt;Documentation sur l’usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-tester/pull/7"&gt;Correctif sur la manipulation des erreurs réseau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-tester/pull/9"&gt;Compatibilité avec scim2-client 0.2.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-cli"&gt;scim2-cli&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Outil en ligne de commandes pour interagir avec des applications SCIM&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-cli/pull/7"&gt;Paramètres de commandes dynamiques&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-cli/pull/10"&gt;Documentation sur la fabrication des binaires&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-server"&gt;scim2-server&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Prototype de server SCIM2 ultra-léger&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-server/pull/3"&gt;Le préfixe &lt;code&gt;/v2&lt;/code&gt; est optionnel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion des identités et des accès&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/676"&gt;Mise à jour d'actions GHA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/element-hq/synapse"&gt;synapse&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur Matrix écrit en Python/Twisted&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/element-hq/synapse/pull/17667"&gt;Réusinage des imports Pydantic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://felix-martel.github.io/pydanclick"&gt;pydanclick&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Ajoutez des options Click à partir de modèles Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/felix-martel/pydanclick/pull/25"&gt;Réusinage sur le traitement d’une exception&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur d’identité et d'autorisations ultra-léger&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/179"&gt;Arrêt du support pour Python 3.9&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Summer 2024 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-ete-2024" rel="alternate"/><published>2024-09-22T00:00:00+02:00</published><updated>2024-09-22T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-09-22:/blog/en/dernieres-contributions-logiciels-libres-ete-2024</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during summer 2024.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Sponsoring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; for his work on &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, a nice CSS framework we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI is used on other tools we rely on, like &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; for his work on &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, a python authentication library we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pygments.org/"&gt;Pygments&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Pygments is a generic syntax highlighter written in Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pygments/pygments/pull/2757"&gt;Add Changed-By field to debian control lexer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pygments/pygments/pull/2767"&gt;Fix parsing in quoted string containing comment character&lt;/a&gt; in IniLexer lexer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://pspdev.github.io/pspsdk/index.html"&gt;PSPSDK&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Collection of tools and libraries written for Sony's Playstation Portable (PSP) gaming console&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Documentation improvement: &lt;a href="https://github.com/pspdev/pspsdk/pull/234"&gt;fix a link to the licence&lt;/a&gt;, &lt;a href="https://github.com/pspdev/pspsdk/pull/235"&gt;delete an obsolete README file&lt;/a&gt; and &lt;a href="https://github.com/pspdev/pspsdk/pull/236"&gt;fix typos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;apt-setup&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Part of Debian-Installer. Generate an /etc/apt/sources.list for the installed system&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Documentation improvement: &lt;a href="https://salsa.debian.org/installer-team/apt-setup/-/merge_requests/18"&gt;catch up the current behavior of 01setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM resources serialization and validation with Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/35"&gt;Dynamic models from schemas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/38"&gt;Support for models with multiple extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/40"&gt;Models to schemas export support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/41"&gt;Fix attributes case sensitivity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/44"&gt;Extensions use pydantic fields&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/47"&gt;Fix attributes case sensitivity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/52"&gt;&lt;code&gt;ListResponse&lt;/code&gt; schema order fixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/65"&gt;Typing fixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/66"&gt;Use type parameters for &lt;code&gt;ListResponse&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/67"&gt;Typing fixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/68"&gt;Unit test warnings fixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/69"&gt;Extension mechanism rework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/71"&gt;Downstream projects unit tests CI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/76"&gt;Pydantic discriminator warning fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-models/pull/78"&gt;Extension payloads are optional&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-client"&gt;scim2-client&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Pythonically build SCIM requests and parse SCIM responses&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-client/pull/20"&gt;&lt;code&gt;Content-Type&lt;/code&gt; header charset support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-tester"&gt;scim2-tester&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM RFCs server compliance checker&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-tester/pull/5"&gt;Usage documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-tester/pull/7"&gt;Fix network errors handling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-tester/pull/9"&gt;Compatibility with scim2-client 0.2.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-cli"&gt;scim2-cli&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM application development CLI&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-cli/pull/7"&gt;Dynamic command parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-cli/pull/10"&gt;Binaries building documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-server"&gt;scim2-server&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lightweight SCIM2 server prototype&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yaal-coop/scim2-server/pull/3"&gt;&lt;code&gt;/v2&lt;/code&gt; prefix is optional&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Identity and Access management library for python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/676"&gt;GHA action update&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/element-hq/synapse"&gt;synapse&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Matrix homeserver written in Python/Twisted&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/element-hq/synapse/pull/17667"&gt;Pydantic import refactoring&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://felix-martel.github.io/pydanclick"&gt;pydanclick&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;*Add click options from a Pydantic model *&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/felix-martel/pydanclick/pull/25"&gt;Exception catching refactoring&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lightweight identity and authorization management software&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/179"&gt;Stop support for Python 3.9&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant le printemps 2024</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-printemps-2024" rel="alternate"/><published>2024-06-21T00:00:00+02:00</published><updated>2024-06-21T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-06-21:/blog/dernieres-contributions-logiciels-libres-printemps-2024</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant le printemps 2024.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Mécénat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; pour son travail sur &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, un chouette framework CSS que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; pour son travail sur &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, une bibliothèque python d'authentification que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/sharkdp/bat"&gt;Bat&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Un clone de cat(1) avec coloration syntaxique et intégration Git&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sharkdp/bat/pull/2937"&gt;Affiche quel est le thème par défaut&lt;/a&gt; lors de l'utilisation du paramètre &lt;code&gt;--list-themes&lt;/code&gt; et la coloration désactivée. Cette PR permet d'avoir un comportement cohérent avec la &lt;a href="https://github.com/sharkdp/bat/pull/2838"&gt;PR précédente&lt;/a&gt; où la coloration est activée.&lt;/li&gt;
&lt;li&gt;Amélioration de la &lt;a href="https://github.com/sharkdp/bat/pull/2942"&gt;couverture de code&lt;/a&gt; lors de l'utilisation du paramètre &lt;code&gt;--list-languages&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur OpenID Connect simpliste, basé sur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/166"&gt;Mise à jour vers HTMX 1.9.11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/167"&gt;Utilisation du module standard python pour charger les fichiers toml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/168"&gt;Utilisation d’un meilleur thème pour la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/170"&gt;Validation de la configuration avec pydantic-settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/171"&gt;Correction d’un souci de rétrocompatibilité impliquant LDAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/172"&gt;Mise à jour vers HTMX 1.9.12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/173"&gt;Suppression des membres d’un groupe depuis la page d’édition du groupe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/174"&gt;Commandes de gestion des modèles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/175"&gt;Documentation des cas d’usage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/spiral-project/ihatemoney"&gt;ihatemoney&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Une application web simple de gestion de budget&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1298"&gt;Correctif de création de paquets avec python 3.12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1305"&gt;Accélération des tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime"&gt;python-libfaketime&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Une alternative rapide à freezegun pour mocker les dates, en utilisant libfaketime&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/65"&gt;Support des versions de python 3.8 à 3.12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/67"&gt;Utilisation de markdown à la place de RST dans la documentatino&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/68"&gt;Correctif du script de benchmark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/69"&gt;Améliorations sur la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/71"&gt;Mise à jour de l’URL de pytest-libfaketime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/72"&gt;Implémentation du paramètre &lt;code&gt;quiet&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/73"&gt;Support de GitHub Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/75"&gt;Mise à jour vers libfaketime 0.9.10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/77"&gt;Correction du lien du badge GHA sur le fichier README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/78"&gt;Support des fichiers &lt;code&gt;timestamp&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/79"&gt;Correction sur la documentation du README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/80"&gt;Configuration des outils d’analyse statique&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pytest-dev/pytest-libfaketime"&gt;pytest-libfaketime&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Prepare pytest à l’utilisation de python-libfaketime&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest-libfaketime"&gt;Déménagement dans le group pytest-dev de GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/pytest-libfaketime/0.1.3/"&gt;0.1.3 release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pytest-dev/pytest-iam"&gt;pytest-iam&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur OAuth2/OIDC léger pour suites de tests unitaires&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest-iam"&gt;Déménagement dans le group pytest-dev de GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/pytest-iam/0.0.10/"&gt;0.0.10 release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Debian&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Extraction de la page de manuel de &lt;a href="https://salsa.debian.org/games-team/blastem/-/merge_requests/3"&gt;BlastEm&lt;/a&gt; car elle n'est plus dans le dépôt amont&lt;/li&gt;
&lt;li&gt;Mise-à-jour de l'amélioration de la page de manuel de &lt;a href="https://salsa.debian.org/games-team/blastem/-/merge_requests/2"&gt;BlastEm&lt;/a&gt; sur la page de manuel nouvellement extraite&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Sérialisation et validation de ressources SCIM avec Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scim2-models.readthedocs.io"&gt;Publication initiale et documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-client"&gt;scim2-client&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Fabrication et analyse pythonique de requêtes SCIM&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scim2-client.readthedocs.io"&gt;Publication initiale et documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-tester"&gt;scim2-tester&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Outil de vérification de conformité de serveurs aux normes SCIM&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scim2-tester.readthedocs.io"&gt;Publication initiale et documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-cli"&gt;scim2-cli&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM application development CLI&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scim2-cli.readthedocs.io"&gt;Publication initiale et documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Spring 2024 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-printemps-2024" rel="alternate"/><published>2024-06-21T00:00:00+02:00</published><updated>2024-06-21T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-06-21:/blog/en/dernieres-contributions-logiciels-libres-printemps-2024</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during spring 2024.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Sponsoring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; for his work on &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, a nice CSS framework we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI is used on other tools we rely on, like &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; for his work on &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, a python authentication library we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/sharkdp/bat"&gt;Bat&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A cat(1) clone with syntax highlighting and Git integration&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sharkdp/bat/pull/2838"&gt;Display which theme is the default one&lt;/a&gt; with &lt;code&gt;--list-themes&lt;/code&gt; parameter and disabled colors. With this PR, bat has the same behaviour than with enabled colors (done in &lt;a href="https://github.com/sharkdp/bat/pull/2838"&gt;previous PR&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Improve &lt;a href="https://github.com/sharkdp/bat/pull/2942"&gt;code coverage&lt;/a&gt; for &lt;code&gt;--list-languages&lt;/code&gt; parameter&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lightweight identity and authorization management software&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/166"&gt;Update to HTMX 1.9.11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/167"&gt;Use the standard python module to parse toml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/168"&gt;Use a better theme for the documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/170"&gt;Validate the configuration with pydantic-settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/171"&gt;Fix a retrocompatibility bug involving LDAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/172"&gt;Update to HTMX 1.9.12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/173"&gt;Group member removal from the group management page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/174"&gt;Model management commands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/175"&gt;Use cases documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/spiral-project/ihatemoney"&gt;ihatemoney&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A simple shared budget manager web application&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1298"&gt;Packaging issue fix with python 3.12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1305"&gt;Unit tests speed-up&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime"&gt;python-libfaketime&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A fast time mocking alternative to freezegun that wraps libfaketime.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/65"&gt;Support for python 3.8 to 3.12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/67"&gt;Use markdown instead of RST in the documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/68"&gt;Benchmark script fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/69"&gt;Documentation improvements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/71"&gt;pytest-libfaketime URL update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/72"&gt;&lt;code&gt;quiet&lt;/code&gt; implementation parameter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/73"&gt;GitHub Actions support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/75"&gt;Bump to libfaketime 0.9.10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/77"&gt;README GHA badge fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/78"&gt;Timestamp file support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/79"&gt;README documentation fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/simon-weber/python-libfaketime/pull/80"&gt;Linters configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pytest-dev/pytest-libfaketime"&gt;pytest-libfaketime&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Prepare pytest for python-libfaketime&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest-libfaketime"&gt;Move to GitHub under the pytest-dev umbrella&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/pytest-libfaketime/0.1.3/"&gt;0.1.3 release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pytest-dev/pytest-iam"&gt;pytest-iam&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A fully functional OAUTH2 / OpenID Connect (OIDC) server to be used in your testsuite&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest-iam"&gt;Move to GitHub under the pytest-dev umbrella&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/pytest-iam/0.0.10/"&gt;0.0.10 release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Debian&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Extract &lt;a href="https://salsa.debian.org/games-team/blastem/-/merge_requests/3"&gt;BlastEm&lt;/a&gt; manpage because it does not existe anymore in the upstream repository&lt;/li&gt;
&lt;li&gt;Update improved &lt;a href="https://salsa.debian.org/games-team/blastem/-/merge_requests/2"&gt;BlastEm&lt;/a&gt; manpage to the new manpage&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-models"&gt;scim2-models&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM resources serialization and validation with Pydantic&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scim2-models.readthedocs.io"&gt;Initial releases and documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-client"&gt;scim2-client&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Pythonically build SCIM requests and parse SCIM responses&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scim2-client.readthedocs.io"&gt;Initial releases and documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-tester"&gt;scim2-tester&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM RFCs server compliance checker&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scim2-tester.readthedocs.io"&gt;Initial releases and documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/yaal-coop/scim2-cli"&gt;scim2-cli&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;SCIM application development CLI&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scim2-cli.readthedocs.io"&gt;Initial releases and documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Chapitre 2023</title><link href="https://yaal.coop/blog/chapitre-2023" rel="alternate"/><published>2024-05-15T00:00:00+02:00</published><updated>2024-05-15T00:00:00+02:00</updated><author><name>Brunélie Lauret &lt;brunelie@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-05-15:/blog/chapitre-2023</id><summary type="html">&lt;p&gt;Des nouvelles de Yaal Coop, et le rapport de gestion de l'année 2023&lt;/p&gt;</summary><content type="html">&lt;p&gt;Une année de plus au compteur pour Yaal Coop !&lt;/p&gt;
&lt;p&gt;Nous vous avons assez peu régalé en articles de blog cette année, mais l'une de nos dernières publications ne vous a probablement pas échappé : &lt;a href="https://yaal.coop/blog/yaal-coop-recrute"&gt;Yaal Coop recrute !&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ce que ça veut dire, entre autres choses, c'est qu'il y a de l'activité dans la SCIC ! Notre Assemblée Générale Ordinaire s'est déroulée le 29 avril 2024, en faisant le tour de l'année 2023, de ses projets, de nos objectifs coopératifs et de nos perspectives pour l'année en cours.&lt;/p&gt;
&lt;p&gt;Sans plus attendre, notre rapport de gestion :&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Cher·e sociétaire,&lt;/p&gt;
&lt;p&gt;Nous avons l’honneur de vous présenter notre rapport sur les opérations de l’exercice clos le 31 décembre 2023, ainsi que sur les comptes annuels dudit exercice soumis aujourd’hui à votre approbation. Ce rapport a été rédigé collectivement par le collège des salarié·es de Yaal Coop.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Les faits marquants et nos projets en 2023&lt;/h2&gt;
&lt;h3&gt;Déménagement&lt;/h3&gt;
&lt;p&gt;En Septembre 2023, Yaal Coop a déménagé et s'est installé à Bègles, au 16 Rue des Terres Neuves !&lt;/p&gt;
&lt;p&gt;Après de longs mois de travaux, la coopérative s'installe dans ses nouveaux locaux et y accueille un mois plus tard ses premiers locataires.&lt;/p&gt;
&lt;p&gt;Actuellement et depuis l'ouverture du local, Yaal Coop en assure la gestion administrative et quotidienne, et recherche toujours de nouveaux locataires.&lt;/p&gt;
&lt;p&gt;Sur l'année 2023, la gestion de la SCI par Yaal Coop a occupé environ 13% de notre temps, et la coopérative mise sur une réduction de ce temps à mesure que la routine de gestion s'installe, que les travaux d'aménagement se terminent et que l'occupation des locataires se stabilise.&lt;/p&gt;
&lt;h3&gt;Nos Projets&lt;/h3&gt;
&lt;h4&gt;Portail RSE&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://portail-rse.beta.gouv.fr/"&gt;https://portail-rse.beta.gouv.fr/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Camille et Stéphane poursuivent le développement de la plateforme Portail RSE (anciennement Projet IMPACT), Start-up d'État faisant partie du programme beta.gouv et pilotée par la Direction Générale des Entreprises.&lt;/p&gt;
&lt;p&gt;Brunélie rejoint le projet en tant qu'UX/UI designer et à l'intégration à la fin de l'été.&lt;/p&gt;
&lt;p&gt;Des nouvelles réglementations sont ajoutées à la plateforme, et les textes réglementaires de la CSRD, cible importante pour le produit, arrivent en fin d'année. Les premières étapes sur le chantier CSRD sont publiés sur le Portail RSE en décembre 2023.&lt;/p&gt;
&lt;h3&gt;Lum1&lt;/h3&gt;
&lt;p&gt;Lum1 était un projet d'investissement technique qui proposait un annuaire collaboratif dédié et réservé aux professionnels du social et de la santé.&lt;/p&gt;
&lt;p&gt;Après des avancées techniques, les développements se sont ralentis puis, en l'absence de perspectives commerciales, la décision de fermer l'entreprise Lum1 a été prise par l'ensemble de ses actionnaires en novembre 2023. La valorisation des actions détenues par Yaal Coop dans Lum1 devient donc nulle.&lt;/p&gt;
&lt;h3&gt;PodEduc&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://podeduc.apps.education.fr/"&gt;https://podeduc.apps.education.fr/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PodEduc est un projet d’hébergement et de montage de vidéos à destination de l’éducation nationale. Loan et Éloi ont réalisé une mission qui permet une meilleure intégration du projet sur mobile.&lt;/p&gt;
&lt;h3&gt;B3Desk&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/numerique-gouv/b3desk"&gt;https://github.com/numerique-gouv/b3desk&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;B3Desk est un projet de gestion des accès aux plateformes de visioconférences utilisées par l’éducation nationale.&lt;/p&gt;
&lt;p&gt;Loan et Éloi ont travaillé sur B3Desk au long cours pour développer les fonctionnalités, corriger les dysfonctionnement, documenter et renseigner les équipes techniques.&lt;/p&gt;
&lt;h3&gt;Telecoop&lt;/h3&gt;
&lt;p&gt;Un backoffice pour la gestion des lignes téléphoniques et des factures à été livré en début d'année. Il a été réalisé dans le but de dégager du temps à l'équipe technique en donnant de l'autonomie aux responsables clients.&lt;/p&gt;
&lt;p&gt;Des évolutions de ce service ont ensuite débuté à la fin de l'année (et se poursuivent aujourd'hui) pour offrir plus de possibilités d'actions et de présentation.&lt;/p&gt;
&lt;h3&gt;G4 Ingénierie&lt;/h3&gt;
&lt;p&gt;G4Ingénierie est un bureau d'ingénierie en géomatique.
Nous avons réalisé pour ce client un petit projet leur permettant de mettre en ligne les représentations cartographiques qu’ils produisent.&lt;/p&gt;
&lt;h3&gt;Canaille&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://canaille.yaal.coop/"&gt;https://canaille.yaal.coop/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Canaille est notre logiciel libre de gestion d'identité et d'autorisations développé en interne.&lt;/p&gt;
&lt;p&gt;De nouveaux développements ont été réalisés en 2023, en partie grâce au financement de 7k€ accordé par la fondation européenne NLnet. Un &lt;a href="https://yaal.coop/blog/canaille-nlnet-pytest-iam"&gt;article de blog&lt;/a&gt;  a été publié pour retracer l'histoire du logiciel et préciser les développements réalisés avec l'aide de NLnet.&lt;/p&gt;
&lt;h3&gt;Nubla&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://nubla.fr/"&gt;https://nubla.fr/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nubla est notre service d'e-mail, cloud et messagerie à destination des particuliers et professionnels.&lt;/p&gt;
&lt;p&gt;Nous n'avons malheureusement eu que trop peu de temps dédié au développement technique et commercial de ce projet interne en 2023. Mais le service actuel est toujours fonctionnel et tous nos clients ont renouvelé leur confiance et leur abonnement !&lt;/p&gt;
&lt;h3&gt;GeoNature - citizen&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://enquetes.lashf.org/fr/home"&gt;https://enquetes.lashf.org/fr/home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La SHF, Société Herpétologique de France, nous a approché pour faire évoluer une solution libre d'inventaires participatifs pour pouvoir passer d'une ancienne solution, à cet outil : GeoNature - citizen.&lt;/p&gt;
&lt;p&gt;Le besoin était d'implémenter une étape de validation des observations réalisées par les participants jusque là absente de la solution. Cette solution est intégrée à un projet plus vaste d'éducation et de recensement des amphibiens et reptiles : &lt;a href="https://undragon.org/"&gt;https://undragon.org/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Yuticket&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.yuticket.com/"&gt;https://www.yuticket.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Yuticket est une billeterie en ligne dont Yaal Coop fait la maintenance. Le service évolue peu.&lt;/p&gt;
&lt;h3&gt;Supercoop&lt;/h3&gt;
&lt;p&gt;En 2023, Camille et Eloi ont continué de consacrer 1 journée par mois au supermarché coopératif de Bordeaux en bénévolat pour les aider sur la maintenance et le développement de leurs outils informatiques.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Notre projet coopératif&lt;/h2&gt;
&lt;h3&gt;Sociétariat&lt;/h3&gt;
&lt;p&gt;Excepté Julien, salarié du 27 décembre 2022 au 30 juin 2023, tous⋅tes les salarié⋅es étaient également associé⋅es de Yaal Coop au cours de l'année 2023 et détiennent chacun⋅e une voix égale au sein du collège des salarié⋅es, conformément à nos statuts.&lt;/p&gt;
&lt;p&gt;En avril 2023, Colin Garriga-Salaün est devenu associé et a rejoint en son nom propre le collège des observateurs. Son entrée a été confirmée lors de la précédente AG annuelle du 09 mai 2023.&lt;/p&gt;
&lt;p&gt;Il n'y a eu aucune modification du sociétariat depuis et la composition des collèges n'a donc pas évoluée depuis le dernier rapport de gestion 2022. Elle est toujours la suivante en date du 29 avril 2024 :&lt;/p&gt;
&lt;p&gt;Collège des salariés - 50% des droits de vote&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prénom NOM / RAISON SOCIALE&lt;/th&gt;
&lt;th&gt;Nombre de parts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Brunélie LAURET&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Camille DANIEL&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loan ROBERT&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stéphane BLONDON&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Éloi RIVARD&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Collège des investisseurs - 16,66% des droits de vote&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prénom NOM / RAISON SOCIALE&lt;/th&gt;
&lt;th&gt;Nombre de parts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GRUYERE&lt;/td&gt;
&lt;td&gt;50 000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Collège des bénéficiaires - 16,66% des droits de vote&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prénom NOM / RAISON SOCIALE&lt;/th&gt;
&lt;th&gt;Nombre de parts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FINACOOP NOUVELLE-AQUITAINE&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Collège des observateurs - 16,66% des droits de vote&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prénom NOM / RAISON SOCIALE&lt;/th&gt;
&lt;th&gt;Nombre de parts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arthur LEDARD&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colin GARRIGA-SALAÜN&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Favoriser une organisation horizontale&lt;/h3&gt;
&lt;h4&gt;Présidence de Brunélie (actée à l'AG précédente)&lt;/h4&gt;
&lt;p&gt;Suite à la décision prise à l'Assemblée Générale Ordinaire de clôture de l'exercice 2022, Brunélie LAURET assure dorénavant la présidence officielle de Yaal Coop depuis le 9 mai 2023.&lt;/p&gt;
&lt;h4&gt;Évolutions dans notre gouvernance&lt;/h4&gt;
&lt;p&gt;Notre organisation et en particulier notre gouvernance, dirigée par les coopérateur⋅ices salarié·es et inspirée de l'holacratie, évolue au fil du temps. Celle-ci est revue et éventuellement modifiée lors de nos réunion de gouvernance qui ont lieu trimestriellement.&lt;/p&gt;
&lt;p&gt;En 2023, les rôles de communication et de commerce ont été rassemblés en un seul, assumé par l'ensemble des salarié·es. Les rôles individuels pré-existants, dont les redevabilités étaient d'avoir et de veiller au respect d'une stratégie de communication pour l'un, et d'une stratégie commerciale pour l'autre, ont été supprimés sur le constat que ces rôles n'étaient pas réellement incarnés. Les redevabilités ont été affinées et comprennent notamment accueillir et répondre aux prospects, surveiller les opportunités et offres d'emploi/missions sur différentes sources, etc.&lt;/p&gt;
&lt;p&gt;Un rôle a été créé pour assurer la représentation de la coopérative au sein du collectif CHATONS (Collectif des Hébergeurs Alternatifs, Transparents, Ouverts, Neutres et Solidaires) auquel nous appartenons, tout comme un autre existait déjà pour représenter Yaal Coop au sein du réseau Libre-Entreprise.&lt;/p&gt;
&lt;p&gt;Le rôle "Grand⋅e coopérateur⋅ice" s'assurant du bon déroulement des Assemblées Générales, de l'actualisation du registre des sociétaires, de l'intégration des associé⋅es a été mis à jour pour le fusionner avec le rôle de Président⋅e, avec la responsabilité de s'assurer que les formalités administratives soient traitées. Sa durée a été allongée à 2 ans.&lt;/p&gt;
&lt;p&gt;Les rôles tournants définis actuellement sont les suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💌 Facteur·rice (qui relève le courrier entrant de nos différents boîtes mail et postale communes) - 2 semaines&lt;/li&gt;
&lt;li&gt;📟 Sentinelle (qui surveille les alertes levées par notre système de monitoring technique) - 2 semaines&lt;/li&gt;
&lt;li&gt;✒️ Secrétaire (qui programme et prend des notes de nos réunions régulières) - 3 mois&lt;/li&gt;
&lt;li&gt;🗨️ Facilitateur·rice (qui anime nos réunions régulières) - 3 mois&lt;/li&gt;
&lt;li&gt;🏦 Billetterie (qui fait la paie) - 3 mois&lt;/li&gt;
&lt;li&gt;🍲 Ticket-Restaurateur·rice (qui gère la distribution des tickets restaurants) - 3 mois&lt;/li&gt;
&lt;li&gt;📜 Marteau de la Justice (qui s'assure Yaal Coop respecte ses obligations légales) - 6 mois&lt;/li&gt;
&lt;li&gt;🕊️ Libre Entrepriseur·euse (qui représente Yaal Coop au sein du réseau Libre-entreprise) - 6 mois&lt;/li&gt;
&lt;li&gt;😽 Chaton·ne (qui représente Yaal Coop au sein du collectif CHATONS) - 1 an&lt;/li&gt;
&lt;li&gt;🪙 Argentier·e (qui suit et budgétise la trésorerie) - 1 an suivi de 1 an en backup&lt;/li&gt;
&lt;li&gt;🎊 Grand·e Coopérateur·rice (qui porte le mandat de Président·e, organise les Assemblées Générales et le sociétariat et s'assure que les formalités administratives sont traitées) - 2 ans&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ils sont complétés par 4 rôles permanents occupés par tous les salariés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🚀 Responsable projet/prospect (qui est le référent d'un projet et le contact privilégié de ses éventuels clients)&lt;/li&gt;
&lt;li&gt;🛠️ Producteur·rice (qui produit du travail de qualité et se forme sur son métier)&lt;/li&gt;
&lt;li&gt;🎯 Chasseur·euse cueilleur·euse (qui s'occupe de la communication et du commerce)&lt;/li&gt;
&lt;li&gt;👤 Salarié·e (qui remplit ses obligations de salariés)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tous ces rôles ont une liste de redevabilités associées qui évolue également en fonction des besoins et des constats/manques éventuels observés.&lt;/p&gt;
&lt;p&gt;Nos réunions hebdomadaires de suivi de l'activité et les réunions trimestrielles de stratégie sur l'investissement réunissant les salarié·es sont toujours en place.&lt;/p&gt;
&lt;h3&gt;Favoriser l'activité et les acteurs ayant un impact social ou environnemental, de préférence locaux&lt;/h3&gt;
&lt;h4&gt;Répartition du temps d'occupation&lt;/h4&gt;
&lt;p&gt;En 2023, le temps d'occupation de Yaal Coop a été réparti comme suit :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Activité&lt;/th&gt;
&lt;th&gt;Temps (pourcentage)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prestation client&lt;/td&gt;
&lt;td&gt;42%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gestion de Yaal Coop&lt;/td&gt;
&lt;td&gt;33%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gestion de la SCI&lt;/td&gt;
&lt;td&gt;13%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Investissement technique (Lum1)&lt;/td&gt;
&lt;td&gt;6,6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Investissement interne (Nubla, Canaille)&lt;/td&gt;
&lt;td&gt;3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bénévolat&lt;/td&gt;
&lt;td&gt;1,6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Investissement subventionné (NLNet)&lt;/td&gt;
&lt;td&gt;0,6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img alt="Répartition du temps au cours de l'année 2023" src="/media/blog/articles/Temps2023.png"&gt;&lt;/p&gt;
&lt;p&gt;Au cours de nos réunions d'équipe trimestrielles de stratégie sur l'investissement, nous nous fixons des objectifs de répartition de notre temps de travail. Nos objectifs actuels sont les suivants :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gestion de la SCI&lt;/th&gt;
&lt;th&gt;Gestion de Yaal Coop&lt;/th&gt;
&lt;th&gt;Investissement&lt;/th&gt;
&lt;th&gt;Prestation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;15% ponctuellement (puis 10%)&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La répartition du travail actuelle, et sur l'ensemble de l'année 2023, a pesé en faveur des prestations et moins des projets d'investissement internes (Nubla et Canaille notamment) ou technique (qui s'est ralenti puis arrêté pour le moment avec la fin du projet Lum1).&lt;/p&gt;
&lt;h4&gt;Économie Sociale et Solidaire (ESS)&lt;/h4&gt;
&lt;p&gt;Nos projets et fournisseurs ayant peu changé en 2023, le constat est le même qu'en 2022 : nous continuons de favoriser les acteurs de l'économie sociale et solidaire en plus des missions de service public, et en particulier les coopératives.&lt;/p&gt;
&lt;p&gt;Nous n'avons pas souscrit de nouvelles parts de capital social mais nous possédons toujours celles de notre banque Crédit Coopératif (10 parts pour un montant de 152,50€), notre cabinet comptable Finacoop (1 part de 100€), notre cabinet de paie Assistea (1 part de 100€), et notre fournisseur téléphonique mobile et client Telecoop (1 part de 100€).&lt;/p&gt;
&lt;h4&gt;Impact environnemental&lt;/h4&gt;
&lt;p&gt;Les nouveaux locaux que Yaal Coop occupent ont été entièrement rénovés avant notre emménagement, avec une attention forte à l'impact environnemental : étude environnementale préalable aux travaux, optimisation de l’existant et réemploi (de l'isolant notamment), mise en place d'une pompe à chaleur pour le chauffage, installation d'ouvertures contrôlables et de ventilateurs au plafond pour éviter la climatisation...&lt;/p&gt;
&lt;p&gt;Conformément à nos convictions, et comme les années précédentes, Yaal Coop a versé à l'ensemble de l'équipe salariée le forfait mobilité durable à hauteur de 700€ par an, pour maintenir et encourager l'utilisation de mobilités douces (le vélo principalement) dans les déplacements du domicile au lieu de travail.&lt;/p&gt;
&lt;p&gt;Pour limiter son empreinte écologique, Yaal Coop a de nouveau privilégié l'achat d'un téléphone portable reconditionné plutôt que neuf et l'amélioration du matériel existant plutôt que son remplacement (via l'achat de RAM par exemple ou le remplacement d'un module de refroidissement).&lt;/p&gt;
&lt;p&gt;Enfin la question du numérique soutenable est toujours une question d'intérêt pour la coopérative. Nous continuons de choisir soigneusement les projets sur lesquels nous travaillons pour éviter de contribuer à l'impact du numérique sur des projets que nous jugeons peu utiles voire contre-productifs.&lt;/p&gt;
&lt;p&gt;De façon plus anecdotique, sur les logiciels que nous développons (tels que canaille), nous utilisons les outils d’audit à notre disposition pour travailler sur la légèreté des pages générées. Nous essayons notamment de suivre quelques référentiels de bonnes pratiques de conception et de développement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gr491.isit-europe.org/"&gt;Le GR491&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/"&gt;Le Référentiel général d’écoconception de services numériques (RGESN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cnumr/best-practices/"&gt;Les fiches de bonnes pratiques GreenIT&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Afin de réduire les transferts réseau, nous prenons soin de réduire les tailles de nos images, de n’afficher que le contenu nécessaire sur des pages volontairement simples, de réduire la taille du code source que nous transférons. Nous visons des scores d’au moins 90 % ou B sur les outils que nous utilisons pour mesurer la performance de nos pages (tels que lighthouse ou ecoindex.fr).&lt;/p&gt;
&lt;h4&gt;Réseaux&lt;/h4&gt;
&lt;p&gt;Cette année, Yaal Coop maintient sa participation au sein du Collectif CHATONS, avec la solution d'hébergement, de messagerie et d'e-mail Nubla. La coopérative participe à quelques réunions mensuelles du collectif au cours de l'année, s'exprime et vote lors des prises de décision qui animent le collectif, comme la révision de la charte ayant eu lieu en 2023.&lt;/p&gt;
&lt;p&gt;Yaal Coop maintient également sa participation dans le réseau Libre Entreprise, avec le partage de comptes-rendu mensuels résumant les projets de la coopérative, sa vie et son activité, avec la participation aux réunions mensuelles du réseau et avec l'engagement de certain⋅es coopérateur⋅ices sur des chantiers en cours dans le réseau.&lt;/p&gt;
&lt;p&gt;Yaal Coop est toujours adhérente du pôle de compétences régional en logiciels et technologies libres et open source NAOS.&lt;/p&gt;
&lt;h3&gt;Favoriser l'utilisation et le développement de logiciels libres&lt;/h3&gt;
&lt;h4&gt;Projets et missions&lt;/h4&gt;
&lt;p&gt;Même s'il ne s'agit pas d'une condition exclusive, la majeure partie de nos projets en 2023 a été réalisée sur du code libre, qu'il s'agisse de nos projets internes (Canaille, Nubla) ou de nos prestations (Portail RSE, PodEduc, B3Desk).&lt;/p&gt;
&lt;h4&gt;Contributions de l'année à des logiciels libres&lt;/h4&gt;
&lt;p&gt;Les contributions sont résumées chaque saison dans des articles de blog visibles sur notre site web https://yaal.coop/blog/. Elles sont, soit limitées à quelques modifications ciblées sur des logiciels utilisés, soit des contributions au long cours sur quelques bibliothèques et outils spécifiques (en particulier autour de l'écosystème de Canaille).&lt;/p&gt;
&lt;h4&gt;Participations&lt;/h4&gt;
&lt;p&gt;En plus de nos contributions en développement et/ou design, nous avons décidé de contribuer financièrement à 2 projets libres sur Github que nous utilisons, à hauteur de 20$/mois.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Vie économique de la coopérative&lt;/h2&gt;
&lt;h3&gt;Augmentation salariale&lt;/h3&gt;
&lt;p&gt;Fin 2023, compte tenu du bilan positif de la coopérative, l'ensemble des associé⋅es salarié⋅es ont décidé d'une augmentation des salaires, qui avait été repoussée l'année dernière par prudence. Une prime de partage de la valeur a également été versée pour compenser les salaires plus faibles de 2023.&lt;/p&gt;
&lt;h3&gt;Bilan financier et compte de résultat 2023&lt;/h3&gt;
&lt;p&gt;L'Excédent Brut d'Exploitation est positif et en hausse par rapport à l'exercice précédent. Il en va de même pour le Résultat d'exploitation (hors charges et produits financiers) : 60.538€.  Le résultat comptable est cependant négatif (-87.988€) à cause de la dépréciation d'actif lié à la fermeture de Lum1.&lt;/p&gt;
&lt;p&gt;Le Produit Constaté d'Avance (règlements perçus d'avance et comptabilisés en 2023) est de 35.470€ et devrait être exécuté au premier semestre 2024.&lt;/p&gt;
&lt;p&gt;Le détail du bilan est disponible dans les comptes annuels 2023 rédigés par notre cabinet d'expertise comptable Finacoop.&lt;/p&gt;
&lt;p&gt;Conformément à la dernière décision d'Assemblé Générale, l'intégralité des pertes 2023 est déduite des réserves impartageables de la coopérative.&lt;/p&gt;
&lt;p&gt;Aucun dividende n'a été versé depuis le premier exercice comptable de Yaal Coop et la dirigeante ne touche aucune rémunération liée à son statut de dirigeante.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Perspectives&lt;/h2&gt;
&lt;h3&gt;Évolution des projets&lt;/h3&gt;
&lt;p&gt;Les principaux projets de l'équipe se poursuivent en 2024 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Portail RSE : la prestation se poursuit au même rythme qu'en 2023 pour le développement mais Brunélie arrête la mission d'UX au printemps.&lt;/li&gt;
&lt;li&gt;PodEduc : Une nouvelle mission en 2024 est en cours de réalisation afin de fédérer différentes instances du projet entre elles, ainsi qu'avec des instances de peertube.&lt;/li&gt;
&lt;li&gt;B3Desk : l'activité se poursuit sur la première partie de 2024. Le client est satisfait et cherche des financements pour continuer à travailler avec nous pour la seconde partie de 2024.&lt;/li&gt;
&lt;li&gt;Telecoop : l'activité s'est poursuivie début 2024 et la pérennisation de notre intervention régulière avec un contrat cadre est en cours de discussion.&lt;/li&gt;
&lt;li&gt;Canaille : une nouvelle demande de financement de 30k€ auprès de NLnet a été acceptée le 19 février 2024 pour du développement à venir !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les projections sur les mois à venir continuent ainsi dans le sens de 2023, avec une part importante de notre temps consacré à la prestation et remettant à plus tard dans 2024 l'investissement. Notre souhait à plus long terme reste pour autant de réussir à réunir les conditions pour réaliser plus d'investissement.&lt;/p&gt;
&lt;h3&gt;Changements dans l’équipe&lt;/h3&gt;
&lt;p&gt;Éloi nous quittera au mois de juin 2024 pour poursuivre des projets personnels. Mais on a espoir de se retrouver plus tard ! Il n'est d'ailleurs pas prévu qu'il quitte le sociétariat, mais qu'il bascule de collège.&lt;/p&gt;
&lt;p&gt;Comme un changement ne vient jamais seul, nous projetons en contrepartie de compléter l'équipe salariée de Yaal Coop au travers le recrutement d'un⋅e développeur⋅euse. Le nombre de projets de développement en cours, la nécessité de maintenir au moins la même taille d'équipe, et même de l'agrandir sur le long terme ainsi que la volonté de pouvoir accepter de nouveaux projets motivent ce choix. Nous venons ainsi de lancer cette phase de recrutement début avril.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Nous espérons que les résolutions qui vous sont proposées recevront votre agrément et que vous voudrez bien donner à la Présidente quitus de sa gestion pour l’exercice écoulé.&lt;/p&gt;
&lt;p&gt;Rédigé collectivement par l'équipe de Yaal Coop,
Signé par Brunélie Lauret, Présidente de Yaal Coop&lt;/p&gt;</content><category term="Vie coopérative"/><category term="coop"/><category term="vie coopérative"/></entry><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant l'hiver 2024</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-hiver-2024" rel="alternate"/><published>2024-03-21T00:00:00+01:00</published><updated>2024-03-21T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-03-21:/blog/dernieres-contributions-logiciels-libres-hiver-2024</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant l'hiver 2024.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Mécénat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; pour son travail sur &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, un chouette framework CSS que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; pour son travail sur &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, une bibliothèque python d'authentification que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/sblondon/mozsearch-pypi"&gt;PyPI search&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Greffon Firefox pour chercher des bibliothèques Python hébergées par PyPI (pypi.org)&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remplacement des occurences de « Pypi » par « PyPI »&lt;/li&gt;
&lt;li&gt;Publication d'une nouvelle version (1.0.1)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/sharkdp/bat"&gt;Bat&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Un clone de cat(1) avec coloration syntaxique et intégration Git&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sharkdp/bat/pull/2838"&gt;Affiche quel est le thème par défaut&lt;/a&gt; lors de l'utilisation du paramètre &lt;code&gt;--list-themes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ajout d'une capture d'écran sur &lt;a href="https://screenshots.debian.net/package/bat"&gt;screenshots.debian.net&lt;/a&gt; illustrant l'utilisation du paramètre &lt;code&gt;--list-themes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/jhunt/hatop"&gt;HATop&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Un client ncurses interactif pour HAProxy&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jhunt/hatop/pull/17"&gt;Correction d'une alerte sur la syntaxe&lt;/a&gt; survenant avec Python 3.12, basé sur un &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1061802"&gt;rapport de bogue Debian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://virt-manager.org/"&gt;Virt-Manager&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Client lourd pour gérer des machines virtuelles&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Correction et ajouts de traduction en français sur &lt;a href="https://translate.fedoraproject.org/projects/virt-manager/virt-manager/"&gt;https://translate.fedoraproject.org/projects/virt-manager/virt-manager/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion de formulaires web&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/823"&gt;Correctif sur la coercition de SelectField&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/824"&gt;Correctif pour la compatibilité avec Babel 2.14&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/830"&gt;Conciergerie&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion des identités et des accès&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/614"&gt;Améliorations sur la documentation de RFC7523&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur OpenID Connect simpliste, basé sur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/164"&gt;Implémentation de la souscription d’utilisateurs par OIDC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/165"&gt;Configuration de la journalisation au format de Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/166"&gt;Mise à jour vers HTMX 1.9.11&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://matrix.org"&gt;Matrix&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Une nouvelle base de communication ouverte, intéropérable, décentralisée et en temps réel&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/matrix-org/matrix-spec-proposals/pull/4098"&gt;Proposition de MSC4098 pour le support de SCIM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Winter 2024 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-hiver-2024" rel="alternate"/><published>2024-03-21T00:00:00+01:00</published><updated>2024-03-21T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2024-03-21:/blog/en/dernieres-contributions-logiciels-libres-hiver-2024</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during winter 2024.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Sponsoring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; for his work on &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, a nice CSS framework we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI is used on other tools we rely on, like &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; for his work on &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, a python authentication library we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/sblondon/mozsearch-pypi"&gt;PyPI search&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Firefox plug-in to search Python libraries hosted at PyPI (pypi.org)&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replace Pypi occurrences by PyPI one&lt;/li&gt;
&lt;li&gt;Release a new version (1.0.1)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/sharkdp/bat"&gt;Bat&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A cat(1) clone with syntax highlighting and Git integration&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sharkdp/bat/pull/2838"&gt;Display which theme is the default one&lt;/a&gt; with &lt;code&gt;--list-themes&lt;/code&gt; parameter&lt;/li&gt;
&lt;li&gt;Add a screenshot about the &lt;code&gt;--list-themes&lt;/code&gt; parameter usage on &lt;a href="https://screenshots.debian.net/package/bat"&gt;screenshots.debian.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/jhunt/hatop"&gt;HATop&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;An Interactive ncurses Client for HAProxy&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jhunt/hatop/pull/17"&gt;Fix syntax warning&lt;/a&gt; occurring with Python 3.12, based on a &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1061802"&gt;Debian bug report&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://virt-manager.org/"&gt;Virt-Manager&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Desktop user interface for managing virtual machines&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix and add french translations on &lt;a href="https://translate.fedoraproject.org/projects/virt-manager/virt-manager/"&gt;https://translate.fedoraproject.org/projects/virt-manager/virt-manager/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A flexible forms validation and rendering library for Python.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/823"&gt;SelectField coercion fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/824"&gt;Babel 2.14 compatibility fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/830"&gt;Janitoring&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Identity and Access management library for python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/614"&gt;RFC7523 documentation improvements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Lightweight identity and authorization management software&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/164"&gt;OIDC User registration implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/165"&gt;Python logging configuration format support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/166"&gt;HTMX 1.9.11 upgrade&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://matrix.org"&gt;Matrix&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A new basis for open, interoperable, decentralised real-time communication&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/matrix-org/matrix-spec-proposals/pull/4098"&gt;MSC4098 proposal for SCIM support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant l'automne 2023</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-automne-2023" rel="alternate"/><published>2023-12-21T00:00:00+01:00</published><updated>2023-12-21T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2023-12-21:/blog/dernieres-contributions-logiciels-libres-automne-2023</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant l'automne 2023.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Mécénat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; pour son travail sur &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, un chouette framework CSS que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; pour son travail sur &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, une bibliothèque python d'authentification que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur OpenID Connect simpliste, basé sur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/153"&gt;Correction d'un bug sur la suppression d'utilisateurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/154"&gt;Mise à jour vers htmx 1.9.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/155"&gt;Support de Python 3.12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/156"&gt;Cardinalité des modèles basée sur la norme SCIM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/157"&gt;Méthodes additionnelles d’identification pour les jetons de rafraîchissement OIDC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/158"&gt;Support des bases de données SQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/159"&gt;Mise à jour vers htmx 1.9.9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/160"&gt;Désactivation de htmx lors de l’authentification OIDC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/161"&gt;Gestion des pages d’erreur avec htmx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/162"&gt;Conversion des images en webp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/163"&gt;Mise à jour vers Flask 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion de formulaires web&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/739"&gt;Réusinage de &lt;code&gt;SelectField&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/797"&gt;Implementation de validateurs &lt;code&gt;readonly&lt;/code&gt; et &lt;code&gt;disabled&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/798"&gt;Migration de setuptools à hatch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/808"&gt;Affichage des valeurs dans la représentation de Flags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/812"&gt;Corrections sur des exemples en documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/812"&gt;Réusinage de tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/818"&gt;Support de python 3.12&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/flask-wtf"&gt;flask-wtf&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Intégration de WTForms dans Flask&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/573"&gt;Correction de la protection CSRF sur les blueprints imbriqués&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/576"&gt;Migration de setuptools à hatch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/releases/tag/v1.1.2"&gt;Publication de la version 1.1.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/releases/tag/v1.2.0"&gt;Publication de la version 1.2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/578"&gt;Corrections d'un bug sur les validateurs de champs de fichiers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/releases/tag/v1.2.1"&gt;Publication de la version 1.2.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://anymail.dev/"&gt;django-anymail&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Anymail: Intégration de fournisseurs d'e-mails transactionnels dans Django&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/anymail/django-anymail/pull/321"&gt;Mise-à-jour du fournisseur Brevo.com provider (précédemment Sendinblue)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/spiral-project/ihatemoney"&gt;ihatemoney&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Une application web simple de gestion de budget&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1243"&gt;Migration de &lt;code&gt;setup.cfg&lt;/code&gt; à &lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1248"&gt;Support de WTForms 3.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1255"&gt;Support de Python 3.12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1258"&gt;Migration de setuptools vers hatch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion des identités et des accès&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/590"&gt;Support de python 3.12&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/level12/flask-webtest"&gt;flask-webtest&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Utilitaires de test d'applications Flask avec WebTest&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/level12/flask-webtest/pull/21/"&gt;Améliorations sur la documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Autumn 2023 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-automne-2023" rel="alternate"/><published>2023-12-21T00:00:00+01:00</published><updated>2023-12-21T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2023-12-21:/blog/en/dernieres-contributions-logiciels-libres-automne-2023</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during autumn 2023.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Sponsoring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; for his work on &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, a nice CSS framework we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI is used on other tools we rely on, like &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; for his work on &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, a python authentication library we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simplistic OpenID Connect provider over OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/153"&gt;Fix user deletion bug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/154"&gt;Bump to htmx 1.9.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/155"&gt;Python 3.12 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/156"&gt;Model cardinality based on SCIM specifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/157"&gt;Additional refresh token grant authentication methods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/158"&gt;SQL backend implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/159"&gt;Bump to htmx 1.9.9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/160"&gt;Disable htmx during OIDC authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/161"&gt;Handle error pages with htmx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/162"&gt;Convert images in webp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/163"&gt;Update to Flask 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A flexible forms validation and rendering library for Python.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/739"&gt;&lt;code&gt;SelectField&lt;/code&gt; refactoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/797"&gt;Implementation of &lt;code&gt;readonly&lt;/code&gt; and &lt;code&gt;disabled&lt;/code&gt; validators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/798"&gt;Migrate from setuptools to hatch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/808"&gt;Display values in Flag repr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/812"&gt;Fix documentation examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/812"&gt;Unit test refactoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/818"&gt;Python 3.12 support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/flask-wtf"&gt;flask-wtf&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/573"&gt;Fix CSRF protection on nested blueprints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/576"&gt;Migrate from setuptools to hatch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/releases/tag/v1.1.2"&gt;Release 1.1.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/releases/tag/v1.2.0"&gt;Release 1.2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/578"&gt;Fix a file validator bug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/releases/tag/v1.2.1"&gt;Release 1.2.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://anymail.dev/"&gt;django-anymail&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Anymail: Django email integration for transactional ESPs&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/anymail/django-anymail/pull/321"&gt;Update brevo.com provider (formerly Sendinblue)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/spiral-project/ihatemoney"&gt;ihatemoney&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A simple shared budget manager web application&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1243"&gt;&lt;code&gt;setup.cfg&lt;/code&gt; to &lt;code&gt;pyproject.toml&lt;/code&gt; migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1248"&gt;WTForms 3.1 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1255"&gt;Python 3.12 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1258"&gt;Setuptools to hatch migration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Identity and Access management library for python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/590"&gt;Python 3.12 support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/level12/flask-webtest"&gt;flask-webtest&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Utilities for testing Flask applications with WebTest*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/level12/flask-webtest/pull/21/"&gt;Documentation improvements&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Canaille, un système léger de gestion d’identité et d’accès</title><link href="https://yaal.coop/blog/canaille-nlnet-pytest-iam" rel="alternate"/><published>2023-11-29T00:00:00+01:00</published><updated>2023-11-29T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2023-11-29:/blog/canaille-nlnet-pytest-iam</id><summary type="html">&lt;p&gt;Grâce au soutien de la fondation NLNet, Yaal Coop a pu financer d’importants développements dans Canaille, un logiciel léger de gestion d’identité et d’accès.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Depuis un certain temps l’équipe de Yaal Coop travaille sur Canaille, un logiciel de gestion d’identité et d’accès.
Nous profitons de la fin de travaux financés par la fondation NLNet pour vous raconter l’histoire autour de Canaille.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://canaille.yaal.coop"&gt;&lt;img alt="Canaille" src="/media/img/canaille.webp"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Au début étaient les annuaires&lt;/h2&gt;
&lt;p&gt;À Yaal Coop (comme presque partout ailleurs) nous utilisons une palette d’outils qui nous permettent de travailler ensemble.
Emails, fichiers, carnets de contacts, gestion de projet, suivi du temps, comptabilité, intégration continue, collecte de rapports de bugs… la liste est longue.
Pour des raisons de praticité (et de sécurité) on cherche généralement à connecter une telle collection d’outils à un logiciel central qui se charge de la gestion des utilisateur·ices et de leurs accès.
Traditionnellement, c’est LDAP&lt;sup id="sf-canaille-nlnet-pytest-iam-1-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-1" class="simple-footnote" title="enfin, un logiciel qui implémente LDAP, ici je parle indifféremment du protocole ou de ses implémentations"&gt;1&lt;/a&gt;&lt;/sup&gt; qui est utilisé pour cet usage, on parle alors d’annuaire.&lt;/p&gt;
&lt;p&gt;Si un outil est connecté à un annuaire, vous n’avez pas besoin de vous y créer un compte, vous pouvez vous connecter en utilisant votre mot de passe habituel, celui que vous avez renseigné dans l’annuaire.
C’est pratique pour vous puisque vous n’avez qu’un unique mot de passe à retenir &lt;em&gt;(ou à oublier)&lt;/em&gt;, on parle généralement d’inscription unique &lt;em&gt;ou Single Sign On (&lt;abbr&gt;SSO&lt;/abbr&gt;)&lt;/em&gt;.
C’est aussi pratique pour les personnes qui gèrent les comptes dans votre organisation, puisqu’elles peuvent créer et révoquer des comptes utilisateur·ices une seule fois pour tous les outils à la fois.&lt;/p&gt;
&lt;p&gt;LDAP, c’est vieux et c’est robuste. Pour des logiciels, ce sont des qualités.
Les quelques décennies d’expérience de LDAP en font une technologie éprouvée et compatible avec un énorme choix de logiciels.&lt;/p&gt;
&lt;p&gt;Mais LDAP, c’est aussi compliqué et austère.
C’est une base de donnée &lt;em&gt;en arbre&lt;/em&gt; qui ressemble à peu d’autres choses, la documentation est éparse et absconse, les conventions sont curieuses, pleines d’acronymes angoissants, l’outillage est rare…
Et puis c’est conçu pour les données qui sont lues souvent mais écrites rarement.
Les modèles de données utilisables dans LDAP sont eux aussi peu évolutifs.
Généralement quelques uns sont fournis d’office et permettent de manipuler des attributs de base sur des utilisateur·ices et des groupes.
Et si on veut que son système puisse gérer d’autres attributs comme les couleurs préférées, alors il faut écrire ses propres modèles de données, et on a intérêt à être sûr de soi puisqu’aucun mécanisme de mise à jour des schémas ou de migration des données n’est prévu&lt;sup id="sf-canaille-nlnet-pytest-iam-2-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-2" class="simple-footnote" title="du moins avec OpenLDAP"&gt;2&lt;/a&gt;&lt;/sup&gt;.
Si on souhaite ensuite partager ces modèles de données, alors il est conseillé de s’enregistrer à l’&lt;a href="https://iana.org"&gt;IANA&lt;/a&gt;&lt;sup id="sf-canaille-nlnet-pytest-iam-3-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-3" class="simple-footnote" title="ce que nous avons fait, notre numéro à l’IANA est le 56207"&gt;3&lt;/a&gt;&lt;/sup&gt;, et de fournir une référence en ligne de ses schémas.
Quand on se plonge dans l’univers de LDAP, on a l’impression qu’une fois mises en place, les installations ne bougent pas pendant des années ;
et donc les personnes qui ont la connaissance fuient l’austérité de cette technologie sans avoir à s’y ré-intéresser (puisque &lt;em&gt;ça fonctionne&lt;/em&gt;), et sans trop documenter leurs aventures.
J’exagère à peine, si on compare&lt;sup id="sf-canaille-nlnet-pytest-iam-4-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-4" class="simple-footnote" title="d’accord, la comparaison est fallacieuse puisque ces différentes bases de données ne répondent pas aux mêmes besoins, mais l’ordre de grandeur est révélateur de l’intérêt autour de ces technologies"&gt;4&lt;/a&gt;&lt;/sup&gt; le nombre de questions sur &lt;a href="https://stackoverflow.com"&gt;stackoverflow&lt;/a&gt;, pour &lt;a href="https://stackoverflow.com/questions/tagged/ldap"&gt;ldap&lt;/a&gt; on en dénombre environ 1000 tandis que &lt;a href="https://stackoverflow.com/questions/tagged/postgresql"&gt;postgresql&lt;/a&gt; ou &lt;a href="https://stackoverflow.com/questions/tagged/mongodb"&gt;mongodb&lt;/a&gt; en comptent environ 14 000 et &lt;a href="https://stackoverflow.com/questions/tagged/mysql"&gt;mysql&lt;/a&gt; 45 000.&lt;/p&gt;
&lt;h2&gt;Puis vint l’authentification unique&lt;/h2&gt;
&lt;p&gt;Lors de temps de bénévolat à &lt;a href="https://supercoop.fr"&gt;Supercoop&lt;/a&gt;&lt;sup id="sf-canaille-nlnet-pytest-iam-5-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-5" class="simple-footnote" title="le supermarché coopératif de l’agglomération bordelaise"&gt;5&lt;/a&gt;&lt;/sup&gt;, nous avons notamment travaillé à installer, comme pour chez nous, plusieurs outils numériques de collaboration.
Évidemment tous les outils étaient branchés sur un annuaire LDAP.
Nous nous sommes rendus compte que l’équipe dite de &lt;em&gt;gestion des membres&lt;/em&gt;, passait un certain temps à traiter des demandes de réinitialisation de mot de passe, à aider des personnes qui échouaient à utiliser les outils dès les premières étapes de connexion.
Ce constat nous a donc poussé à chercher des outils (libres, évidemment) d’authentification unique et de gestion d’utilisateur·ices, en complément ou remplacement de l’annuaire.
Ce que l’authentification unique &lt;em&gt;ou Single Login Identification (&lt;abbr&gt;SLI&lt;/abbr&gt;)&lt;/em&gt; apporte au SSO fourni par LDAP, c’est que les utilisateur·ices peuvent naviguer entre les outils sans avoir à s’identifier à nouveau.
On peut passer de l’interface mail à son calendrier en ligne sans repasser par l’écran d’identification, tandis qu’avec un simple annuaire, il aurait été nécessaire d’entrer son mot de passe une fois pour chaque outil.
Pour un public non technophile, c’est l’opportunité de se passer de quelques écrans techniques, et limiter les sources d’erreur et de frustration.&lt;/p&gt;
&lt;p&gt;Actuellement les protocoles de prédilection pour faire du SLI sont OAuth2 et OpenID Connect (&lt;abbr&gt;OIDC&lt;/abbr&gt;)&lt;sup id="sf-canaille-nlnet-pytest-iam-6-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-6" class="simple-footnote" title="par abus de langage, je dirai simplement OIDC"&gt;6&lt;/a&gt;&lt;/sup&gt;. On note qu’il existe d’autres standards, plus historiques ou bien plus orientés vers les grosses organisations, tels &lt;a href="https://fr.wikipedia.org/wiki/Security_assertion_markup_language"&gt;SAML&lt;/a&gt; ou &lt;a href="https://fr.wikipedia.org/wiki/Central_Authentication_Service"&gt;CAS&lt;/a&gt;.
Les normes OAuth2 et OIDC sont modernes mais bénéficient d’une dizaine d’années de retours d’expérience.
Les outils et les documentations sont nombreuses, la communauté est active, et les standards évoluent en ce moment même grâce au &lt;a href="https://datatracker.ietf.org/wg/oauth/about/"&gt;groupe de travail &lt;em&gt;oauth&lt;/em&gt;&lt;/a&gt; de l’&lt;abbr&gt;IETF&lt;/abbr&gt;&lt;sup id="sf-canaille-nlnet-pytest-iam-7-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-7" class="simple-footnote" title="l’« Internet Engineering Task Force » un organsime étasunien de développement et de promulgation de standards"&gt;7&lt;/a&gt;&lt;/sup&gt;.
Mais là encore tout n’est pas rose et OIDC vient avec son lot de difficultés.&lt;/p&gt;
&lt;p&gt;Tout d’abord, OAuth2 et OIDC c’est environ &lt;a href="https://canaille.readthedocs.io/en/latest/specifications.html#state-of-the-specs-in-Canaille"&gt;30 standards complémentaires&lt;/a&gt;, dont certains contredisent et apportent des corrections sur des standards antérieurs.
Tous ne sont pas pertinents dans l’usage que nous visons, mais ne serait-ce que simplement &lt;em&gt;comprendre&lt;/em&gt; le fonctionnement de ceux qui nous intéressent demande déjà du temps et de la réflexion.
Les implémentations d’OIDC — par les logiciels de gestions d’utilisateur·ices, ou par les outils qui s’y branchent — sont généralement partielles, et parfois bugguées.
Pour ne rien arranger, les gros acteurs de l’industrie prennent délibérément des libertés avec les standards et forcent le développement de spécificités pour être compatibles avec leurs logiciels.&lt;sup id="sf-canaille-nlnet-pytest-iam-8-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-8" class="simple-footnote" title="Ils peuvent aussi êtres moteurs de nouvelles améliorations, comme RFC7628 ou RFC9068 qui furent des usages avant d’être des standards."&gt;8&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Mais revenons à nos moutons. Pour Supercoop nous souhaitions trouver un outil qui soit d’une grande simplicité à plusieurs points de vue :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pour les utilisateur·ices : les coopérateur·ices du magasin. L’utilisation doit se faire sans aucune connaissance technique préalable, et sans assistance ;&lt;/li&gt;
&lt;li&gt;pour l’équipe de &lt;em&gt;gestion des membres&lt;/em&gt; du magasin. Nous voulions un outil simple à prendre en main.
  Un apprentissage de l’outil est envisageable mais non souhaitable.
  En effet le magasin fonctionnant grâce à la participation de bénévoles, il y a un enjeu à ce que le temps passé soit le moins rébarbatif possible, afin de ne décourager personne.&lt;/li&gt;
&lt;li&gt;enfin pour l’équipe &lt;em&gt;informatique&lt;/em&gt;, il y a là aussi un enjeu de simplicité.
  Si les outils déployés pour le magasin requièrent trop de connaissances, nous aurons des problèmes pour trouver des gens compétents pour nous aider.
  Et la nature de la participation du magasin fait que les coopérateur·ices contribuent ponctuellement, tournent souvent, et n’ont pas nécessairement le temps d’apprendre toute la pile technique mise en œuvre.
  Idéalement, l’équipe informatique devrait pouvoir administrer l’outil que nous recherchons avec une connaissance superficielle des protocoles concernés.
  &lt;em&gt;Et vues les descriptions que j’ai faites de LDAP et OIDC, vous commencez à cerner une partie du problème&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://canaille.readthedocs.io/en/latest/specifications.html#comparison-with-other-providers"&gt;Notre recherche&lt;/a&gt; nous a montré qu’il existait une quinzaine d’outils pouvant répondre aux besoins que nous avons identifiés.
Pour autant, aucun outil ne nous semblait cocher toutes les cases.
En fait, par leur nature, les outils de gestion d’identité et d’autorisations &lt;em&gt;ou Identity and Authorization Management (&lt;abbr&gt;IAM)&lt;/abbr&gt;&lt;/em&gt; sont destinés à de grosses organisations, qui peuvent donc s’offrir les services de personnes qualifiées pour s’en occuper.
Ce sont donc des logiciels lourds mais puissants, supportant beaucoup de protocoles qui ne nous concernent pas, requiérant une certaine technicité pour l’installation, la maintenance ou la gestion.
Motivés par notre curiosité nous avons fini par bricoler quelque chose dans notre coin.&lt;/p&gt;
&lt;h2&gt;Canaille&lt;/h2&gt;
&lt;p&gt;Quelques temps après, notre prototype a grossi et a donné &lt;a href="https://canaille.yaal.coop"&gt;Canaille&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Les fonctionnalités&lt;/h3&gt;
&lt;p&gt;Canaille est un logiciel qui permet de gérer des utilisateur·ices et des groupes d’utilisateur·ices, de créer, modifier et administrer des comptes, de réinitialiser des mots de passes perdus, d’inviter des nouveaux utilisateur·ices.
En plus de ça, Canaille implémente OIDC et fournit donc une authentification unique aux utilisateur·ices vers d’autres outils. Son interface est personnalisable et … c'est tout.
Nous tâchons de garder le périmètre fonctionnel de Canaille assez restreint pour qu'il reste simple.&lt;/p&gt;
&lt;p&gt;Canaille peut être utilisé pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;apporter une interface web épurée de gestion des comptes utilisateur·ices au dessus d’un annuaire LDAP.
  L’outillage autour de LDAP étant comme on l’a dit plutôt épars, Canaille peut être utilisé pour modifier facilement un profil utilisateur·ice ou réinitialiser un mot de passe perdu.&lt;/li&gt;
&lt;li&gt;amener du SLI sur un annuaire LDAP.
  Si vous avez historiquement un annuaire LDAP et que vous voulez moderniser votre pile logicielle avec une couche d’authentification unique, Canaille peut s’intégrer discrètement au-dessus de votre installation existante sans rien modifier,
  et vous laisser le temps de prévoir – ou pas – une migration.&lt;/li&gt;
&lt;li&gt;développer des applications utilisant OIDC.
  Si, comme nous, vous faites du développement logiciel et travaillez régulièrement sur des applications nécessitant une connexion OIDC, alors vous pouvez utiliser Canaille dans votre environnement de développement.
  Canaille étant très léger, c'est désormais pour nous la solution de choix comme IAM pour travailler sur nos applications.&lt;/li&gt;
&lt;li&gt;tester des applications utilisant OIDC.
  Nous utilisons aussi Canaille dans des suites de tests unitaires python, grâce à &lt;a href="https://pytest-iam.readthedocs.io/en/latest/"&gt;pytest-iam&lt;/a&gt;.
  Ce greffon de pytest embarque Canaille, le prépare et l’instancie pour que vos suites de tests puissent effectuer une réelle connexion OIDC.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Les choix techniques&lt;/h3&gt;
&lt;p&gt;Canaille est un logiciel écrit en python, avec &lt;a href="https://flask.palletsprojects.com/en/3.0.x/"&gt;flask&lt;/a&gt; pour le côté serveur et &lt;a href="https://fomantic-ui.com/"&gt;fomantic-ui&lt;/a&gt; et &lt;a href="https://htmx.org"&gt;htmx&lt;/a&gt; pour la partie client utilisateur·ice.
Nous apprécions la simplicité de python et celle de flask et croyons sincèrement que ce sont autant de freins en moins à la participation d’éventuels contributeur·ices.
Nous avons été sidérés par notre découverte récente de HTMX, qui en deux mots nous permet de créer des pages web dynamiques sans plus écrire de Javascript.
Un langage en moins dans un projet c'est autant de complexité en moins.&lt;/p&gt;
&lt;p&gt;Sous le capot, Canaille peut se brancher au choix à un annuaire LDAP ou à une base de données SQL.&lt;/p&gt;
&lt;h3&gt;Les techniques de développement&lt;/h3&gt;
&lt;p&gt;Nous utilisons Canaille en production, à Supercoop donc où il est utilisé pour gérer environ 1800 membres, mais aussi chez nous à Yaal Coop et au sein de notre offre mutualisée de services &lt;a href="https://nubla.fr"&gt;Nubla&lt;/a&gt;, et sur des instances dédiées Nubla Pro.
Cette large base d’utilisateur·ices nous permet de récolter des retours d’expérience, et nous améliorons le logiciel au fur et à mesure des besoins.&lt;/p&gt;
&lt;p&gt;Canaille suit le principe du développement dirigé par les tests, &lt;em&gt;ou Test Driven Development (TDD)&lt;/em&gt;, dans la mesure du possible.
&lt;a href="https://fr.wikipedia.org/wiki/Couverture_de_code"&gt;La couverture du code&lt;/a&gt; est de 100% &lt;em&gt;(branches comprises)&lt;/em&gt;, et c’est un pré-requis pour toute contribution.
En plus d’avoir confiance dans nos tests, cela nous a permis à plusieurs reprises de simplement supprimer du code qui n’était plus utilisé, et simplifier d’autant le projet.
On débusque plus facilement les bugs quand il y a moins de code.&lt;/p&gt;
&lt;p&gt;Canaille utilise tous les analyseurs et formatteurs de code source modernes, au sein de &lt;a href="https://gitlab.com/yaal/Canaille/-/blob/main/.pre-commit-config.yaml"&gt;pre-commit&lt;/a&gt;, et les test unitaires sont joués sur toutes les versions de Python officiellement supportées.&lt;/p&gt;
&lt;p&gt;Enfin la traduction de l’interface de Canaille se fait de manière communautaire sur &lt;a href="https://hosted.weblate.org/engage/Canaille/?utm_source=widget"&gt;weblate&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Contributions&lt;/h3&gt;
&lt;p&gt;Comme la plupart des logiciels modernes, Canaille réutilise des bibliothèques logicielles existantes pour que nous n’ayions pas à ré-inventer ce que d’autres ont déjà fait.&lt;/p&gt;
&lt;p&gt;Lorsque nous rencontrons des erreurs dans ces bibliothèques, nous suivons une stratégie qui consiste à implémenter les corrections à la fois dans Canaille et dans les logiciels.
D’une part nous amenons donc les corrections dans Canaille, de manière temporaire et efficace.
Mais tout ce code que nous écrivons nous-même est un fardeau de maintenance à venir, nous tâchons donc en parallèle de proposer des solutions mieux conçues aux mainteneur·euses desdites bibliothèques, en discutant avec eux en amont.
C'est pour nous la garantie que les briques logicielles sur lesquelles nous nous appuyons sont pérennes, et c’est un moyen de contribuer à cet écosystème nécessaire qu’est celui du logiciel libre.&lt;/p&gt;
&lt;p&gt;Par ailleurs lorsque nous souhaitons des fonctionnalités supplémentaires dans ces bibliothèques, nous expliquons nos motivations aux mainteneur·euses et parfois proposons des implémentations. Nous avons par exemple développé le support des spécifications OIDC &lt;a href="https://github.com/lepture/authlib/pull/505"&gt;RFC7591&lt;/a&gt; et &lt;a href="https://github.com/lepture/authlib/pull/586"&gt;RFC9068&lt;/a&gt; dans &lt;a href="https://github.com/lepture"&gt;authlib&lt;/a&gt;, une brique utilisée pour la partie OIDC de Canaille.&lt;/p&gt;
&lt;p&gt;Le résultat de ces efforts est visible dans &lt;a href="https://yaal.coop/blog/tag/contributions"&gt;nos articles trimestriels&lt;/a&gt; de contributions à des logiciels libres.&lt;/p&gt;
&lt;p&gt;Le hasard des contributions nous a amené à partager la maintenance de certaines des bibliothèques que nous utilisons, comme &lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt; qui permet de gérer les formulaires dans Canaille, ou encore &lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt; et &lt;a href="https://github.com/jumbojett/OpenID-Connect-PHP"&gt;OpenIDConnect-PHP&lt;/a&gt; qui permettent à &lt;a href="https://nextcloud.com"&gt;nextcloud&lt;/a&gt; (le gestionnaire de fichiers proposé par Nubla) de se connecter à Canaille.&lt;/p&gt;
&lt;p&gt;Nous sponsorisons aussi modestement tous les mois les mainteneur·ices de &lt;a href="https://github.com/lubber-de"&gt;fomantic-ui&lt;/a&gt; et &lt;a href="https://github.com/lepture"&gt;authlib&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;L’aide de la fondation NLNet&lt;/h2&gt;
&lt;p&gt;Canaille a été développé pour répondre aux besoins spécifiques que nous avons rencontrés : à l’origine Canaille s’interfaçait donc seulement avec des annuaires LDAP.
L’écosystème évoluant, nous nous sommes aperçus que de plus en plus de logiciels étaient capables de communiquer avec OIDC en plus de LDAP.
In fine, si plus aucun des logiciels que nous utilisons ne dépend directement de LDAP, alors nous pouvons envisager un outil de remplacement avec lequel nous nous sentons plus à l’aise.
Pour aller dans cette direction, nous avons sollicité fin 2022 l’aide de 7 000€ au fond &lt;strong&gt;NGI Zero Entrust&lt;/strong&gt; de la &lt;a href="https://nlnet.nl"&gt;fondation NLNet&lt;/a&gt; pour financer le support de travaux dans Canaille :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/Canaille/-/merge_requests/149"&gt;la généricisation de la connexion aux bases de données&lt;/a&gt;. Ce furent des travaux préparatoires au branchement de bases de données différentes de LDAP ;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/Canaille/-/merge_requests/158"&gt;la connexion à des bases de données SQL&lt;/a&gt;, qui permet à Canaille de s’interfacer avec un bon nombre de systèmes de bases de données répandus ;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pytest-iam.readthedocs.io"&gt;pytest-iam&lt;/a&gt;, un outil qui permet de préparer et lancer une instance de Canaille, afin d'être utilisée dans des suites de tests unitaires avec &lt;a href="http://pytest.org"&gt;pytest&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://nlnet.nl"&gt;&lt;img alt="Canaille" src="/media/img/logo_nlnet.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ces développements ont été achevés fin novembre 2023, et ont été la source de nombreux réusinages, de nombreuses corrections de bogues, et plus généralement d’une meilleure conception et d’une meilleure fiabilité de Canaille.
Nous sommes particulièrement reconnaissant·es à la fondation NLNet de nous avoir permis de travailler sur notre outil, et de nous aider à contribuer à notre échelle à l’écosystème du logiciel libre.&lt;/p&gt;
&lt;h2&gt;Et la suite ?&lt;/h2&gt;
&lt;h3&gt;Passer en version bêta&lt;/h3&gt;
&lt;p&gt;Nous avons depuis le début gardé Canaille en version &lt;em&gt;alpha&lt;/em&gt;, nous sommes à l’heure actuelle à la version &lt;code&gt;0.0.35&lt;/code&gt;.
Nous indiquions que le logiciel était impropre aux environnements de production.
C’était pour nous un moyen de pouvoir expérimenter dans notre coin sans avoir à se soucier de rétrocompatibilité.
Nous souhaitons sévir une dernière fois en &lt;a href="https://gitlab.com/yaal/Canaille/-/issues/138"&gt;remettant à plat la manière de configurer Canaille&lt;/a&gt; avant de passer Canaille en &lt;em&gt;bêta&lt;/em&gt;, et lever les mises en garde d’usage.&lt;/p&gt;
&lt;p&gt;Nous regroupons les tickets pour le passage en version bêta de Canaille dans &lt;a href="https://gitlab.com/yaal/canaille/-/milestones/1"&gt;ce jalon&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Passer en version stable&lt;/h3&gt;
&lt;p&gt;Les travaux que nous immaginons réaliser pour passer d’une version bêta à une version finale sont principalement des efforts de documentation, d’installation et de prise en main de Canaille.
L’objectif est pour nous de rendre Canaille facile d’accès, afin de créer de l’usage et collecter des retours utilisateurs.&lt;/p&gt;
&lt;p&gt;Nous regroupons les tickets pour le passage en version stable de Canaille dans &lt;a href="https://gitlab.com/yaal/canaille/-/milestones/2"&gt;ce jalon&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Et au-delà…&lt;/h3&gt;
&lt;p&gt;Pour l’avenir nous souhaitons travailler sur le &lt;a href="https://fr.wikipedia.org/wiki/Provisionnement"&gt;provisionnement&lt;/a&gt;, en implémentant la norme &lt;a href="https://www.rfc-editor.org/rfc/rfc7642.html"&gt;SCIM&lt;/a&gt;.
Ce travail permettra de découpler l’authentification des utilisateur·ices et la création des comptes utilisateur·ices.
En effet aujourd’hui dans les outils externes que nous avons branchés à Canaille, les comptes des utilisateur·ices sont créés à la première connexion.
Cela peut s’avérer problématique dans certaines situations : par exemple si l’on veut partager des fichiers dans Nextcloud avec un utilisateur·ice qui ne s’est encore jamais connecté.
SCIM permet aussi de supprimer des comptes utilisateur·ices sur ces outils externes, tâche qui doit être réalisée plus ou moins manuellement à l’heure actuelle.&lt;/p&gt;
&lt;p&gt;Parmi les chantiers à venir, nous voyons aussi &lt;a href="https://gitlab.com/yaal/Canaille/-/issues/155"&gt;le travail sur la déconnexion unique&lt;/a&gt;, ou &lt;em&gt;Single Log-Out (&lt;abbr&gt;SLO&lt;/abbr&gt;)&lt;/em&gt;.
C’est un développement qui devra être réalisé en premier lieu dans authlib, et qui permettra aux utilisateur·ices de se déconnecter de tous les outils en une seule action.
C’est une fonctionnalité qui apportera de la sécurité et du confort d’utilisation.&lt;/p&gt;
&lt;p&gt;Enfin, nous aimerions travailler sur une gestion avancée des groupes d’utilisateur·ices et des droits, ainsi que sur des mécanismes d’&lt;a href="https://fr.wikipedia.org/wiki/Double_authentification"&gt;authentification multi-facteurs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si tout cela vous intéresse, vous pouvez tester Canaille immédiatement sur &lt;a href="https://canaille.yaal.coop"&gt;notre interface de demo&lt;/a&gt;. Canaille est évidemment ouvert aux contributions, alors si vous souhaitez nous aider dans tout ça, &lt;a href="https://gitlab.com/yaal/canaille"&gt;la porte est ouverte&lt;/a&gt; !&lt;/p&gt;&lt;ol class="simple-footnotes"&gt;&lt;li id="sf-canaille-nlnet-pytest-iam-1"&gt;enfin, un logiciel qui &lt;em&gt;implémente&lt;/em&gt; LDAP, ici je parle indifféremment du protocole ou de ses implémentations &lt;a href="#sf-canaille-nlnet-pytest-iam-1-back" class="simple-footnote-back"&gt;↩︎&lt;/a&gt;&lt;/li&gt;&lt;li id="sf-canaille-nlnet-pytest-iam-2"&gt;du moins avec OpenLDAP &lt;a href="#sf-canaille-nlnet-pytest-iam-2-back" class="simple-footnote-back"&gt;↩︎&lt;/a&gt;&lt;/li&gt;&lt;li id="sf-canaille-nlnet-pytest-iam-3"&gt;ce que nous avons fait, notre numéro à l’IANA est le &lt;a href="https://www.iana.org/assignments/enterprise-numbers/?q=yaal"&gt;56207&lt;/a&gt; &lt;a href="#sf-canaille-nlnet-pytest-iam-3-back" class="simple-footnote-back"&gt;↩︎&lt;/a&gt;&lt;/li&gt;&lt;li id="sf-canaille-nlnet-pytest-iam-4"&gt;d’accord, la comparaison est fallacieuse puisque ces différentes bases de données ne répondent pas aux mêmes besoins, mais l’ordre de grandeur est révélateur de l’intérêt autour de ces technologies &lt;a href="#sf-canaille-nlnet-pytest-iam-4-back" class="simple-footnote-back"&gt;↩︎&lt;/a&gt;&lt;/li&gt;&lt;li id="sf-canaille-nlnet-pytest-iam-5"&gt;le supermarché coopératif de l’agglomération bordelaise &lt;a href="#sf-canaille-nlnet-pytest-iam-5-back" class="simple-footnote-back"&gt;↩︎&lt;/a&gt;&lt;/li&gt;&lt;li id="sf-canaille-nlnet-pytest-iam-6"&gt;par abus de langage, je dirai simplement &lt;em&gt;OIDC&lt;/em&gt; &lt;a href="#sf-canaille-nlnet-pytest-iam-6-back" class="simple-footnote-back"&gt;↩︎&lt;/a&gt;&lt;/li&gt;&lt;li id="sf-canaille-nlnet-pytest-iam-7"&gt;l’« Internet Engineering Task Force » un organsime étasunien de développement et de promulgation de standards &lt;a href="#sf-canaille-nlnet-pytest-iam-7-back" class="simple-footnote-back"&gt;↩︎&lt;/a&gt;&lt;/li&gt;&lt;li id="sf-canaille-nlnet-pytest-iam-8"&gt;Ils peuvent aussi êtres moteurs de nouvelles améliorations, comme &lt;a href="https://www.rfc-editor.org/rfc/rfc7628.html"&gt;RFC7628&lt;/a&gt; ou &lt;a href="https://www.rfc-editor.org/rfc/rfc9068.html"&gt;RFC9068&lt;/a&gt; qui furent des usages avant d’être des standards. &lt;a href="#sf-canaille-nlnet-pytest-iam-8-back" class="simple-footnote-back"&gt;↩︎&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Canaille, a lightweight identity and authorization management software</title><link href="https://yaal.coop/blog/en/canaille-nlnet-pytest-iam" rel="alternate"/><published>2023-11-29T00:00:00+01:00</published><updated>2023-11-29T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2023-11-29:/blog/en/canaille-nlnet-pytest-iam</id><summary type="html">&lt;p&gt;With the support of the NLNet foundation, Yaal Coop was able to implement important features in Canaille, a lightweight identity and authorization management software&lt;/p&gt;</summary><content type="html">&lt;p&gt;Since a while, the Yaal Coop team is working on Canaille, an identity and authorization management software &lt;em&gt;(or &lt;abbr&gt;IAM&lt;/abbr&gt;)&lt;/em&gt;.
At the occasion of the end of an endeavour that benefited the help of the NLNet foundation, we want to tell the history around Canaille.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://canaille.yaal.coop"&gt;&lt;img alt="Canaille" src="/media/img/canaille.webp"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;At first was the Single Sign On&lt;/h2&gt;
&lt;p&gt;At Yaal Coop (like anywhere else) we use a bunch of tools to work together as a team.
Emails, files, address book, project management, time tracking, accountability, continuous integration, bug reporting… and the list goes on.
For the comfort of use (and for security), those tools are generally plugged to a central software that manages user accounts and accesses.
Usually, LDAP[ref]or more exactly, a software implementing the LDAP protocol[/ref] is used for that, and this is called a directory.
If a service is connected to a directory, you do not need to register to that service, you can just use your usual password, the one you set in the directory.
It is convenient for you since you just have one single password to remember &lt;em&gt;(or to forget)&lt;/em&gt;. This is what is called &lt;em&gt;Single Sign On (&lt;abbr&gt;SSO&lt;/abbr&gt;)&lt;/em&gt;.
It is also convenient for people managing the user accounts in your organization, as they can create and revoke accounts for all the plugged services at a time.&lt;/p&gt;
&lt;p&gt;LDAP is old and robust, and for software those are qualities.
The few decades of experience behind LDAP make it a battle-tested technology compatible with a large selection of services.
But unfortunately LDAP is also complicated and abstruse.&lt;/p&gt;
&lt;p&gt;Its &lt;em&gt;tree&lt;/em&gt; model looks like few other things you might know, the documentation is rare and obscure, conventions are intriguing, with a lot of distressing acronyms, tooling is sparse…
Also, this was made for data often read but rarely written.
The data models LDAP offers cannot easily evolve.
Generally, the provided ones allow to handle basic attributes on users and groups.
If you want to manage more advanced aspects like the favourite color of users, then you need to write your own data models[ref]that are called &lt;em&gt;schemas&lt;/em&gt;[/ref].
And you'd better be confident when you do it, because no update mechanism is provided for neither data nor data models[ref]at least with OpenLDAP[/ref].
Then, if you wish to share your data models with the world, it is advised that your register at the &lt;a href="https://iana.org"&gt;IANA&lt;/a&gt;[ref]what we did, our IANA number is &lt;a href="https://www.iana.org/assignments/enterprise-numbers/?q=yaal"&gt;56207&lt;/a&gt;[/ref], and provide an online reference of your schemas.&lt;/p&gt;
&lt;p&gt;When we took a close look at the LDAP universe, we had the impression that once set up, LDAP installation were left alone for years ;
like if people who might had knowledge to share had flew the austerity of that technology without documenting their adventures, and without need to returning to it because it &lt;em&gt;just works&lt;/em&gt;.
I am barely exaggerating, if we have a look[ref]OK, the comparison has limits since those different databases are not used for the same needs, but the magnitude of the numbers says something about the interest around those technologies[/ref] at the number of questions in &lt;a href="https://stackoverflow.com"&gt;stackoverflow&lt;/a&gt;, &lt;a href="https://stackoverflow.com/questions/tagged/ldap"&gt;ldap&lt;/a&gt; has approximately 1000 questions, while &lt;a href="https://stackoverflow.com/questions/tagged/postgresql"&gt;postgresql&lt;/a&gt; or &lt;a href="https://stackoverflow.com/questions/tagged/mongodb"&gt;mongodb&lt;/a&gt; have around 14.000, and &lt;a href="https://stackoverflow.com/questions/tagged/mysql"&gt;mysql&lt;/a&gt; has 45.000.&lt;/p&gt;
&lt;h2&gt;Then came the Single Log In&lt;/h2&gt;
&lt;p&gt;During our volunteer time at &lt;a href="https://supercoop.fr"&gt;Supercoop&lt;/a&gt;[ref]a cooperative supermarket near Bordeaux, France[/ref], among other tasks, we worked to install collaboration software, like we did for ourselves.
Obviously, those tools were plugged on a LDAP directory.
We noticed that the &lt;em&gt;members management&lt;/em&gt; team of the supermarket was spending a certain amount of time dealing with user support, notably with password reset demands.
People were failing to use the tools we deployed for them as soon as the first login step.
This verdict pushed us to look for &lt;em&gt;Single Login Identification (&lt;abbr&gt;SLI&lt;/abbr&gt;)&lt;/em&gt; software (free and open-source, obviously), in replacement or in addition to our historical directory.
What SLI brings, is that users can navigate between services without having to sign in every time.
They can switch from the webmail interface to the calendar without having to make a step by the authentication screen, while with a simple directory, they would have to enter their password once for each service.
For a non tech-savvy public, this is the opportinity to get rid of several technical screens, limit the error sources and the frustration.&lt;/p&gt;
&lt;p&gt;Currently the predilection protocols for SLI are OAuth2 and OpenID Connect &lt;em&gt;(&lt;abbr&gt;OIDC&lt;/abbr&gt;)&lt;/em&gt;[ref]for sake of simplicity, I will keep to &lt;em&gt;OIDC&lt;/em&gt;[/ref].
(There are other existing standards, more historical or more focused towards big organizations, like &lt;a href="https://fr.wikipedia.org/wiki/Security_assertion_markup_language"&gt;SAML&lt;/a&gt; or &lt;a href="https://fr.wikipedia.org/wiki/Central_Authentication_Service"&gt;CAS&lt;/a&gt;.)
The OAuth2 and OIDC specifications are &lt;em&gt;recent&lt;/em&gt; but they still benefit from a decade of feedback.
Tooling and documentation are numerous, the community is alive and active, and standards are still evolving at this day with the work of the &lt;abbr&gt;IETF&lt;/abbr&gt; &lt;a href="https://datatracker.ietf.org/wg/oauth/about/"&gt;&lt;em&gt;oauth&lt;/em&gt; workgroup&lt;/a&gt;.
But here again, everything is not perfect and OIDC comes with its difficulties.
First of all, OAuth2 and OIDC make about &lt;a href="https://canaille.readthedocs.io/en/latest/specifications.html#state-of-the-specs-in-Canaille"&gt;30 different standards&lt;/a&gt;, some of which contradicting or bringing corrections upon prior standards.
All of those are not pertinent for what we want to do, but simply understanding how work the few standards that actually interests us already requires a certain amount of time and work.
The OIDC implementations – by the IAMs or the services connected to IAMs – are sometimes partial or bugged.
To make nothing better, big industry actors sometimes deliberately take some liberties with the standards, and make some additional developments a requirements to be compatible with their software.[ref]They can also be a driving force for new features, like &lt;a href="https://www.rfc-editor.org/rfc/rfc7628.html"&gt;RFC7628&lt;/a&gt; or &lt;a href="https://www.rfc-editor.org/rfc/rfc9068.html"&gt;RFC9068&lt;/a&gt; that were commonly used before they became standards.[/ref]&lt;/p&gt;
&lt;p&gt;Let's get back on topic. For Supercoop, we wanted to find a tool that would be utterly simple from several point of views:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;for the final users: the volunteers of the shop.
  They must be able to use the tool without any prior technical knowledge, and without help;&lt;/li&gt;
&lt;li&gt;for the &lt;em&gt;members management team&lt;/em&gt;.
  We wanted a relatively simple tool where a little bit of learning would be acceptable but not desirable.
  As the cooperative supermarket operates with benevolent labour, we want to take care of the volunteer time and avoid disagreeable tasks.&lt;/li&gt;
&lt;li&gt;for the &lt;em&gt;IT team&lt;/em&gt;.
  Here again simplicity is at stake.
  If there is a too steep learning curve on the tools the supermarket uses, there will be an issue for recruiting competent people to help us.
  The nature of the benevolent participation of the shop make that volunteers are helping punctually, and rarely engage for years, so they do not always have the time to learn the whole technical stack.
  Ideally the IT team should be able to administrate the tool we are seeking with a superficial knowledge of the underlying protocols.
  &lt;em&gt;And with the descriptions I made of LDAP and OIDC, you start to make an idea of the problem we have&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://canaille.readthedocs.io/en/latest/specifications.html#comparison-with-other-providers"&gt;Our search&lt;/a&gt; showed us that there was a dozen of tools that could answer our needs.
However, none was fitting all our expectations.
Actually, by their very nature, the IAM software are intended to big organizations, that consequently can afford to hire competent people to administrate them, so complexity is not really an issue.
Those are mostly big powerful software, with a large protocol compatibility not pertinent for us, and requiring some technical knowledge for installation, maintenance and administration.
Pushed by our curiosity, we finally hacked something on our side.&lt;/p&gt;
&lt;h2&gt;Canaille&lt;/h2&gt;
&lt;p&gt;A few times later, our prototype had grown bigger and became &lt;a href="https://canaille.yaal.coop"&gt;Canaille&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;The features&lt;/h3&gt;
&lt;p&gt;Canaille is a user and group management software that allows account creation, edition, administration, registration, forgotten password reset, user invitation etc.
In addition, Canaille implements OIDC and provide a SLI layer for other services. Its interface is customizable and… that's all.
We try to keep the functional scope tight so Canaille can stay simple to maintain and to operate.&lt;/p&gt;
&lt;p&gt;Canaille can be used for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bringing an account edition interface on top of a LDAP directory.
  The tooling around LDAP being quite sparse, Canaille can be a convenient option and allow utilities like password reset.&lt;/li&gt;
&lt;li&gt;bringing a SLI layer on top of a LDAP directory.
  If your organization has a historical LDAP directory and you want to modernize your stack with SLI, Canaille can discretely integrate your existing stack (almost) without modifying anything, and let you the time to prepare (or not) a migration.&lt;/li&gt;
&lt;li&gt;develop applications relying upon an OIDC server.
  If, like us, you are doing software development and regularly work on applications that needs to connect to a OIDC server, then you can use Canaille in your development environment.
  Canaille being very light, this is now our tool of choice to work on client applications.&lt;/li&gt;
&lt;li&gt;test applications relying upon an OIDC server.
  We also use canaille in unit tests suites, with &lt;a href="https://pytest-iam.readthedocs.io/en/latest/"&gt;pytest-iam&lt;/a&gt;.
  This is a pytest plugin that configures and run a Canaille instance so your unit tests suite can achieve actual OIDC connections.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;The technical choices&lt;/h3&gt;
&lt;p&gt;Canaille is written in Python, with &lt;a href="https://flask.palletsprojects.com/en/3.0.x/"&gt;Flask&lt;/a&gt; for the backend and &lt;a href="https://fomantic-ui.com/"&gt;fomantic-ui&lt;/a&gt; and &lt;a href="https://htmx.org"&gt;htmx&lt;/a&gt; for the frontend.
We like the simplicity of Python and Flask, and strongly believe those are arguments that make contributions easier and increase software longevity.
We have been shocked by our discovery of HTMX earlier this year, that in short allows us to build dynamical pages without writing Javascript.
One language less is as much less complexity in the project.&lt;/p&gt;
&lt;p&gt;Under the hood, Canaille can be plugged to a LDAP directory or a SQL database.&lt;/p&gt;
&lt;h3&gt;The development techniques&lt;/h3&gt;
&lt;p&gt;We use Canaille in production, at Supercoop where it is used to manage 1800 users, but also in our own stack in our &lt;a href="https://nubla.fr"&gt;Nubla&lt;/a&gt; mutualized cloud services, and on dedicated Nubla Pro instances.
That large userbase allows us to collect user feedback, and we improve Canaille gradually in reaction to demands and according to our roadmap.&lt;/p&gt;
&lt;p&gt;Cannaille development follows the principles of the &lt;em&gt;Test Driven Development (TDD)&lt;/em&gt; when possible.
The &lt;a href="https://en.wikipedia.org/wiki/Code_coverage"&gt;code coverage&lt;/a&gt; reaches 100% &lt;em&gt;(including branches)&lt;/em&gt;, and this is a prerequisite for new contributions.
In addition to giving us confidence in our tests, this allowed us to simply delete unused pieces of code.
Bugs are easier to find when there is less code to search them into.&lt;/p&gt;
&lt;p&gt;Canaille uses all the modern Python source code linters and formatters, with &lt;a href="https://gitlab.com/yaal/Canaille/-/blob/main/.pre-commit-config.yaml"&gt;pre-commit&lt;/a&gt;, and the unit tests are run on all the officially supported Python versions.&lt;/p&gt;
&lt;p&gt;Finally, the translation of Canaille is done by the community with &lt;a href="https://hosted.weblate.org/engage/Canaille/?utm_source=widget"&gt;Weblate&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Contributions&lt;/h3&gt;
&lt;p&gt;Like most of modern software, Canaille relies on libraries so we don't have to re-invent what is already existing.&lt;/p&gt;
&lt;p&gt;At Yaal Coop for all our projects, when we find bugs in libraries, we follow a strategy that consists in implementing fixes both in our code and the libraries at the same time.
At first we patch our code with temporary but functional fixes.
However all that code we write is a maintenance burden to come, so in parallel we discuss with the maintainers of those libraries, and propose better conceived long term fixes.
This is for us a guarantee of the sustainability of those pieces of software we rely upon, and this is a way to contribute to that necessary FLOSS ecosystem.
Once the upstream library is patched, we delete our quick fix.&lt;/p&gt;
&lt;p&gt;In the same fashion when we wish additional features in libraries, we discuss our motivations with maintainers and sometimes provide implementations.
We have for instance developed the OIDC specifications &lt;a href="https://github.com/lepture/authlib/pull/505"&gt;RFC7591&lt;/a&gt; and &lt;a href="https://github.com/lepture/authlib/pull/586"&gt;RFC9068&lt;/a&gt; in &lt;a href="https://github.com/lepture"&gt;authlib&lt;/a&gt;, a library Canaille uses to deal with OIDC.&lt;/p&gt;
&lt;p&gt;The results of those efforts can be seen in our &lt;a href="https://yaal.coop/blog/en/tag/contributions"&gt;seasonal blogposts&lt;/a&gt; about our FLOSS contributions.&lt;/p&gt;
&lt;p&gt;The chance of the contributions brought us to share the maintenance of certain libraries we rely upon, like &lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt; that is a form management tool, or &lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt; and the underlying &lt;a href="https://github.com/jumbojett/OpenID-Connect-PHP"&gt;OpenIDConnect-PHP&lt;/a&gt; that allow &lt;a href="https://nextcloud.com"&gt;nextcloud&lt;/a&gt; (the file manager integrated in Nubla) to connect with Canaille.&lt;/p&gt;
&lt;p&gt;We also modestly sponsor the maintainers of &lt;a href="https://github.com/lubber-de"&gt;fomantic-ui&lt;/a&gt; and &lt;a href="https://github.com/lepture"&gt;authlib&lt;/a&gt; on a monthly basis.&lt;/p&gt;
&lt;h2&gt;The help of the NLNet foundation&lt;/h2&gt;
&lt;p&gt;Canaille has been developed to answer specific needs we met: initially Canaille was only made to work with LDAP directories.
Watching the ecosystem, we noticed that more and more software became compatible with OIDC in addition to LDAP.
Ultimately, if no service we use directly rely upon LDAP, then we could consider a replacement database with which we feel more comfortable.
In addition to this, it is more likely that people interested by the Canaille approach will have experience with things like SQL than with LDAP.
To go towards this directory, we sollicitated the &lt;strong&gt;NGI Zero Entrust&lt;/strong&gt; fund of the &lt;a href="https://nlnet.nl"&gt;NLNet foundation&lt;/a&gt; in the late 2022, for a amount of 7.000€, to help us realize tasks on Canaille (and around):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/Canaille/-/merge_requests/149"&gt;database connection genericity&lt;/a&gt;.
  This was a mandatory preparatory step to plugging additional databases than LDAP;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/Canaille/-/merge_requests/158"&gt;SQL databases support&lt;/a&gt;.
  This allows Canaille to connect to a lot of widespread databases like postgresql, mariadb and sqlite, thanks to &lt;a href="https://www.sqlalchemy.org"&gt;sqlalchemy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pytest-iam.readthedocs.io"&gt;pytest-iam&lt;/a&gt;.
  This is a tool that can prepare and run a Canaille instance in the purpose of unit testing Python applications with &lt;a href="http://pytest.org"&gt;pytest&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://nlnet.nl"&gt;&lt;img alt="Canaille" src="/media/img/logo_nlnet.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Those developments have been achieved in november 2023, and have implied numerous refactoring, bugfixes, and better conception and reliability on Canaille.
We are very grateful towards the NLNet foundation for having allowed us to work on our tool, and help at our scale to contribute to the free and open source ecosystem.&lt;/p&gt;
&lt;h2&gt;What's next?&lt;/h2&gt;
&lt;h3&gt;Go in beta version&lt;/h3&gt;
&lt;p&gt;From the beginning we have kept Canaille in &lt;em&gt;alpha&lt;/em&gt;, we are currently at version &lt;code&gt;0.0.35&lt;/code&gt;.
We advise in the documentation that the software is still not suited for production environments.
This was for us a way to experiment and break things without having to be worried about compatibility.
We would like to break one last little thing by &lt;a href="https://gitlab.com/yaal/Canaille/-/issues/138"&gt;re-thinking the configuration files&lt;/a&gt; before we let Canaille go in &lt;em&gt;bêta&lt;/em&gt;, and remove usage warnings.&lt;/p&gt;
&lt;p&gt;We track the beta version tasks in &lt;a href="https://gitlab.com/yaal/canaille/-/milestones/1"&gt;this milestone&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Go in stable version&lt;/h3&gt;
&lt;p&gt;The work we intend to realize to go from a bêta version to a finale version will essentially consists in documentation efforts and ease of installation and usage of Canaille.
The goal is to make Canaille really easy to access, in order to create usage and collect more user feedback.&lt;/p&gt;
&lt;p&gt;We track the finale version tasks in &lt;a href="https://gitlab.com/yaal/canaille/-/milestones/2"&gt;this milestone&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;And beyond…&lt;/h3&gt;
&lt;p&gt;In the future, we would like to work on &lt;a href="https://en.wikipedia.org/wiki/Provisioning_(technology)#User_provisioning"&gt;provisioning&lt;/a&gt;, by implementing the &lt;a href="https://www.rfc-editor.org/rfc/rfc7642.html"&gt;SCIM&lt;/a&gt; specification.
This will allow to decouple user authentication and account creation.
Indeed, at the moment user accounts are created the first time users log in at our services.
This can raise issues in some situations: for instance one cannot share files in Nextcloud with users who have not log in yet.
SCIM also provides a mechanism to delete user accounts in those services, that is a thing we do more or less manually at the moment.&lt;/p&gt;
&lt;p&gt;Among the things we look forward to implement, there are also the &lt;em&gt;&lt;a href="https://gitlab.com/yaal/Canaille/-/issues/155"&gt;Single Log-Out&lt;/a&gt; (&lt;abbr&gt;SLO&lt;/abbr&gt;)&lt;/em&gt; OIDC specifications.
This will allow users to disconnect from all the services in a single action.
SLO is a feature that will bring security and comfort of use.
This will need to be developed in authlib in a first time.&lt;/p&gt;
&lt;p&gt;At last, we would like to work on advanced group management and permissions, and on &lt;a href="https://en.wikipedia.org/wiki/Multi-factor_authentication"&gt;multi-factor authentication&lt;/a&gt; to bring even more flexibility and security in Canaille.&lt;/p&gt;
&lt;p&gt;Canaille is open to contributions, if you want to help us in this endeavour, &lt;a href="https://gitlab.com/yaal/canaille"&gt;the door is open&lt;/a&gt;!&lt;/p&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant l'été 2023</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-ete-2023" rel="alternate"/><published>2023-09-23T00:00:00+02:00</published><updated>2023-09-23T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2023-09-23:/blog/dernieres-contributions-logiciels-libres-ete-2023</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant l'été 2023.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cet été nous avons décidé de sponsoriser deux auteurs d'outils desquels nous dépendons. C'est un petit montant pour le moment, mais nous espérons qu'à l'avenir il augmentera ou que la liste des récipiendaires s'élargira.&lt;/p&gt;
&lt;p&gt;Nous avons mis une partie de notre énergie sur Canaille, en implémentant le gros morceau de notre engagement à la subvention NLNet, à savoir la généricité des backends de base de données. L'implémentation de la &lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/149"&gt;base de données en mémoire&lt;/a&gt; nous a permis d'utiliser Canaille dans &lt;a href="https://pytest-iam.readthedocs.io/en/latest/"&gt;pytest-iam&lt;/a&gt;, un outil qui permet de lancer un serveur OpenID Connect dans des tests unitaires.&lt;/p&gt;
&lt;h2&gt;Mécénat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; pour son travail sur &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, un chouette framework CSS que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; pour son travail sur &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, une bibliothèque python d'authentification que nous utilisons dans &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur OpenID Connect simpliste, basé sur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/136"&gt;Support des champs de formulaire multiples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/137"&gt;Les pages web sont boostées avec HTMX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/138"&gt;jquery 3.7.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/139"&gt;Correction des identifiants utilisateur dans les URL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/141"&gt;Ajout d'une option de configuration pour désactiver javascript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/142"&gt;Le paramètre &lt;code&gt;USER_FILTER&lt;/code&gt; est analysé avec jinja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/143"&gt;Ajout d'un paramètre &lt;code&gt;OIDC.REQUIRE_NONCE&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/144"&gt;Les fenêtres modales sont en HTML plutôt qu'en JS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/145"&gt;Correction sur la dépedance à Babel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/146"&gt;Validation des numéros de téléphone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/147"&gt;Confirmation des adresses email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/148"&gt;Page d'inscription&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/149"&gt;Implémentation d'un backend en mémoire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/150"&gt;Configuration de packages &lt;code&gt;extras&lt;/code&gt; pour des installations dans différents contextes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/151"&gt;L'écran de connexion principal et OIDC sont fusionnés&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/152"&gt;fomantic-ui 2.9.3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion de formulaires web&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/794"&gt;Arrêt du support de python 3.7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/795"&gt;Correction d'avertissements de style&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/796"&gt;Améliorations sur la documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/flask-wtf"&gt;flask-wtf&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Intégration de WTForms dans Flask&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/571"&gt;Corrections sur les tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/572"&gt;Conciergerie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/574"&gt;Arrêt du support de python 3.7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/spiral-project/ihatemoney"&gt;ihatemoney&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Une application web simple de gestion de budget&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1158"&gt;Flux RSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1203"&gt;Corrections sur les tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1211"&gt;Année dynamique dans la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1213"&gt;Migration à pytest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1215"&gt;Amélioration de la vitesse d'exécution des tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1216"&gt;Conciergerie&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-ldap/python-slapd"&gt;python-slapd&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Interface pythonique pour contrôler un serveur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-ldap/python-slapd/pull/8"&gt;Utilitaire d'initialisation de l'arbre LDAP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion des identités et des accès&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/570"&gt;Arrêt du support de python 3.7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/571"&gt;Passage d'options de tox à pytest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/572"&gt;Utilisation d'une base de données Django en mémoire dans les tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/574"&gt;Corrections d'avertissements de SQLAlchemy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/575"&gt;Corrections d'avertissements dans les tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/576"&gt;Différents points d'accès de même type peuvent être enregistrés&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/pytest-iam"&gt;pytest-iam&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur OAuth2/OIDC léger pour vos tests unitaires&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pytest-iam.readthedocs.io"&gt;Premières publications et documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Debian&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=915583#30"&gt;Nouvelle proposition de style&lt;/a&gt; pour les documentation Sphinx, qui est utilisé actuellement pour &lt;a href="https://www.debian.org/doc/debian-policy/"&gt;debian-policy&lt;/a&gt; et potentiellement demain pour les &lt;a href="https://salsa.debian.org/holgerw/release-notes/-/merge_requests/4"&gt;notes de publication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=927228"&gt;Enquête sur un rapport de bogue concernant Supervisor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Summer 2023 FOSS contributions by the Yaal Coop team</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-ete-2023" rel="alternate"/><published>2023-09-23T00:00:00+02:00</published><updated>2023-09-23T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2023-09-23:/blog/en/dernieres-contributions-logiciels-libres-ete-2023</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during summer 2023.&lt;/p&gt;</summary><content type="html">&lt;p&gt;This summer we decided to sponsor two authors of tools we are depending on. This is a small amount for the moment, but hopefully this will grow or we add more recipients to the list.&lt;/p&gt;
&lt;p&gt;We spent a bit of energy on Canaille, and implementing the big part of our NLNet subsidy, that is the database backend genericity. The &lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/149"&gt;inmemory backend&lt;/a&gt; allowed us to use canaille in &lt;a href="https://pytest-iam.readthedocs.io/en/latest/"&gt;pytest-iam&lt;/a&gt;, a tool that bring a lightweight OpenID Connect provider to be used in your unit tests.&lt;/p&gt;
&lt;h2&gt;Sponsoring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lubber-de"&gt;Marco 'Lubber' Wienkoop&lt;/a&gt; for his work on &lt;a href="https://fomantic-ui.com"&gt;Fomantic-UI&lt;/a&gt;, a nice CSS framework we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;. Fomantic-UI is used on other tools we rely on, like &lt;a href="https://forgejo.org"&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sponsors/lepture"&gt;Hsiaoming Yang&lt;/a&gt; for his work on &lt;a href="https://authlib.org"&gt;authlib&lt;/a&gt;, a python authentication library we use in &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simplistic OpenID Connect provider over OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/136"&gt;Multiple form fields support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/137"&gt;Pages are boosted with HTMX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/138"&gt;Bump to jquery 3.7.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/139"&gt;Fix user identification in URLs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/141"&gt;Configuration option to disable javascript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/142"&gt;&lt;code&gt;USER_FILTER&lt;/code&gt; configuration is parsed with jinja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/143"&gt;&lt;code&gt;OIDC.REQUIRE_NONCE&lt;/code&gt; configuration parameter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/144"&gt;Modals are HTML pages instead of JS elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/145"&gt;Fix Babel requirement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/146"&gt;Phone number validation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/147"&gt;Email confirmation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/148"&gt;User registration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/149"&gt;Alternative inmemory backend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/150"&gt;Installation extra packages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/151"&gt;Merged the core and OIDC login screens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/152"&gt;Bump to fomantic-ui 2.9.3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A flexible forms validation and rendering library for Python.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/794"&gt;Stop python 3.7 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/795"&gt;Fix style warnings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/796"&gt;Documentation improvements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/flask-wtf"&gt;flask-wtf&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/571"&gt;Unit test fixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/572"&gt;Janitoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/574"&gt;Stop python 3.7 support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/spiral-project/ihatemoney"&gt;ihatemoney&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A simple shared budget manager web application&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1158"&gt;RSS feeds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1203"&gt;Unit test fixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1211"&gt;Dynamic year in the documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1213"&gt;Pytest migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1215"&gt;Unit test speed-up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spiral-project/ihatemoney/pull/1216"&gt;Janitoring&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-ldap/python-slapd"&gt;python-slapd&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Controls a slapd process in a pythonic way&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-ldap/python-slapd/pull/8"&gt;LDAP tree initialization utility&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Identity and Access management library for python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/570"&gt;Stop python 3.7 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/571"&gt;tox option to pass arguments to pytest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/572"&gt;Django in-memory database usage in unit tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/574"&gt;SQLAlchemy warning fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/575"&gt;Unit test warning fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/576"&gt;Multiple endpoints of a kind can be registered&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/pytest-iam"&gt;pytest-iam&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A lightweight OAuth2/OIDC server to be used in your test suite&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pytest-iam.readthedocs.io"&gt;First releases and documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Debian&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=915583#30"&gt;New style proposal&lt;/a&gt; for Sphinx documentations, which is currently used for &lt;a href="https://www.debian.org/doc/debian-policy/"&gt;debian-policy&lt;/a&gt; and could be used in the future for the &lt;a href="https://salsa.debian.org/holgerw/release-notes/-/merge_requests/4"&gt;release notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=927228"&gt;Search on the Supervisor bug report&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant le printemps 2023</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-printemps-2023" rel="alternate"/><published>2023-06-21T00:00:00+02:00</published><updated>2023-06-21T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2023-06-21:/blog/dernieres-contributions-logiciels-libres-printemps-2023</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant le printemps 2023.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;&lt;a href="https://addons.mozilla.org/fr/firefox/addon/html-rfc/"&gt;htmlRFC&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Greffon Firefox affichant un lien des RFC au format texte brut vers une version au format HTML&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Acceptation des RFC du site web &lt;a href="https://rfc-editor.org"&gt;rfc-editor.org&lt;/a&gt; : &lt;a href="https://gitlab.com/sblondon/htmlrfc/-/commit/2db775f4193b9eb5d645e67b28cb01fdb79e3d8f"&gt;greffon activé sur le site rfc-editor.org&lt;/a&gt; et &lt;a href="https://gitlab.com/sblondon/htmlrfc/-/commit/dff78979003de97bddc7b41dd0cdfa5c7f4cea39"&gt;redirection vers rfc-editor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Publication d'une version 1.2&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Debian&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Amélioration de la page de manuel de &lt;a href="https://salsa.debian.org/games-team/blastem/-/merge_requests/2"&gt;BlastEm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pour la migration des notes de publication de DocBook à Sphinx : &lt;a href="https://salsa.debian.org/holgerw/release-notes/-/merge_requests/2"&gt;coloration syntaxique des commandes et exemples de configuration&lt;/a&gt;, &lt;a href="https://salsa.debian.org/holgerw/release-notes/-/merge_requests/3"&gt;disparition du texte 'Created using Sphinx'&lt;/a&gt; dans le pied-de-page, &lt;a href="https://salsa.debian.org/holgerw/release-notes/-/merge_requests/4"&gt;ajout d'un fichier CSS to correspondre au style de Debian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Logrotate&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Outil Unix pour administrer les journaux sur un système produisant de nombreux journaux&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/logrotate/logrotate/pull/508"&gt;Passage du code de sortie à 0&lt;/a&gt; quand l'erreur provoque l'arrêt de l'exécution du programme. Cela correspond au comportement attendu d'un utilitaire Unix.&lt;/li&gt;
&lt;li&gt;Amélioration mineure de la &lt;a href="https://github.com/logrotate/logrotate/pull/509"&gt;documentation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/bebleo/smtpdfix"&gt;smtpdfix&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Un serveur SMTP pour pytest avec encryption et authentification.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bebleo/smtpdfix/pull/306"&gt;Utilisation d'un port aléatoire par défaut au lieu de 8025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/TkTech/flask-themer"&gt;flask-themer&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Support simple de thèmes dans les applications flask&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TkTech/flask-themer/pull/4"&gt;Étendre un template depuis un autre thème&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/Pylons/zodburi/"&gt;zodburi&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Construit des storage ZODB à partir d'URIs.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Pylons/zodburi/pull/32"&gt;Arrêt du support de ZODB4 et de python&amp;lt;3.7, ajout de l'intégration continue Github Actions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur OpenID Connect simpliste, basé sur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/118"&gt;Expiration des comptes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/119"&gt;Protection CSRF sur tous les formulaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/120"&gt;Validation dynamique des formulaires avec HTMX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/121"&gt;Améliorations sur le thème sombre&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/123"&gt;Conventions de nommage de SCIM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/124"&gt;Mise à jour vers 1.9.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/125"&gt;Correctif sur la validation de champs vides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/126"&gt;Filtres d'ACL génériques&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/127"&gt;Mise à jour vers htmx 1.9.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/128"&gt;Correctif sur les destinataires des emails d'initalisation de mots de passe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/129"&gt;Affichage du bouton de récupération de mot de passe sur la page d'identification OIDC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/130"&gt;Les dates sont enregistrées en UTC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/131"&gt;Arrêt du support de python 3.7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/132"&gt;Tests unitaires sur les backends génériques&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/134"&gt;Les options de configurations peuvent êtres des chemins de fichier&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://anymail.dev/"&gt;django-anymail&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Intégration des e-mails dans Django pour les fournisseurs d'e-mails transactionels&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/anymail/django-anymail/pull/321"&gt;Mise-à-jour du domaine utilisé par l'API, de tests unitaires et de la documentation&lt;/a&gt; suite au renommage de Sendinblue en Brevo&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Composant svelte de suggestion d'éléments dans une liste déroulante&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/197"&gt;Appel de la fonction personnalisée de tri lors du focus sur le champ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>FOSS contributions from the Yaal Coop team during spring 2023</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-printemps-2023" rel="alternate"/><published>2023-06-21T00:00:00+02:00</published><updated>2023-06-21T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2023-06-21:/blog/en/dernieres-contributions-logiciels-libres-printemps-2023</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during spring 2023.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;&lt;a href="https://addons.mozilla.org/fr/firefox/addon/html-rfc/"&gt;htmlRFC&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Firefox plug-in displaying a link for RFCs in plain text format to HTML one&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accept RFCs on &lt;a href="https://rfc-editor.org"&gt;rfc-editor.org&lt;/a&gt; website: &lt;a href="https://gitlab.com/sblondon/htmlrfc/-/commit/2db775f4193b9eb5d645e67b28cb01fdb79e3d8f"&gt;plugin enabled on rfc-editor.org site&lt;/a&gt; and &lt;a href="https://gitlab.com/sblondon/htmlrfc/-/commit/dff78979003de97bddc7b41dd0cdfa5c7f4cea39"&gt;redirect to rfc-editor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Release v.1.2&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Debian&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Improve &lt;a href="https://salsa.debian.org/games-team/blastem/-/merge_requests/2"&gt;BlastEm&lt;/a&gt; manpage&lt;/li&gt;
&lt;li&gt;During release notes migration from DocBook to Sphinx: &lt;a href="https://salsa.debian.org/holgerw/release-notes/-/merge_requests/2"&gt;highlight command line and configuration examples&lt;/a&gt;, &lt;a href="https://salsa.debian.org/holgerw/release-notes/-/merge_requests/3"&gt;hide 'Created using Sphinx' text&lt;/a&gt; in the footer, &lt;a href="https://salsa.debian.org/holgerw/release-notes/-/merge_requests/4"&gt;add CSS file to fit Debian style&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Logrotate&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Unix tool for administration of log files on a system which generates a lot of log files&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/logrotate/logrotate/pull/508"&gt;Turn exit code to 0&lt;/a&gt; when the raised error stops the execution. It fits expected behavior for Unix tools.&lt;/li&gt;
&lt;li&gt;Minor &lt;a href="https://github.com/logrotate/logrotate/pull/509"&gt;documentation&lt;/a&gt; improvement.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/bebleo/smtpdfix"&gt;smtpdfix&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A SMTP server for use as a pytest fixture that implements encryption and authentication.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bebleo/smtpdfix/pull/306"&gt;Use a random port instead of 8025 by default&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/TkTech/flask-themer"&gt;flask-themer&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simple theming support for Flask apps.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TkTech/flask-themer/pull/4"&gt;Extend a template from another theme&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/Pylons/zodburi/"&gt;zodburi&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Construct ZODB storage instances from URIs.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Pylons/zodburi/pull/32"&gt;Remove support for ZODB4 and python&amp;lt;3.7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simplistic OpenID Connect provider over OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/118"&gt;Account expiration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/119"&gt;CSRF protection on every forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/120"&gt;Dynamic form validation with HTMX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/121"&gt;Dark theme improvements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/123"&gt;SCIM naming convention&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/124"&gt;Bump to htmx 1.9.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/125"&gt;Empty field validation fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/126"&gt;Generic ACL filters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/127"&gt;Bump to htmx 1.9.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/128"&gt;Password initialization mail recipient bugfix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/129"&gt;Display password recovery button on OIDC login page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/130"&gt;Dates are saved in UTC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/131"&gt;Stop support for python 3.7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/132"&gt;Generic backend unit tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/134"&gt;File-path configuration entries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://anymail.dev/"&gt;django-anymail&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Django email integration for transactional ESPs&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/anymail/django-anymail/pull/321"&gt;Update domain used by the API, unit tests and documentation&lt;/a&gt; due to Sendinblue rebranding to Brevo&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simple Autocomplete / typeahead component for Svelte&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/197"&gt;Call custom ordering functions when opening the menu with an empty input&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Chapitre 2022</title><link href="https://yaal.coop/blog/chapitre-2022" rel="alternate"/><published>2023-06-12T00:00:00+02:00</published><updated>2023-06-12T00:00:00+02:00</updated><author><name>Camille Daniel &lt;camille@yaal.coop&gt;</name></author><id>tag:yaal.coop,2023-06-12:/blog/chapitre-2022</id><summary type="html">&lt;p&gt;Quelques nouvelles de notre projet coopératif dans notre rapport de gestion 2022.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cela commence à faire pas mal de temps qu'on ne vous a pas raconté ce que devenait notre projet coopératif ! En fait on n'a pas vraiment pris le temps d'en discuter publiquement depuis le 24 septembre 2021 dans notre article de blog &lt;a href="https://yaal.coop/blog/de-yaal-a-yaal-coop"&gt;De Yaal à Yaal Coop&lt;/a&gt; qui raconte la genèse de Yaal Coop 🙈.&lt;/p&gt;
&lt;p&gt;Pour remédier à ça, on a décidé de publier ici notre &lt;strong&gt;rapport de gestion 2022&lt;/strong&gt;. Le rapport de gestion, rédigé annuellement à l'intention des associé·es avant l'Assemblée Générale Ordinaire (AGO) validant les comptes annuels, permet de faire le point sur la situation de l'entreprise durant l'exercice écoulé et de mettre en perspective celui à venir. On n'est pas encore rompu à l'exercice mais on s'est dit que c'était une bonne idée de le partager avec vous 🙌.&lt;/p&gt;
&lt;p&gt;Notre AGO (la deuxième seulement depuis le début de l'aventure !) s'est déroulée mi-mai, en présence de tous nos associés, ou presque (quelle idée aussi d'avoir tenté un vol plané à vélo pendant mes vacances une semaine plus tôt 🤕😗🎶). L'AGO, au-delà de son caractère officiel et obligatoire, est surtout pour nous l'occasion de &lt;strong&gt;faire un pas de côté&lt;/strong&gt;, regarder le chemin parcouru et vérifier qu'on ne s'est pas perdu en route. En discuter avec les associé·es non salarié·es qui ne vivent pas notre projet au quotidien est aussi très salutaire ! L'occasion d'échanger sur les bonnes (ou moins bonnes) pratiques, s'inspirer... En buvant quelques bières 🍻 !&lt;/p&gt;
&lt;p&gt;Sans plus de transition, voici le rapport que nous leur avons adressé.&lt;/p&gt;
&lt;p&gt;N'hésitez pas à &lt;a href="https://yaal.coop/#contact"&gt;passer nous voir&lt;/a&gt; pour en discuter plus largement si vous le souhaitez ! (Mais toujours pas le mercredi, c'est resté le jour du télétravail collectif 😉)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Cher·e sociétaire,&lt;/p&gt;
&lt;p&gt;Nous avons l’honneur de vous présenter notre rapport sur les opérations de l’exercice clos le 31 décembre 2022, ainsi que sur les comptes annuels dudit exercice soumis aujourd’hui à votre approbation. Ce rapport a été rédigé collectivement par le collège des salarié·es de Yaal Coop.&lt;/p&gt;
&lt;h2&gt;Un peu d'histoire : les faits marquants de l'année 2022&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;janvier : Yaal Coop obtient &lt;a href="https://www.entreprises.gouv.fr/fr/entrepreneuriat/aides-et-financement/l-agrement-au-credit-impot-innovation"&gt;l'agrément CII&lt;/a&gt; : toutes nos prestations liées au développement de prototypes et aux installations pilotes de nouveaux produits sont dorénavant éligibles au CII (Crédit d'Impôt Innovation) pour nos clients. Janvier marque aussi le début d'une mission pour &lt;a href="https://telecoop.fr/"&gt;Telecoop&lt;/a&gt;, premier opérateur télécom coopératif, d'assistance et développement de nouveaux outils sur quelques jours par mois.&lt;/li&gt;
&lt;li&gt;février : Nous démarrons une prestation pour le Ministère de l'Éducation nationale afin de remettre à niveau et poursuivre le développement de leur projet informatique B3Desk (frontal OpenIDConnect de gestion simplifiée des visioconférences BigBlueButton de l'Éducation nationale et des agents de l'État).&lt;/li&gt;
&lt;li&gt;mars : Un gros chantier de séparation de l'infrastructure technique de Yaal Coop et Yaal SAS est mené à l'occasion d'une migration de serveurs de notre hébergeur historique Scaleway. On bascule alors notre infrastructure interne sur nos serveurs hébergés chez notre hébergeur associatif local &lt;a href="https://www.aquilenet.fr/"&gt;Aquilenet&lt;/a&gt; sur lesquels nous gérons un cluster lxc/lxd de conteneurs linux. Yaal SAS devient par la même occasion le premier client officiel de &lt;a href="https://nubla.fr/offre"&gt;notre offre Nubla Pro&lt;/a&gt; !&lt;/li&gt;
&lt;li&gt;avril : Nous réalisons une journée de formation en équipe sur le DDD (Domain Driven Design), une technique de conception logicielle orientée métier, animée par Bertrand Bougon.&lt;/li&gt;
&lt;li&gt;mai : Un temps fort de la vie coopérative de Yaal Coop, c'est l'heure de sa toute première Assemblée Générale Ordinaire, en présence de l'ensemble de ses associé·es. 🎉&lt;/li&gt;
&lt;li&gt;juin : Une petite mission démarre avec &lt;a href="https://www.freexian.com/fr/"&gt;Freexian&lt;/a&gt; pour retravailler son identité graphique et refondre ses deux sites web statiques ainsi que son fil d'actualités.&lt;/li&gt;
&lt;li&gt;août : C'est la fin de notre mission régulière pour Sinch sur Myelefant, le projet historique de Yaal SAS racheté en 2019. Yaal Coop vole maintenant complètement de ses propres ailes !&lt;/li&gt;
&lt;li&gt;septembre : Notre associé Yaal SAS est remplacé par Gruyère SAS (formé d'un sous ensemble plus réduit des anciens associés de Yaal SAS) dans le collège des investisseurs de Yaal Coop. C'est aussi le début de notre intervention sur la startup d'État &lt;a href="https://beta.gouv.fr/startups/plateforme.impact.html"&gt;Projet Impact&lt;/a&gt; pour lancer le développement d'une plateforme française d'aide aux entreprises à satisfaire leurs obligations réglementaires en matière de performance extra-financière.&lt;/li&gt;
&lt;li&gt;octobre : Une petite mission est réalisée pour &lt;a href="https://podeduc.apps.education.fr/"&gt;PodEduc&lt;/a&gt;, une plateforme vidéo pour les agents de l'Éducation nationale, via deux contributions au logiciel libre Esup-Pod.&lt;/li&gt;
&lt;li&gt;novembre : Notre projet interne &lt;a href="https://canaille.yaal.coop/"&gt;Canaille&lt;/a&gt;, logiciel libre de gestion d'identité et d'autorisations, obtient un financement de la fondation NLNet d'un montant de 7 000€ pour développer quelques fonctionnalités prévues en 2023.&lt;/li&gt;
&lt;li&gt;décembre : &lt;a href="https://nubla.fr/accueil"&gt;Nubla&lt;/a&gt;, notre service d'hébergement e-mail et cloud, fait officiellement partie des 6 nouveaux CHATONS du Collectif des Hébergeurs Alternatifs, Transparents, Ouverts, Neutres et Solidaires ! Nos services sont disponibles gratuitement sur demande aux premiers beta-testeurs. Enfin, nous préparons l'embauche de Julien qui rejoint la coopérative à la toute fin du mois pour travailler sur une mission avec NEHS Digital, éditeur de solutions santé pour améliorer l'efficience du parcours de soin.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Notre projet coopératif&lt;/h2&gt;
&lt;h3&gt;Sociétariat&lt;/h3&gt;
&lt;p&gt;Excepté Julien, arrivé le 27 décembre 2022, tous·tes les salarié·es sont également associé·es au sein de Yaal Coop sur l'année 2022 et détiennent chacun·e une voix égale au sein du collège des salarié·es, conformément à nos statuts.&lt;/p&gt;
&lt;p&gt;Seul changement notable au sein des autres collèges : Yaal SAS est remplacé par Gruyère SAS dans le collège des investisseurs en septembre 2022, ce qui ne modifie pas le capital social de la coopérative.&lt;/p&gt;
&lt;p&gt;Nous proposons à Colin Garriga-Salaün, le Président de Yaal SAS, de devenir associé en son nom propre dans le collège des observateurs. Celui-ci accepte en avril 2023.&lt;/p&gt;
&lt;p&gt;La composition des collèges en date du 9 mai 2023 est la suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Collège des salariés - 50% des droits de vote&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prénom NOM / RAISON SOCIALE   &lt;/th&gt;
&lt;th&gt;Nombre de parts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Brunélie LAURET&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Camille DANIEL&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loan ROBERT&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stéphane BLONDON&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Éloi RIVARD&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Collège des investisseurs - 16,66% des droits de vote&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prénom NOM / RAISON SOCIALE   &lt;/th&gt;
&lt;th&gt;Nombre de parts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GRUYERE&lt;/td&gt;
&lt;td&gt;50 000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Collège des bénéficiaires - 16,66% des droits de vote&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prénom NOM / RAISON SOCIALE   &lt;/th&gt;
&lt;th&gt;Nombre de parts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FINACOOP NOUVELLE-AQUITAINE&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Collège des observateurs - 16,66% des droits de vote&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prénom NOM / RAISON SOCIALE   &lt;/th&gt;
&lt;th&gt;Nombre de parts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arthur LEDARD&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colin GARRIGA-SALAÜN&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;(sous réserve de validation de l'entrée de Colin GARRIGA-SALAÜN par la prochaine Assemblée Générale)&lt;/p&gt;
&lt;h3&gt;Favoriser une organisation horizontale&lt;/h3&gt;
&lt;h4&gt;Mise en place d'une forme d'holacratie dans Yaal Coop&lt;/h4&gt;
&lt;p&gt;Après quelques discussions et ateliers organisés en interne, nous avons décidé de nous inspirer de l'&lt;a href="https://fr.wikipedia.org/wiki/Holacratie"&gt;holacratie&lt;/a&gt; pour définir des rôles tournants permettant d'assurer la prise en main commune de la gouvernance de la coopérative par les salarié·es. Ces rôles nous donnent un cadre pour protéger le fonctionnement horizontal souhaité dans Yaal Coop et nous protéger de la spécialisation des associé·es salarié·es.&lt;/p&gt;
&lt;p&gt;Le système, la pertinence et la répartition des rôles sont améliorés au fil du temps, à chaque nouvelle réunion de gouvernance du collège des salarié·es, actuellement organisée tous les 3 mois.&lt;/p&gt;
&lt;p&gt;Depuis sa mise en place, nous avons notamment fait la révision de la durée de certains rôles (pouvant aller de 2 semaines pour le rôle de Facteur·rice 💌 -&lt;em&gt;qui relève le courrier entrant sur nos différentes boîtes aux lettres&lt;/em&gt;- ou Sentinelle 📟 -&lt;em&gt;qui surveille et réagit aux alertes de monitoring&lt;/em&gt;-, à 2 ans avec backup pour le rôle d'Argentier·e 🪙 -&lt;em&gt;qui met à jour et surveille la trésorerie&lt;/em&gt;-). Nous avons également ajouté des précisions sur les attentes d'autres rôles lors de ces réunions, en questionnant les manquements auxquels nous avons pu faire face.&lt;/p&gt;
&lt;p&gt;Ces réunions de gouvernance viennent en complément de nos réunions de suivi hebdomadaire lors desquelles nous faisons le point sur l'ensemble des tâches et projets en cours dans la coopérative.&lt;/p&gt;
&lt;p&gt;Enfin des réunions de stratégie sur l'investissement réunissent également le collège des salarié·es tous les 3 mois pour faire le bilan de l'investissement réalisé au trimestre précédent et fixer les priorités du trimestre suivant.&lt;/p&gt;
&lt;h4&gt;Changement de présidence proposé en 2023&lt;/h4&gt;
&lt;p&gt;Les mandats concernant la présidence et la direction générale de la coopérative sont établis statutairement pour une durée de 4 ans. Nous avons décidé de mettre fin prématurément à ceux courant depuis le lancement de la coopérative en septembre 2020 afin de renforcer une représentativité et une responsabilité tournante au sein de Yaal Coop. Nous vous proposons donc d'élire notre nouvelle Présidente, Brunélie, dès la prochaine AGO !&lt;/p&gt;
&lt;h3&gt;Favoriser l'activité et les acteurs ayant un impact social ou environnemental, de préférence locaux&lt;/h3&gt;
&lt;h4&gt;Investissement technique&lt;/h4&gt;
&lt;p&gt;Nous sommes toujours associés avec &lt;a href="https://lum1.fr/"&gt;Lum1&lt;/a&gt;, premier annuaire collaboratif dédié et réservé aux professionnels du social et de la santé, projet pour lequel nous effectuons du développement en continu, à un rythme plus réduit que lors du développement intensif de la deuxième version de la plateforme l'année précédente.&lt;/p&gt;
&lt;p&gt;En 2022, nous n'avons pas signé de nouveau projet associé, toutefois certains de nos prospects montrent de l'intérêt pour cette forme de coopération qui permet d'aller au delà du lien unissant prestataire et client.&lt;/p&gt;
&lt;h4&gt;Investissement interne&lt;/h4&gt;
&lt;p&gt;Notre projet &lt;a href="https://nubla.fr/a-propos"&gt;Nubla&lt;/a&gt;, développé en interne, est un service d'hébergement cloud membre des CHATONS (Collectif des Hébergeurs Alternatifs, Transparents, Ouverts, Neutres et Solidaires) depuis décembre 2022. Son ambition est de proposer un service basé sur des solutions libres pour permettre à tous et toutes de se libérer des géants du web afin de mieux maîtriser l'utilisation de ses données et de soutenir l'écosystème numérique local.&lt;/p&gt;
&lt;h4&gt;Économie Sociale et Solidaire (ESS)&lt;/h4&gt;
&lt;p&gt;Parmi nos clients, conformément à nos engagements en tant que SCIC, figurent des acteurs de l'économie solidaire et sociale comme Telecoop.&lt;/p&gt;
&lt;p&gt;Nous avons également été en contact et en discussion avec d'autres acteur·ices de ce milieu comme prospects, sans forcément aboutir à une prestation.&lt;/p&gt;
&lt;p&gt;En 2022 nous avons souscrit des parts chez plusieurs de nos fournisseurs coopératifs : notre banque Crédit Coopératif et notre cabinet de paie &lt;a href="https://www.assistea-paie.com/"&gt;Assistea&lt;/a&gt;, ainsi que &lt;a href="https://telecoop.fr/"&gt;Telecoop&lt;/a&gt;, notre fournisseur téléphonique mobile et notre client sur une mission du premier semestre 2022.&lt;/p&gt;
&lt;h4&gt;BetaGouv et direction du numérique pour l'éducation&lt;/h4&gt;
&lt;p&gt;Toutes nos prestations ne sont pas du domaine de l'ESS, mais en 2022, nous avons multiplié les prestations pour des projets de l'État (La startup d'État &lt;a href="https://beta.gouv.fr/startups/plateforme.impact.html"&gt;Projet Impact&lt;/a&gt; développée par la direction générale des entreprises en lien avec BetaGouv, le &lt;a href="https://webinaire.numerique.gouv.fr/home"&gt;frontal de visioconférence B3Desk&lt;/a&gt; et la plateforme de vidéos &lt;a href="https://podeduc.apps.education.fr/"&gt;PodEduc&lt;/a&gt; portés par la direction du numérique pour l'éducation).&lt;/p&gt;
&lt;p&gt;Via ces missions, nous pouvons espérer participer à l'amélioration des services publics impactés par ces réalisations, sur du code source libre.&lt;/p&gt;
&lt;p&gt;Ces missions qui se poursuivent en 2023 nous permettent en outre d'assurer une certaine pérennité dans l'activité et les revenus de Yaal Coop, et participent à l'étendue de notre réseau de clients et au rayonnement de la coopérative dans le milieu.&lt;/p&gt;
&lt;h4&gt;Acteurs locaux&lt;/h4&gt;
&lt;p&gt;Tous nos clients et prospects ne sont pas des acteurs locaux, mais une partie sont bien basés à Bordeaux. Notre client Lum1 et plusieurs de nos prospects sur l'année étaient des organismes bordelais ou girondins.&lt;/p&gt;
&lt;p&gt;Nubla, notre service d'hébergement cloud membre des CHATONS, voit une bonne part de ses utilisateurs situés dans la région, que ce soit sur l'offre publique ou sur l'offre Pro. Notre communication et nos ambitions s'orientent en partie sur son aspect local et souverain.&lt;/p&gt;
&lt;h4&gt;Impact environnemental&lt;/h4&gt;
&lt;p&gt;Comme beaucoup, nous sommes sensibles aux enjeux environnementaux et tentons de limiter à notre échelle l'impact environnemental de la coopérative.&lt;/p&gt;
&lt;p&gt;La question du numérique soutenable est une question de plus en plus posée. En tant que société informatique, nous sommes évidemment concernés. Plutôt qu'un greenwashing de façade, nous nous concentrons aujourd'hui sur des actions concrètes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le choix des projets sur lesquels nous travaillons, qu'on souhaite le plus possible porteurs de sens et proches des valeurs que nous défendons. Le premier levier pour diminuer l'impact environnemental du numérique est avant tout de ne PAS construire des produits ou des fonctionnalités inutiles, irresponsables, ou incompatibles avec le matériel existant.&lt;/li&gt;
&lt;li&gt;limiter le renouvellement de notre matériel informatique en privilégiant en 2022 la réparation d'un de nos ordinateurs plutôt que son remplacement, l'achat d'un serveur d'occasion pour compléter notre infrastructure et le remplacement de ventilateurs défectueux par du matériel d'occasion sur un serveur existant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La séance de projection du documentaire libre &lt;a href="https://naos-cluster.com/2022/07/08/sortie-officielle-du-documentaire-responsables-du-numerique/"&gt;"Responsables du Numérique"&lt;/a&gt; produit par Nouvelle-Aquitaine Open Source (NAOS) en juillet 2022 nous a confortés dans l'importance de ces choix et le rôle à jouer du logiciel libre.&lt;/p&gt;
&lt;h4&gt;Réseau Libre Entreprise&lt;/h4&gt;
&lt;p&gt;Le réseau &lt;a href="https://www.libre-entreprise.org/"&gt;Libre-entreprise&lt;/a&gt; regroupe des entreprises à taille humaine ayant des spécialités proches ou complémentaires dans le domaine du logiciel libre. Ces entreprises partagent des valeurs et modes de fonctionnement proches des nôtres, basés sur la démocratie d'entreprise, la transparence et la compétence. C'est pourquoi nous avons candidaté à les rejoindre dans l'espoir de pouvoir s'aider mutuellement. Nous sommes actuellement en période d'observation. Cette période est un préalable obligatoire avant d'être validé par les membres du réseau Libre-entreprise.&lt;/p&gt;
&lt;h3&gt;Favoriser l'utilisation et le développement de logiciels libres&lt;/h3&gt;
&lt;p&gt;L'ensemble de nos contributions à des logiciels libres sont visibles sur ces différents articles de blog, publiés de façon saisonnière :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-debut-2022"&gt;Contributions début 2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-ete-2022"&gt;Contributions été 2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-automne-2022"&gt;Contributions automne 2022&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Au delà de ces contributions, la valorisation du logiciel libre est une valeur forte de la coopérative, que ce soit dans le choix même de nos missions de prestation (BetaGouv, Freexian, etc.) ou le développement de notre projet interne Nubla.&lt;/p&gt;
&lt;p&gt;Pour appuyer cet attachement, nous avons adhéré en juillet 2022 à &lt;a href="https://naos-cluster.com/"&gt;Nouvelle-Aquitaine Open Source (NAOS)&lt;/a&gt;, un pôle de compétences régional en logiciels et technologies libres et open source.
Son objectif est de promouvoir le développement d’une filière économique pour les technologies libres et open source sur le territoire de la région Nouvelle-Aquitaine.&lt;/p&gt;
&lt;p&gt;Enfin en novembre 2022, nous avons contribué financièrement à hauteur de 500€ à l'&lt;a href="https://www.afpy.org/"&gt;AFPy (Association Francophone Python)&lt;/a&gt; pour sponsoriser l'organisation de l'édition 2023 de la PyconFR qui a eu lieu du 16 au 19 février 2023 à Bordeaux. La PyconFR est une conférence nationale gratuite dédiée au regroupement des personnes intéressées par le langage de programmation Python, principal langage utilisé au sein de la coopérative.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Bilan financier et compte de résultat 2022&lt;/h2&gt;
&lt;p&gt;Comme nous nous y attendions, le résultat du bilan 2022 est nettement en deça de celui du premier exercice comptable de 2020-2021 avec un chiffre d'affaires de 220 028€. La fin du contrat avec Sinch, le ralentissement du rythme de développement de Lum1 et la plus petite durée de l'exercice comptable (12 mois versus 16, dont 14 mois d'activité lors du précédent exercice) en sont les principales raisons.&lt;/p&gt;
&lt;p&gt;Il est tout de même excédentaire avec un résultat net comptable de 46 987€. Ce bénéfice est toutefois à nuancer par l'annulation de 42 492€ de produits constatés d'avance de l'exercice précédent (règlements perçus d'avance lors de l'exercice précédent et comptabilisés en 2022). Nous n'avons pas enregistré de nouveaux produits constatés d'avance pour le prochain exercice. Sur la base de ce résultat encore fragile, nous n'avons pas jugé raisonnable d'augmenter les salaires comme nous avions envisagé de le faire, et ce malgré l'inflation.&lt;/p&gt;
&lt;p&gt;Le détail du bilan est disponible dans les comptes annuels 2022 rédigés par notre cabinet d'expertise comptable Finacoop.&lt;/p&gt;
&lt;p&gt;Conformément à la dernière décision d'Assemblé Générale, l'intégralité du bénéfice 2022 est affecté aux réserves impartageables de la coopérative, dont 15% à la réserve légale.&lt;/p&gt;
&lt;p&gt;Aucun dividende n'a été versé depuis le premier exercice comptable de Yaal Coop et les dirigeants ne touchent aucune rémunération liée à leur statut de dirigeant.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Perspectives&lt;/h2&gt;
&lt;p&gt;L'exercice 2023 a commencé et devrait se poursuivre en continuité avec la fin de l'exercice 2022 : les principales missions pour l'État ont été reconduites (Projet Impact, B3Desk) et le développement de Lum1 se poursuit à un rythme plus réduit. En parallèle des discussions s'engagent ou se poursuivent avec plusieurs prospects.&lt;/p&gt;
&lt;p&gt;Le financement de NLNet pour le développement de notre logiciel libre Canaille va nous permettre de le faire évoluer pour favoriser son adoption par d'autres acteurs. Nous sommes également en recherche de financement pour finaliser notre solution Nubla et son ouverture au grand public !&lt;/p&gt;
&lt;p&gt;Le déménagement de Yaal Coop dans &lt;a href="https://yaal.coop/local"&gt;nos futurs locaux&lt;/a&gt; à Bègles est prévu pour l'été 2023 ! La gestion des travaux et la recherche de futurs colocataires se poursuivent.&lt;/p&gt;
&lt;p&gt;Enfin, nous avons l'ambition d'un meilleur résultat pour 2023, en vue d'augmenter collectivement les salaires, sans quoi nous mettrions en doute la réussite de notre projet coopératif.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Nous espérons que les résolutions qui vous sont proposées recevront votre agrément et que vous voudrez bien donner au Président et à la Directrice Générale quitus de leur gestion pour l’exercice écoulé.&lt;/p&gt;
&lt;p&gt;Rédigé collectivement par l'équipe salariée de Yaal Coop,
Signé par Éloi Rivard, Président de Yaal Coop, et Camille Daniel, Directrice Générale de Yaal Coop.&lt;/p&gt;</content><category term="Vie coopérative"/><category term="coop"/><category term="vie coopérative"/></entry><entry><title>Visite à la PyConFR 2023</title><link href="https://yaal.coop/blog/pyconfr-2023" rel="alternate"/><published>2023-04-11T00:00:00+02:00</published><updated>2023-04-11T00:00:00+02:00</updated><author><name>Stéphane Blondon &lt;stephane@yaal.coop&gt;</name></author><id>tag:yaal.coop,2023-04-11:/blog/pyconfr-2023</id><summary type="html">&lt;p&gt;La conférence PyConFR a eu lieu du 16 au 19 février 2023 à Bordeaux. Organisée par l'AFPy, cette conférence est gratuite, entièrement gérée par des bénévoles et dédiée au regroupement des personnes intéressées par le langage de programmation Python.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://www.pycon.fr/2023/"&gt;La conférence PyConFR&lt;/a&gt; est constituée de deux jours de sprints puis deux jours de conférences. Cette année elle a eu lieu à Bordeaux, l'occasion pour Yaal Coop de s'y rendre à plusieurs et de sponsoriser l'évènement pour soutenir l'organisation.&lt;/p&gt;
&lt;p&gt;Les sprints sont l'occasion de découvrir des projets écrits en Python, mettre le pied à l'étrier pour les utiliser, idéalement, réussir à faire quelques contributions dessus. Ce fut l'occasion de tester &lt;a href="https://github.com/cgwire/zou"&gt;zou&lt;/a&gt; ainsi qu'avoir une Pull Request acceptée sur cpython (merci à &lt;a href="https://mdk.fr/"&gt;Julien Pallard&lt;/a&gt;) et d'en faire une autre, suite à la précédente. :)&lt;/p&gt;
&lt;p&gt;C'est aussi l'occasion de rencontrer et discuter dans les allées avec d'autres pythonistes.&lt;/p&gt;
&lt;p&gt;Lors de la seconde partie de la PyCon, plusieurs conférences se déroulaient en même temps, dans les amphithéatres différents. Parmi celles que nous avons vues:&lt;/p&gt;
&lt;h2&gt;Django Admin comme framework pour développer des outils internes&lt;/h2&gt;
&lt;p&gt;Il est possible d'adapter l'interface d'admin de django pour créer des applications CRUD pour un usage interne. L'intérêt est de gagner du temps en utilisant la capacité de django-admin à produire des interfaces listant et modifiant des objets rapidemment. Parmi les astuces et personnalisation, on notera :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la possibilité de modifier le nom 'Django admin' dans l'interface de connexion pour rassurer les utilisateurs&lt;/li&gt;
&lt;li&gt;l'utilisation de 'create views' dans un script de migration permettant de faire des visualisations en lecture seule.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le présentateur indique que, si le besoin devient plus complexe par la suite, la solution est de passer au developpement classique d'un service django.&lt;/p&gt;
&lt;h2&gt;Uncovering Python’s surprises: a deep dive into gotchas&lt;/h2&gt;
&lt;p&gt;Une présentation en anglais montrant des curiosités plus ou moins connues du langage. Une partie des exemples sont issus de &lt;a href="https://github.com/satwikkansal/wtfpython#structure-of-the-examples"&gt;wtfpython&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Faire du Python professionnel&lt;/h2&gt;
&lt;p&gt;Typer ou ne pas typer en python, telle est la question... Plusieurs conférences ont abordé le sujet, dont celle-ci. Globalement ses avantages semblent faire de plus en plus consensus au sein de la communauté. Une référence d'&lt;a href="https://dev.to/etenil/why-i-stay-away-from-python-type-annotations-2041"&gt;article de blog&lt;/a&gt; intéressante néanmoins, avec des arguments contre les annotations de type.&lt;/p&gt;
&lt;p&gt;Et un conseil pertinent : ne pas faire d'annotation sans mettre en place un outil (type mypy) dans la CI pour les vérifier. 😇&lt;/p&gt;
&lt;h2&gt;Portage Python sur Webassembly&lt;/h2&gt;
&lt;p&gt;WebAssembly est un langage fonctionnant dans les navigateurs. Il est possible d'écrire du code Python et de le convertir en WebAssembly. Arfang3d est un moteur 3D qui fonctionne ainsi.&lt;/p&gt;
&lt;p&gt;python -m asyncio -&amp;gt; pour avoir un shell python asynchone&lt;/p&gt;
&lt;p&gt;C'est aussi un moyen de convertir des jeux écrits avec pygame pour les exécuter dans un navigateur. Une liste de jeu compatible est disponible sur &lt;a href="https://pygame-web.github.io/"&gt;pygame-web.github.io&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Fear the mutants. Love the mutants.&lt;/h2&gt;
&lt;p&gt;Comment être sûr que les tests vérifient bien ce qu'ils sont censés vérifier ?
&lt;a href="https://pypi.org/project/mutmut/"&gt;mutmut&lt;/a&gt; modifie le code source à tester et vérifie que les tests sont en erreur après la modification. La commande principale est &lt;code&gt;mutmut run&lt;/code&gt;.
Pour changer le comportement du code, &lt;code&gt;mutmut&lt;/code&gt; accède et modifie l'AST (&lt;strong&gt;Abstact Syntax Tree&lt;/strong&gt;) grâce à la bibliothèque &lt;a href="https://pypi.org/project/parso/"&gt;parso&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Python moderne et fonctionnel pour des logiciels robustes&lt;/h2&gt;
&lt;p&gt;Il s'agissait ici de s'inspirer de quelques principes et règles souvent utilisées dans le fonctionnel pour pouvoir coder en python de façon plus propre des services plus résistants et moins endettés.&lt;/p&gt;
&lt;p&gt;Il a été question de typage avec les hints de Mypy mais aussi avec &lt;a href="https://github.com/microsoft/pyright"&gt;Pyright&lt;/a&gt;, moins permissif et donc contraignant à des règles de propreté. Avec Python3.8 sont arrivés les Protocols, un cas spécifique d'utilisation des Abstract Base Classes sans héritage où il suffit de reproduire une signature.&lt;/p&gt;
&lt;p&gt;Faire remonter les impuretés et les effets de bord a également été abordé avec l'architecture en oignon (comme la connexion à la persistance, les modifications à sauvegarder, les configurations, etc.) avec l'idée de pouvoir tester le cœur de son code sans dépendre de tout un environnement.&lt;/p&gt;
&lt;p&gt;Le paramètre &lt;code&gt;frozen&lt;/code&gt; du décorateur &lt;code&gt;@dataclass(frozen=True)&lt;/code&gt; permet de rendre les instances immutables.&lt;/p&gt;
&lt;p&gt;La classe &lt;code&gt;typing.Protocol&lt;/code&gt;, décrite dans la &lt;a href="https://peps.python.org/pep-0544/"&gt;PEP 544&lt;/a&gt; et introduite dans Python 3.8 permet de définir des interfaces.&lt;/p&gt;
&lt;p&gt;Une recommandation de vidéo : &lt;a href="https://www.youtube.com/watch?v=US8QG9I1XW0"&gt;Functional architecture - The pits of success - Mark Seemann&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Accessibilité numérique : faire sa part quand on est développeur·euse backend&lt;/h2&gt;
&lt;p&gt;Une introduction aux problématiques de l'accessibilité avec une &lt;a href="https://www.youtube.com/watch?v=EtVCVu8E0ng"&gt;démo percutante en vidéo&lt;/a&gt; de l'expérience que peut avoir une personne aveugle en naviguant sur internet.
Saviez vous qu'aujourd'hui, 1 personne sur 5 était en situation de handicap ?
L'objectif était ici de sensibiliser le public, en majorité des développeurs back-end, aux questions d'accessibilité, et d'appuyer le fait que ce n'était pas qu'une question réservée aux design ou au front.&lt;/p&gt;
&lt;p&gt;Quelques petites choses glanées :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;quand on construit une plateforme diffusant du contenu utilisateur, prévoir l'ajout possible d'un texte alternatif/de sous titres à stocker avec l'image/la vidéo de l'utilisateur&lt;/li&gt;
&lt;li&gt;se méfier des inputs utilisateurs que certains arriveront à détourner pour mettre du contenu en forme (des émojis, des caractères mathématiques...) qui sera ensuite illisible pour les lecteurs d'écrans&lt;/li&gt;
&lt;li&gt;l'attribut html &lt;code&gt;lang&lt;/code&gt; peut être utilisé avec n'importe quelle balise, pas seulement dans l'en-tête de la page, pour signaler une citation dans une langue étrangère par exemple ! Cela permet aux logiciels de lecture d'écran d'adopter la bonne prononciation 🤯&lt;/li&gt;
&lt;li&gt;préferer le server side rendering et faire de la mise en cache pour accélerer l'affichage : un loader à l'écran n'est pas forcément explicite pour tous les utilisateurs (ou lecteurs...)&lt;/li&gt;
&lt;li&gt;FALC (Facile à lire et à comprendre) est une méthode/un ensemble de règles ayant pour finalité de rendre l'information facile à lire et à comprendre, notamment pour les personnes en situation de handicap mental&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sensibiliser les producteurs d'une part significative des mediums d'information est toujours une bonne chose.&lt;/p&gt;
&lt;h2&gt;Interactive web pages with Django or Flask, without writing JavaScript&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://htmx.org/"&gt;htmx&lt;/a&gt; est une bibliothèque javascript dont le but est de permettre la fourniture de code HTML qui sera intégré dans le DOM. L'idée est de remplacer le code javascript as-hoc et les transferts en JSON (ou autre). Si le principe semble adapté à certains cas, il ne remplacera pas de gros framework produisant des Single Page App.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.pyscript.net/"&gt;pyScript&lt;/a&gt; est un projet encore très jeune qui permet l'exécution de code Python dans le navigateur.&lt;/p&gt;
&lt;p&gt;Merci à l'équipe de bénévoles pour l'organisation de la conférence. À l'année prochaine !&lt;/p&gt;</content><category term="Logiciel libre"/><category term="Logiciel libre"/><category term="conference"/><category term="sponsoring"/></entry><entry><title>Contributions à des logiciels libres par l'équipe Yaal Coop durant l'hiver 2023</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-hiver-2023" rel="alternate"/><published>2023-03-21T00:00:00+01:00</published><updated>2023-03-21T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2023-03-21:/blog/dernieres-contributions-logiciels-libres-hiver-2023</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant l'hiver 2023.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cet hiver nous avons surtout travaillé sur &lt;a href="https://canaille.yaal.coop"&gt;Canaille&lt;/a&gt; pour préparer l'implémentation de fonctionnalités sponsorisées par la &lt;a href="https://nlnet.nl/"&gt;fondation NLNet&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Documentation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Python : &lt;a href="https://github.com/python/cpython/pull/101963"&gt;suppression ou mise-à-jour de liens vers bitbucket.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Celery : corrections d'URL (&lt;a href="https://github.com/celery/celery/pull/8111"&gt;1&lt;/a&gt; et &lt;a href="https://github.com/celery/celery/pull/8112"&gt;2&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/EsupPortail/Esup-Pod"&gt;Esup-Pod&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Plateforme de partage vidéo pensée pour l'enseignement et la recherche&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Contributions financées par la &lt;a href="https://www.education.gouv.fr/direction-du-numerique-pour-l-education-dne-9983"&gt;Direction du Numérique pour l'Éducation&lt;/a&gt; (pôle &lt;a href="https://foad.phm.education.gouv.fr/fr"&gt;Formation Ouverte et A Distance&lt;/a&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/EsupPortail/Esup-Pod/pull/693"&gt;Proxy configurable par variable d'environnement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/EsupPortail/Esup-Pod/pull/694"&gt;Configuration d'une affiliation pour les utilisateurs connectés par OIDC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://www.systeme-de-design.gouv.fr/"&gt;DSFR&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Système de design de l’État&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/GouvernementFR/dsfr/pull/518"&gt;Rend le composant Interrupteur compatible avec vite+svelte&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Serveur OpenID Connect simpliste, basé sur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/82"&gt;Correction d'un paramètre de retour lors de la déconnexion OIDC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/83"&gt;Cohérence des valeurs entre les claims OIDC et JWT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/86"&gt;Formulations et ponctuations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/87"&gt;Correction de l'attribut HTML de langue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/89"&gt;Mail de test de connectivité&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/90"&gt;Mise à jour des dépendances Javascript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/91"&gt;Suppression automatiques des espaces autour des phrases de traductions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/92"&gt;Réusinages du modèle de données LDAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/"&gt;Corrections relative à l'enregistrement automatique de clients&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/98"&gt;La supression de clients supprime les objets liés&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/100"&gt;Suppression des jetons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/102"&gt;Liens vers les pages légales sur les consentements des utilisateurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/103"&gt;Correction d'un message dans le script de lancement de la démo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/104"&gt;Affichage des applications pré-autorisées&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/106"&gt;Commande de génération de groupes et d'utilisateurs aléatoires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/109"&gt;D'autres réusinages du modèle de données LDAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/111"&gt;Pagination et recherche côté serveur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/112"&gt;Support de l'édition des adresses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/113"&gt;Support de l'édition du champ « titre »&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/114"&gt;Ajout d'un sous-menu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/116"&gt;Support de l'édition du champ « organization »&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/117"&gt;Mise en cache des avatars&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Plugin OpenID Connect pour nextcloud&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/220"&gt;Pas de téléchargement des avatars s'ils n'ont pas été modifiés&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/azmeuk/flask-shell-ptpython"&gt;flask-shell-ptpython&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Utilisation de l'interpréteur de commandes ptpython dans flask&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jacquerie/flask-shell-ptpython/issues/18"&gt;Fork (temporaire) du projet pour cause d'abandon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion des identités et des accès&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/514"&gt;Suppression de code inutilisé&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion de formulaires web&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/763"&gt;Mise à jour de pre-commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/764"&gt;Support de python 3.11&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/flask-wtf"&gt;flask-wtf&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Intégration de WTForms dans Flask&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/539"&gt;Correction des tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/540"&gt;Arrêt du support de flask-babelx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/541"&gt;Mise à jour de pre-commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/542"&gt;Support de python 3.11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/546"&gt;Publication de la version 1.1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/549"&gt;Correction des tests unitaires avec Flask-Babel 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/550"&gt;Ignore d'avertissements avec flake8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-caldav/caldav"&gt;python-caldav&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python pour le protocole CalDAV&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/242"&gt;Support de python 3.11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/546"&gt;Support de l'authentification par jeton&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/bamthomas/aioimaplib"&gt;aioimaplib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python asyncio IMAP4rev1&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bamthomas/aioimaplib/pull/86"&gt;Migration de &lt;code&gt;setup.py&lt;/code&gt; à &lt;code&gt;setup.cfg&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bamthomas/aioimaplib/pull/88"&gt;Assertions pythoniques dans les tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Composant svelte de suggestion d'éléments dans une liste déroulante&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/197"&gt;Le menu reste fermé quand le champ est verrouillé&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-ldap/python-slapd"&gt;python-slapd&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Interface pythonique pour contrôler un serveur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-ldap/python-slapd/pull/6"&gt;Support de python 3.11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-ldap/python-slapd/pull/7"&gt;Augmentation par défaut de la taille de la base de données&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="http://supervisord.org/"&gt;supervisord&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Un gestionnaire de processus écrit en Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Supervisor/supervisor/pull/1583"&gt;Suppression d'une condition python3.3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>FOSS contributions from the Yaal Coop team during winter 2023</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-hiver-2023" rel="alternate"/><published>2023-03-21T00:00:00+01:00</published><updated>2023-03-21T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2023-03-21:/blog/en/dernieres-contributions-logiciels-libres-hiver-2023</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during winter 2023.&lt;/p&gt;</summary><content type="html">&lt;p&gt;This winter we have mainly worked on &lt;a href="https://canaille.yaal.coop"&gt;Canaille&lt;/a&gt; in order to prepare the implementation of features sponsored by the &lt;a href="https://nlnet.nl/"&gt;NLNet foundation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Documentation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Python : &lt;a href="https://github.com/python/cpython/pull/101963"&gt;remove or update bitbucket.org links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Celery : URLs fixed (&lt;a href="https://github.com/celery/celery/pull/8111"&gt;1&lt;/a&gt; et &lt;a href="https://github.com/celery/celery/pull/8112"&gt;2&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/EsupPortail/Esup-Pod"&gt;Esup-Pod&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Video sharing website aimed at education and research&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Contributions funded by the &lt;a href="https://www.education.gouv.fr/direction-du-numerique-pour-l-education-dne-9983"&gt;Direction du Numérique pour l'Éducation&lt;/a&gt; (&lt;a href="https://foad.phm.education.gouv.fr/fr"&gt;Formation Ouverte et A Distance&lt;/a&gt; service)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/EsupPortail/Esup-Pod/pull/693"&gt;Configurable proxy environment variable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/EsupPortail/Esup-Pod/pull/694"&gt;Configurable default affiliation for OIDC authentication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://www.systeme-de-design.gouv.fr/"&gt;DSFR&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;French State design system&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/GouvernementFR/dsfr/pull/518"&gt;Fix Toggle component compatibility with vite+svelte&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simplistic OpenID Connect provider over OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/82"&gt;Fixed a OIDC logout parameter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/83"&gt;Audience congruency between OIDC and JWT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/86"&gt;Wording and punctuation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/87"&gt;Fixed the HTML language attribute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/89"&gt;Connectivity test mail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/90"&gt;Updated Javascript dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/91"&gt;Trimmed translatable strings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/92"&gt;LDAP model object refactoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/"&gt;Dynamic client registration fixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/98"&gt;Deleting clients also delete linked attributes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/100"&gt;Admin token deletion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/102"&gt;Display policy and TOS link on the user consents page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/103"&gt;Fixed demo script messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/104"&gt;Display pre-authorized clients to users&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/106"&gt;User and group population command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/109"&gt;More LDAP model object refactoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/111"&gt;Server-side search and pagination&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/112"&gt;Address field edition support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/113"&gt;Title field edition support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/114"&gt;Sub-menu and UX work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/116"&gt;Organization edition support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/117"&gt;Avatar HTTP headers for caching&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Nextcloud login via a single OpenID Connect 1.0 provider&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/220"&gt;Avoid avatar download when unnecessary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/azmeuk/flask-shell-ptpython"&gt;flask-shell-ptpython&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Ptpython shell for flask&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jacquerie/flask-shell-ptpython/issues/18"&gt;(hopefully temporary) fork while the project is abandoned&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Identity and Access management library for python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/514"&gt;Useless code removal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A flexible forms validation and rendering library for Python.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/763"&gt;pre-commit update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/764"&gt;python 3.11 support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/wtforms/flask-wtf"&gt;flask-wtf&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/539"&gt;Unit tests fixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/540"&gt;Stop flask-babelx support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/541"&gt;pre-commit update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/542"&gt;python 3.11 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/546"&gt;1.1.0 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/549"&gt;Fixed unit tests with Flask-Babel 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/550"&gt;Ignore some flake8 warnings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-caldav/caldav"&gt;python-caldav&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Python CalDAV library&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/242"&gt;3.11 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/546"&gt;Bearer authentication support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/bamthomas/aioimaplib"&gt;aioimaplib&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Python asyncio IMAP4rev1 client library&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bamthomas/aioimaplib/pull/86"&gt;Move from &lt;code&gt;setup.py&lt;/code&gt; to &lt;code&gt;setup.cfg&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bamthomas/aioimaplib/pull/88"&gt;Pythonic assertions in the unit tests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simple Autocomplete / typeahead component for Svelte&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/197"&gt;Menu stays closed when field is locked&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://github.com/python-ldap/python-slapd"&gt;python-slapd&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Controls a slapd process in a pythonic way&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-ldap/python-slapd/pull/6"&gt;python 3.11 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-ldap/python-slapd/pull/7"&gt;Increased the default database size&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="http://supervisord.org/"&gt;supervisord&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A Process Control System written in Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Supervisor/supervisor/pull/1583"&gt;Remove python3.3 case&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Dernières contributions à des logiciels libres par l'équipe Yaal Coop (automne 2022)</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-automne-2022" rel="alternate"/><published>2022-12-21T00:00:00+01:00</published><updated>2022-12-21T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2022-12-21:/blog/dernieres-contributions-logiciels-libres-automne-2022</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop dans l'automne 2022.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;&lt;a href="https://github.com/csernazs/pytest-httpserver"&gt;pytest-httpserver&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Serveur HTTP pour pytest&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/csernazs/pytest-httpserver/pull/185"&gt;Exemples de code pour la connection HTTPS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/csernazs/pytest-httpserver/pull/186"&gt;Fixtures de serveurs n'écoutant exclusivement qu'en IPV6 ou en IPV4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/csernazs/pytest-httpserver/pull/187"&gt;Implémentation de &lt;code&gt;BaseHTTPServer.__repr__&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/samuelcolvin/dnserver"&gt;dnserver&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Serveur DNS simpliste pour le développement&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelcolvin/dnserver/pull/13"&gt;Exemples d'enregistrements SRV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelcolvin/dnserver/pull/15"&gt;Mise à jour à chaud des zones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelcolvin/dnserver/pull/16"&gt;Initialisation de la classe DNSServer sans zone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Serveur OpenID Connect simpliste, basé sur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/59"&gt;Support basique de WebFinger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/60"&gt;Implémentation de l'enregistrement dynamique des clients&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/61"&gt;Support de Python 3.11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/64"&gt;Corrections sur l'intégration continue de Gitlab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/66"&gt;Instructions de configuration d'apparmor dans la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/69"&gt;Divers réusinages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/70"&gt;Correction du traîtement de &lt;code&gt;software_statement&lt;/code&gt; du RFC7591&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/71"&gt;Génération dynamique des métadonnées OAuth2/OIDC du serveur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/72"&gt;Correction de la désactivation du pré-consentement des clients&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/73"&gt;L'option de configuration &lt;code&gt;FROM_ADDR&lt;/code&gt; devient facultative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/74"&gt;L'option de configuration &lt;code&gt;JWT.ISS&lt;/code&gt; devient facultative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/75"&gt;Les utilisateurs peuvent choisir leur langage favori&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/76"&gt;Rajout d'un lien vers le dépôt dans la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/77"&gt;Les utilisateurs peuvent choisir leur nom d'affichage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/78"&gt;Mise à jour vers authlib 1.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/79"&gt;Implémentation du point d'accès de modification des clients RFC7592&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/80"&gt;Correction du bouton de suppression des groupes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/81"&gt;Correction du bug généré par des requêtes POST sur la page d'administration des clients&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/zopefoundation/ZEO"&gt;ZEO&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Serveur de base de données pour ZODB&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/zopefoundation/ZEO/pull/215"&gt;Valeur de sortie à 1 si toutes les connexions serveur finissent en échec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Plugin OpenID Connect pour nextcloud&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/191"&gt;Mise à jour vers OpenID-Connect-PHP 0.9.10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/192"&gt;Documentation pour le paramètre &lt;code&gt;oidc_login_disable_registration&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/193"&gt;Amélioration de la documentation dans le README&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion des identités et des accès&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/505"&gt;Implémentation de RFC7592 permettant la configuration dynamique de clients OpenID Connect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/506"&gt;Support de Python 3.11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/513"&gt;Suppression des références à une fonction inutilisée&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/bamthomas/aioimaplib"&gt;aioimaplib&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python asyncio IMAP4rev1&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bamthomas/aioimaplib/pull/81"&gt;Tests unitaires avec pytest, tox et Github Actions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://msgpack.org"&gt;MessagePack&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Format de sérialisation binaire efficace (bibliothèque python)&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/msgpack/msgpack-python/pull/519"&gt;Nouvelles modifications suite à une revue de code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Composant svelte de suggestion d'éléments dans une liste déroulante&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/185"&gt;Corrections d'avertissements d'accessibilité&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://www.dnspython.org"&gt;dnspython&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;outils DNS pour Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nettoyage de code : &lt;a href="https://github.com/rthalley/dnspython/pull/871"&gt;test&lt;/a&gt; et &lt;a href="https://github.com/rthalley/dnspython/pull/873"&gt;commentaire&lt;/a&gt; obsolètes&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Last FOSS contributions from the Yaal Coop team (automn 2022)</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-automne-2022" rel="alternate"/><published>2022-12-21T00:00:00+01:00</published><updated>2022-12-21T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2022-12-21:/blog/en/dernieres-contributions-logiciels-libres-automne-2022</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during autumn 2022.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;&lt;a href="https://github.com/csernazs/pytest-httpserver"&gt;pytest-httpserver&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Http server for pytest to test http clients&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/csernazs/pytest-httpserver/pull/185"&gt;HTTPS client code samples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/csernazs/pytest-httpserver/pull/186"&gt;IPV6-only and IPV4-only server fixtures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/csernazs/pytest-httpserver/pull/187"&gt;&lt;code&gt;BaseHTTPServer.__repr__&lt;/code&gt; implementation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/samuelcolvin/dnserver"&gt;dnserver&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simple development DNS server&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelcolvin/dnserver/pull/13"&gt;Added a SRV record examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelcolvin/dnserver/pull/15"&gt;Hot zones update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelcolvin/dnserver/pull/16"&gt;DNSServer initialization without zones&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simplistic OpenID Connect provider over OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/59"&gt;Basic WebFinger support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/60"&gt;Dynamic Client Registration support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/61"&gt;Python 3.11 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/64"&gt;Gitlab CI fixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/66"&gt;Apparmor configuration instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/69"&gt;Miscellaneous refactoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/70"&gt;Fixed RFC7591 &lt;code&gt;software_statement&lt;/code&gt; claim handling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/71"&gt;Dynamic OAuth2/OIDC metadata generation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/72"&gt;Fixed client preconsent disabling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/73"&gt;&lt;code&gt;FROM_ADDR&lt;/code&gt; configuration parameter is optional&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/74"&gt;&lt;code&gt;JWT.ISS&lt;/code&gt; configuration parameter is optional&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/75"&gt;Users can chose their favorite language&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/76"&gt;Added a link to the repository in the documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/77"&gt;Users can choose their favourite display name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/78"&gt;Upgrade to authlib 1.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/79"&gt;Implemented RFC7592 OAuth Client Registration Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/80"&gt;Fixed the group deletion button&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/81"&gt;Fixed a bug related to POST requests on the client administration pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/zopefoundation/ZEO"&gt;ZEO&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;ZODB Client-Server framework&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/zopefoundation/ZEO/pull/215"&gt;Exit value is 1 if all connections fail&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Nextcloud login via a single OpenID Connect 1.0 provider&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/191"&gt;Updated OpenID-Connect-PHP to 0.9.10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/192"&gt;&lt;code&gt;oidc_login_disable_registration&lt;/code&gt; parameter documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/193"&gt;README documentation improvements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/lepture/authlib"&gt;authlib&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Identity and Access management library for python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/505"&gt;Implemented RFC7592 Dynamic Client Registration Management Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/506"&gt;Python 3.11 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lepture/authlib/pull/513"&gt;Unused method removal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/bamthomas/aioimaplib"&gt;aioimaplib&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Python asyncio IMAP4rev1 client library&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bamthomas/aioimaplib/pull/81"&gt;Unit tests with pytest, tox and Github Actions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://msgpack.org"&gt;MessagePack&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Efficient binary serialization format (python implementation)&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/msgpack/msgpack-python/pull/519"&gt;New patches after code review&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simple Autocomplete / typeahead component for Svelte&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/185"&gt;Fixed some accessibility warnings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://www.dnspython.org"&gt;dnspython&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;DNS toolkit for Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code cleaning: obsolete &lt;a href="https://github.com/rthalley/dnspython/pull/871"&gt;test&lt;/a&gt; and &lt;a href="https://github.com/rthalley/dnspython/pull/873"&gt;comment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Dernières contributions à des logiciels libres par l'équipe Yaal Coop (été 2022)</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-ete-2022" rel="alternate"/><published>2022-09-22T00:00:00+02:00</published><updated>2022-09-22T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2022-09-22:/blog/dernieres-contributions-logiciels-libres-ete-2022</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop dans l'été 2022.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/"&gt;squeekboard&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Un clavier virtuel pour Wayland&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/-/commit/b54922b021ad3c326a5de74dfba1e3ea3b7c32f5"&gt;Traduction française&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/libcall-ui"&gt;libcall-ui&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Interface utilisateur pour les appels téléphoniques sous Linux&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/libcall-ui/-/commit/7cd3cfdd2ce1fe3e72614928f46c6376c226b1a7"&gt;Traduction française&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://developer.mozilla.org/fr/"&gt;Mozilla Web Docs&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Documentation sur les technologies du web, dont CSS, HTML et Javascript&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mdn/content/pull/16769"&gt;Ajout d'une alerte&lt;/a&gt; à propos de la fonctionnalité dépréciée &lt;a href="https://developer.mozilla.org/en-US/docs/Web/OpenSearch"&gt;OpenSearch&lt;/a&gt; pour les greffons Firefox.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Serveur OpenID Connect simpliste, basé sur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/54"&gt;Déconnexions initiées par les clients&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/55"&gt;Instance de démo en ligne&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/56"&gt;Correction d'un bug où les scopes était trop permissifs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/57"&gt;Ajout d'un thème sombre&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://python.org"&gt;Python&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Documentation : &lt;a href="https://github.com/python/cpython/pull/93574"&gt;remplacement de noms de domaine non contrôlés par la PSF&lt;/a&gt; par python.org et des noms de domaines qui sont clairement des exemple (cf. &lt;a href="https://github.com/python/cpython/issues/93573"&gt;signalement&lt;/a&gt;) dans la documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/python-caldav/caldav"&gt;python-caldav&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/193"&gt;Support pour les serveurs supportant plusieurs méthodes d'authentification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/194"&gt;Configuration tox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/195"&gt;Configuration de l'intégration continue avec Github Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/197"&gt;Migration vers pytest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/198"&gt;Construction de la documentation avec tox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/199"&gt;Installation de pre-commit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Debian Archive Kit (dak)&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Programmes utilisés pour maintenir les archives du projet Debian&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://salsa.debian.org/ftp-team/dak/-/merge_requests/254"&gt;Correction des erreurs flake8 E123&lt;/a&gt;. Le code E123 concerne des parenthèses fermantes ne correspondant pas à l'indentation des parenthèses ouvrantes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Python2 finira par disparaître&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Suppression d'un contournement pour les version antérieures à 2.6 dans &lt;a href="https://github.com/Pylons/webtest/pull/244"&gt;Webtest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Documentation : suppression d'un exemple basé sur python2 dans &lt;a href="https://github.com/nickstenning/honcho/pull/235"&gt;Honcho&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Suppression de cas spécifiques à python2.7 dans &lt;a href="https://github.com/pypa/setuptools/pull/3564"&gt;setuptools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Suppression de python2 dans &lt;a href="https://github.com/msgpack/msgpack-python/pull/519"&gt;msgpack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.gnome.org/GNOME/tracker-miners/"&gt;tracker-miners&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Collecteurs de données pour GNOME Tracker&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/tracker-miners/-/merge_requests/395"&gt;Ajout d'options CLI pour l'ajout et la suppression de flux RSS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://python-poetry.org/docs/"&gt;poetry&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Outil pour la gestion des dépendances et des paquets en Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-poetry/poetry/pull/3995"&gt;Ajout d'une alerte si des identifiants sont écrits dans le fichier poetry.lock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-poetry/poetry-plugin-export/pull/93"&gt;Ajout d'un attribut privé pour correspondre à l'implémentation d'une classe fictive (mock)&lt;/a&gt; (nécessaire pour le correctif précédent)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/migraf/fhir-kindling"&gt;fhir-kindling&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Brique de connexion à des serveurs de ressources FHIR&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/migraf/fhir-kindling/pull/99"&gt;Correctif pour le support des serveurs proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/migraf/fhir-kindling/pull/105"&gt;Correctif pour le support des entêtes personnalisées&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/nazarewk/keyring_pass"&gt;keyring_pass&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Connecteur Password Store (pass) pour python-keyring&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nazarewk/keyring_pass/pull/2"&gt;Améliorations de la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nazarewk/keyring_pass/pull/6"&gt;Correction de dépréciations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/samuelcolvin/dnserver"&gt;dnserver&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Serveur DNS simpliste pour le développement&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelcolvin/dnserver/pull/2"&gt;Tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelcolvin/dnserver/pull/9"&gt;La fonctionnalité de proxy DNS est désactivable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelcolvin/dnserver/pull/10"&gt;Ajout d'exemples dans le README&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Plugin OpenID Connect pour nextcloud&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/186"&gt;Mise à jours vers OpenID-Connect-PHP 0.9.8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/187"&gt;Correction d'erreurs de mise en forme du code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/releases/tag/v2.3.3"&gt;Publication de la version 2.3.3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Last FOSS contributions from the Yaal Coop team (summer 2022)</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-ete-2022" rel="alternate"/><published>2022-09-22T00:00:00+02:00</published><updated>2022-09-22T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2022-09-22:/blog/en/dernieres-contributions-logiciels-libres-ete-2022</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during summer 2022.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/"&gt;squeekboard&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;An on-screen-keyboard input method for Wayland&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/-/commit/b54922b021ad3c326a5de74dfba1e3ea3b7c32f5"&gt;French translation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/libcall-ui"&gt;libcall-ui&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;User interface for Linux phone calls&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/libcall-ui/-/commit/7cd3cfdd2ce1fe3e72614928f46c6376c226b1a7"&gt;French translation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://developer.mozilla.org/fr/"&gt;Mozilla Web Docs&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Documentation about web technologies, including CSS, HTML, and JavaScript&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mdn/content/pull/16769"&gt;Add a Warning&lt;/a&gt; about deprecated &lt;a href="https://developer.mozilla.org/en-US/docs/Web/OpenSearch"&gt;OpenSearch&lt;/a&gt; for Firefox add-ons&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simplistic OpenID Connect provider over OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/54"&gt;Client-initiated logout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/55"&gt;Online demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/56"&gt;Fixed too permissive scopes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/57"&gt;Adding a dark theme&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://python.org"&gt;Python&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Documentation: &lt;a href="https://github.com/python/cpython/pull/93574"&gt;replace domain names not managed by PSF&lt;/a&gt; by python.org et domain names with .example Top Level Domain (cf. &lt;a href="https://github.com/python/cpython/issues/93573"&gt;issue&lt;/a&gt;) in the documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/python-caldav/caldav"&gt;python-caldav&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/193"&gt;Support for multiple authentication methods server headers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/194"&gt;Tox configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/195"&gt;Configured Github Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/197"&gt;Pytest migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/198"&gt;Build the documentation with tox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-caldav/caldav/pull/199"&gt;Precommit installation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Debian Archive Kit (dak)&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Programs used to maintain the Debian project's archives&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://salsa.debian.org/ftp-team/dak/-/merge_requests/254"&gt;Fix E123 flakes8 errors&lt;/a&gt;. E123 code means "closing bracket does not match indentation of opening bracket's line".&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Python2 will disappear&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Removal of a workaround for older releases than 2.6 in &lt;a href="https://github.com/Pylons/webtest/pull/244"&gt;Webtest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Documentation: removal of an example based on python2 in &lt;a href="https://github.com/nickstenning/honcho/pull/235"&gt;Honcho&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Removal of python2.7 specific cases in &lt;a href="https://github.com/pypa/setuptools/pull/3564"&gt;setuptools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Removal python2 support in &lt;a href="https://github.com/msgpack/msgpack-python/pull/519"&gt;msgpack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.gnome.org/GNOME/tracker-miners/"&gt;tracker-miners&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Data collectors for GNOME tracker&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/tracker-miners/-/merge_requests/395"&gt;Added CLI options for RSS feeds addition and deletion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://python-poetry.org/docs/"&gt;poetry&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Tool for dependency management and packaging in Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-poetry/poetry/pull/3995"&gt;Add a warning if credentials are written in lock file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-poetry/poetry-plugin-export/pull/93"&gt;Add private attribute to fit the implementation of the mocked class&lt;/a&gt; (needed for previous patch)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/migraf/fhir-kindling"&gt;fhir-kindling&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;FHIR resource and synthetic data set creation and management tool&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/migraf/fhir-kindling/pull/99"&gt;Bugfix for proxy support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/migraf/fhir-kindling/pull/105"&gt;Bugfix for custom headers support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/nazarewk/keyring_pass"&gt;keyring_pass&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Password Store (pass) backend for python's keyring&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nazarewk/keyring_pass/pull/2"&gt;Documentation improvements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nazarewk/keyring_pass/pull/6"&gt;Deprecation fixes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/samuelcolvin/dnserver"&gt;dnserver&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simple development DNS server&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelcolvin/dnserver/pull/2"&gt;Implemented unit tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelcolvin/dnserver/pull/9"&gt;The DNS proxy feature can be disabled&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelcolvin/dnserver/pull/10"&gt;Added code samples in the README&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Nextcloud login via a single OpenID Connect 1.0 provider&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/186"&gt;Updated OpenID-Connect-PHP to 0.9.8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/187"&gt;Fixed linter errors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/releases/tag/v2.3.3"&gt;Released v2.3.3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Revue logicielle du Librem 5 de Purism</title><link href="https://yaal.coop/blog/purism-librem5-software-santas-list" rel="alternate"/><published>2022-06-02T00:00:00+02:00</published><updated>2022-06-02T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2022-06-02:/blog/purism-librem5-software-santas-list</id><summary type="html">&lt;p&gt;Nous avons testé le téléphone Librem5 de Purism avec un regard vierge, et avons listé ce qu'il manque pour pouvoir utiliser le téléphone au quotidien.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Après plusieurs années d'attente, nous venons de recevoir le &lt;a href="https://puri.sm/products/librem-5/"&gt;Librem 5&lt;/a&gt; que nous avions commandé chez Purism.
C'est un téléphone orienté vie-privée dont les fonctionnalités notables sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l'utilisation de &lt;a href="https://pureos.net"&gt;PureOS&lt;/a&gt;, une distribution GNU/Linux basée sur Debian, à la place d'Android ou iOS ;&lt;/li&gt;
&lt;li&gt;l'interface graphique est &lt;a href="https://gnome.org"&gt;GNOME&lt;/a&gt; avec quelques modifications ;&lt;/li&gt;
&lt;li&gt;la présence de boutons permettant de physiquement éteindre le Wifi, le Bluetooth, les données mobiles, le microphone ou la caméra (c'est à dire couper l'arrivée électrique).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Utiliser Linux sur un téléphone mobile ouvre à de nouveaux usages qui concernent surtout des personnes technophiles, mais cela vient aussi avec son lot d'inconvénients.
Les plus notables sont que les téléphones sous Linux sont quelque chose de nouveau, et les applications ne sont simplement pas prêtes : les interface ne sont adaptées aux écrans mobiles, les interactions pratiques sur un téléphone mobile (comme le glissement du pouce) ne sont pas utilisées, et plus généralement les applications n'ont pas encore été assez testées par des utilisateurs mobiles.&lt;/p&gt;
&lt;p&gt;Les développeurs de logiciels libres font de leur mieux, et un sacré travail a déjà été fait.
Cependant nous ne sommes pas encore à un point où les téléphones sous Linux peuvent être mis entre toutes les mains.
Avec notre regard vierge (c'est la première fois que nous voyons un téléphone sous Linux), nous voulons lister ici ce que nous pensons qu'il manque à l'écosystème pour fournir un bonne expérience utilisateur (du moins pour notre usage biaisé de technophiles).&lt;/p&gt;
&lt;p&gt;Nous nous sommes concentrés sur les applications &lt;a href="https://apps.gnome.org/"&gt;GNOME Core et Circle&lt;/a&gt;, ainsi que sur les applications mobiles développées par Purism.&lt;/p&gt;
&lt;p&gt;Ce que nous attendons d'un téléphone est qu'il nous permette de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;passer des appels&lt;/li&gt;
&lt;li&gt;recevoir et envoyer des SMS&lt;/li&gt;
&lt;li&gt;recevoir et envoyer des emails&lt;/li&gt;
&lt;li&gt;être utilisé comme réveil&lt;/li&gt;
&lt;li&gt;gérer ses contacts&lt;/li&gt;
&lt;li&gt;gérer des listes de tâches&lt;/li&gt;
&lt;li&gt;être utilisé comme un appareil de géolocalisation&lt;/li&gt;
&lt;li&gt;naviguer sur internet&lt;/li&gt;
&lt;li&gt;jouer de la musique&lt;/li&gt;
&lt;li&gt;prendre des photos&lt;/li&gt;
&lt;li&gt;prendre des notes&lt;/li&gt;
&lt;li&gt;afficher des documents&lt;/li&gt;
&lt;li&gt;partager sa connexion internet&lt;/li&gt;
&lt;li&gt;être utilisé comme lampe-torche&lt;/li&gt;
&lt;li&gt;discuter avec des gens&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Comme produire des correctifs a encore plus de valeur que rapporter des bugs, cette liste pourrait nous servir de liste de tâches à faire si nous (ou vous ?) nous ennuyons un jour.&lt;/p&gt;
&lt;p&gt;Nous avons testé le téléphone sous &lt;a href="https://pureos.net/"&gt;PureOS byzantium&lt;/a&gt;, et mis à jour les applications grâce à &lt;a href="https://flathub.org"&gt;Flatpak&lt;/a&gt; quand c'était possible afin de bénéficier des avancées de GNOME 42.&lt;/p&gt;
&lt;h1&gt;Bloquants&lt;/h1&gt;
&lt;p&gt;Dans cette catégorie nous listons les problèmes qui nous découragent fortement pour une utilisation quotidienne.
Cela concerne principalement du stress et de la friction dans l'expérience utilisateur, ainsi que des fonctionnalités manquantes ou inutilisables.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/"&gt;Clavier virtuel&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/-/issues/93"&gt;Infobulles pour les caractères accentués&lt;/a&gt; : Le clavier devrait offrir un moyen simple d'écrire des caractères accentués.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.puri.sm/Librem5/OS-issues/"&gt;Librem5&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/OS-issues/-/issues/84"&gt;L'interface n'est pas traduite&lt;/a&gt; : Au premier lancement la langue préférée de l'utilisateur est demandée, mais l'interface reste affichée en anglais par la suite. C'est assez simple à corriger à la main, mais c'est assez surprenant.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks"&gt;Horloges&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks/-/issues/1"&gt;Les réveils devraient sonner même quand l'application n'est pas lancée&lt;/a&gt; : Une fois qu'un réveil est programmé, il devrait sonner quoi qu'il arrive, même si l'application a été fermée.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks"&gt;Horloges&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks/-/issues/100"&gt;Les réveils devraient sonner même quand le téléphone est en veille&lt;/a&gt; : Une fois qu'un réveil est programmé, il devrait sonner quoi qu'il arrive, même si le téléphone est en veille.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks"&gt;Horloges&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks/-/issues/10"&gt;Sons de réveil personnalisés&lt;/a&gt; : Pour le moment il n'y a pas de choix des sons à jouer.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks"&gt;Clocks&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks/-/issues/160"&gt;Interaction avec le réveil depuis l'écran de verrouillage&lt;/a&gt; : À l'heure actuelle il faut déverrouiller le téléphone pour éteindre le réveil. Quand on vient d'ouvrir les yeux, c'est assez compliqué.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/"&gt;Clavier virtuel&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/-/issues/282"&gt;Indicateurs d'interaction&lt;/a&gt; : Lorsqu'une lettre est pressée, on devrait avoir un indicateur visuel pour indiquer de quelle lettre il s'agissait.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.puri.sm/Librem5/linux"&gt;Librem5&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/linux/-/issues/387"&gt;Lumière nocturne&lt;/a&gt; : GNOME a une fonctionnalité de lumière nocturne qui rougit l'écran automatiquement en fonction de l'heure. Il semblerait qu'il y a des choses à faire dans le noyau pour utiliser cette fonctionnalité avec le Librem5.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/calls/"&gt;Appels&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/calls/-/issues/456"&gt;Barre latérale de navigation alphabétique&lt;/a&gt; : L'application manque d'un outil pour rapidement sauter à une lettre donnée de l'alphabet, ce qui est très utile lorsqu'on a des centaines de contacts.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-contacts"&gt;Contacts&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-contacts/-/issues/246"&gt;Barre latérale de navigation alphabétique&lt;/a&gt; : L'application manque d'un outil pour rapidement sauter à une lettre donnée de l'alphabet, ce qui est très utile lorsqu'on a des centaines de contacts.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-todo/"&gt;Tâches&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-todo/-/issues/274"&gt;Interface mobile&lt;/a&gt; : L'interface n'est pas adaptée aux mobiles, donc l'application est inutilisable pour le moment.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-weather/"&gt;Météo&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-weather/-/issues/236"&gt;Interface mobile&lt;/a&gt; : L'application n'est pas tout à fait adaptée aux mobiles.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/fractal/"&gt;Fractal&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/fractal/-/issues/717"&gt;Chiffrement de bout en bout&lt;/a&gt; : À Yaal Coop nous chiffrons tous nos salons, donc le chiffrement de bout en bout est nécessaire pour que nous puissions utiliser Fractal.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/"&gt;Cartes&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/-/issues/264"&gt;Interface mobile&lt;/a&gt; : Le menu latéral n'est pas adapté aux mobiles.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/"&gt;Cartes&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/-/issues/335"&gt;Navigation&lt;/a&gt; : L'application peut calculer des itinéraires, mais ne fournit rien pour les suivre. On ne peut donc pas encore l'utiliser dans une voiture.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/"&gt;Cartes&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/-/issues/2"&gt;Appui long pour ouvrir le menu contextuel&lt;/a&gt; : Certaines actions sont cachées derrière le menu contextuel sur bureau, qui s'ouvre avec un clic droit. Sur mobile on ne peut donc pas ouvrir ce menu. Un appui long devrait permettre d'ouvrir le menu.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-online-accounts/"&gt;Comptes en ligne&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-online-accounts/-/issues/1"&gt;Support des fournisseurs CarDAV &amp;amp; CalDAV&lt;/a&gt; : Cela permettrait de se brancher à n'importe quel fournisseur de contacts, agendas, et tâches.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/mobile-broadband-provider-info"&gt;mobile-broadband-provider-info&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/mobile-broadband-provider-info/-/merge_requests/38"&gt;Suppport de l'opérateur TéléCoop&lt;/a&gt; : Cela permet l'utilisation des données mobiles avec &lt;a href="https://telecoop.fr/"&gt;TéléCoop&lt;/a&gt;. Le correctif est appliqué, mais pas encore déployé.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-software"&gt;Logiciels&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1472"&gt;L'interface n'est pas réactive&lt;/a&gt; : Lorsque les dépôts Flatpak sont actifs, chaque action prend une éternité à s'exécuter, au point qu'il faille de temps en temps redémarrer l'application.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/kop316/vvmplayer"&gt;Messagerie vocale&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/OS-issues/-/issues/267"&gt;Pas d'application fonctionnelle de messagerie vocale&lt;/a&gt;: Pouvoir consulter ses messages (ou à défaut être averti qu'il en existe) nous semble indispensable pour un téléphone en 2022.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Confort&lt;/h1&gt;
&lt;p&gt;Dans cette catégorie nous lisons ce qui améliorerait notre confort.
Cela concerne principalement les interfaces.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/"&gt;Phosh&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/-/issues/9"&gt;Changement automatique des thèmes clairs et sombres&lt;/a&gt; : En plus de l'adaptation de la rougeur de la luminosité, passer d'un thème clair à un thème sombre le soir est très reposant pour les yeux. C'est faisable avec GNOME Shell avec l'extension &lt;a href="https://extensions.gnome.org/extension/2236/night-theme-switcher/"&gt;Night Theme Switcher&lt;/a&gt; par exemple.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/"&gt;Phosh&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/-/merge_requests/934"&gt;Glisser pour ouvrir et fermer le menu&lt;/a&gt; : Pour le moment les menus du haut et du bas ne s'ouvrent qu'en tapant, or glisser est plus naturel sur mobile. Le correctif est développé mais pas encore déployé.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/"&gt;Phosh&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/-/issues/397"&gt;Dévérouiller automatiquement le trousseau&lt;/a&gt; : Lorsqu'on déverouille une session, le mot de passe est demandé une seconde fois pour dévérouiller le trousseau de mots de passes.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/"&gt;Phosh&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/-/issues/525"&gt;Garder les boutons appuyés pour changer le volume sonore&lt;/a&gt; : Pour le moment il est nécessaire d'appuyer plusieurs fois sur les boutons de volume pour pouvoir le changer. Un appui long devrait permettre la même chose.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.puri.sm/Librem5/OS-issues"&gt;Librem5&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/OS-issues/-/issues/265"&gt;Choix de la phrase de chiffrement au premier démarrage&lt;/a&gt; : Au premier démarrage, une phrase de chiffrement par défaut est demandée à l'utilisateur, en anglais, avec un clavier qwerty. Il nous semblerait plus accessible de demander à l'utilisateur de choisir sa phrase de déchiffrement au premier démarrage, une fois qu'il a choisi sa langue et son clavier.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.puri.sm/Librem5/OS-issues"&gt;Librem5&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/OS-issues/-/issues/265"&gt;Internationalisation de l'écran de déchiffrement du disque&lt;/a&gt; : L'écran de déchiffrement du disque est en anglais, avec un clavier virtuel en qwerty.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/"&gt;Phosh&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/-/issues/784"&gt;Garder l'horloge affichée lorsque le menu du haut est ouvert&lt;/a&gt; : L'horloge est masquée lorsque le menu du haut est ouvert. Le correctif est développé mais pas encore déployé.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/"&gt;Phosh&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/-/issues/783"&gt;Activer ou non la géolocalisation depuis le menu du haut&lt;/a&gt; : Dans le menu du haut on peut activer ou désactiver le Wifi ou le Bluetooth, mais pas la géolocalisation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Paillettes&lt;/h1&gt;
&lt;p&gt;Dans cette catégorie nous listons toutes les autres choses que nous avons rencontrées, il s'agit surtout de petites améliorations d'interface et quelques fonctionnalités qui permettraient par exemple un usage hors-ligne.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://source.puri.sm/Librem5/chatty/"&gt;SMS&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/chatty/-/issues/698"&gt;Glisser pour retourner à la liste des messages&lt;/a&gt; : Lorsqu'un message est affiché, glisser vers la gauche devrait ramener à la liste des messages.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/geary/"&gt;Emails&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/geary/-/issues/1377"&gt;Glisser pour retourne à la liste des messages&lt;/a&gt; : Lorsqu'un email est affiché, glisser vers la gauche devrait ramener à la liste des messages.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-calendar"&gt;Agenda&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/702"&gt;Glisser pour naviguer entre les mois ou les semaines&lt;/a&gt; : Glisser nous semble plus adapté aux interfaces mobiles que les flèches actuellement présentes.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-calendar"&gt;Agenda&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/838"&gt;Indicateur visuel de sélection&lt;/a&gt; : Lorsque l'on sélectionne une période, on n'a aucun indicateur visuel de ce qui est sélectionné avant d'avoir terminé la sélection.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-calendar"&gt;Agenda&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/670"&gt;Interface mobile&lt;/a&gt; : Agenda ne s'affiche pas trop mal sur mobile, mais certains détails manquent. Par exemple, les infobulles peuvent être plus larges que l'écran.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks"&gt;Horloges&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks/-/issues/238"&gt;Widget de montre analogique&lt;/a&gt; : Taper à multiple reprises pour changer les minutes ou les heures n'est pas pratique. Afficher un cadran d'horloge analogique permettrait de faire la même chose en tapant seulement deux fois sur l'écran.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-disk-utility"&gt;Disques&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-disk-utility/-/issues/251"&gt;Interface mobile&lt;/a&gt; : Le menu de chiffrement n'est pas adapté aux mobiles, mais l'application reste utilisable.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dialect-app/dialect/"&gt;Traductions&lt;/a&gt; - &lt;a href="https://github.com/dialect-app/dialect/issues/254"&gt;Mauvaises performances au démarrage&lt;/a&gt; : L'application met plusieurs secondes à se lancer.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dialect-app/dialect/"&gt;Traductions&lt;/a&gt; - &lt;a href="https://github.com/dialect-app/dialect/issues/255"&gt;Impossible de fermer la fenêtre de préférences&lt;/a&gt; : Il manque un bouton pour fermer la fenêtre.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dialect-app/dialect/"&gt;Traductions&lt;/a&gt; - &lt;a href="https://github.com/dialect-app/dialect/issues/211"&gt;Traductions hors-ligne&lt;/a&gt; : Parce que nous ne sommes pas toujours connectés.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/"&gt;Cartes&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/-/issues/1"&gt;Cartes hors-ligne&lt;/a&gt; : Pour économiser des données, il serait intéressant de pré-télécharger les cartes, sur une connexion Wifi par exemple.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-dictionary"&gt;Dictionnaire&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-dictionary/-/issues/15"&gt;Dictionaire hors ligne&lt;/a&gt; : Pour le moment une connection internet est nécessaire pour les traductions.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/evince/"&gt;Evince&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/evince/-/issues/1256"&gt;Passer automatiquement en mode nocturne&lt;/a&gt; : Evince permet de manuellement inverser les couleurs. Il serait pratique que le système fasse ça automatiquement en fonction du mode nocturne.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps"&gt;Cartes&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/-/issues/452"&gt;Taper deux fois pour zoomer&lt;/a&gt; : Sur bureau un double clic permet de zoomer. Taper deux fois sur la carte devrait le permettre aussi.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard"&gt;Clavier virtuel&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/-/merge_requests/552"&gt;Support de la disposition Bépo&lt;/a&gt; : Cela concerne une niche, mais nous adorerions voir arriver le support de la disposition Bépo.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/geary"&gt;Mails&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/geary/-/issues/1196"&gt;La bannière d'affichage des images ne s'adapte pas aux écrans mobiles&lt;/a&gt; : La bannière d'affichage des images n'est pas adaptée aux écrans mobiles.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/epiphany"&gt;Navigateur Web&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/epiphany/-/issues/1801"&gt;La bannière d'enregistrement des mots de passe ne s'adapte pas aux écrans mobiles&lt;/a&gt; : La bannière d'enregistrement des mots de passe n'est pas adaptée aux écrans mobiles.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/deja-dup"&gt;Sauvegardes&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/deja-dup/-/issues/310"&gt;Interface mobile&lt;/a&gt; : L'écran d'accueil n'est pas adapté aux mobiles.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.puri.sm/Librem5/OS-issues"&gt;Librem5&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/OS-issues/-/issues/138"&gt;Compteur d'utilisation des données mobiles&lt;/a&gt; : Cela s'avérerait pratique pour les gens qui ont souscrit à des forfaits mobiles aux données limitées.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lakoliu/Furtherance"&gt;Furtherance&lt;/a&gt; - &lt;a href="https://github.com/lakoliu/Furtherance/issues/52"&gt;La page d'accueil n'est pas assez adaptées aux écrans mobiles&lt;/a&gt; : La traduction française de l'application pose des soucis d'affichage sur mobile.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-notes/"&gt;Notes&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-notes/-/issues/134"&gt;Interface mobile&lt;/a&gt; : Notes n'est utilisable que sur le bureau.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-control-center"&gt;Paramètres&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/231#note_1469421"&gt;La fenêtre Bluetooth n'est pas assez adaptée aux écrans mobiles&lt;/a&gt; : Comme d'habitude, les traduction françaises des applications font déborder le contenu de l'écran.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel libre"/><category term="foss"/><category term="gnome"/><category term="linux"/><category term="logiciel libre"/><category term="purism"/><category term="librem5"/></entry><entry><title>Purism Librem 5 software review : our list to Santa</title><link href="https://yaal.coop/blog/en/purism-librem5-software-santas-list" rel="alternate"/><published>2022-06-02T00:00:00+02:00</published><updated>2022-06-02T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2022-06-02:/blog/en/purism-librem5-software-santas-list</id><summary type="html">&lt;p&gt;We tested the Purism Librem5 phone with fresh eyes, and listed what is missing before we can use the phone as a daily driver.&lt;/p&gt;</summary><content type="html">&lt;p&gt;After several years of waiting, we just received our &lt;a href="https://puri.sm/products/librem-5/"&gt;Librem 5 phone&lt;/a&gt; from Purism.
The Librem 5 phone is a privacy-oriented phone which notable features are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it uses &lt;a href="https://pureos.net"&gt;PureOS&lt;/a&gt;, a GNU/Linux distribution based on Debian, instead of Android or iOS;&lt;/li&gt;
&lt;li&gt;the interface is based on &lt;a href="https://gnome.org"&gt;GNOME&lt;/a&gt; with a few modifications;&lt;/li&gt;
&lt;li&gt;it has kill switches to physically disable wifi, bluetooth, cellular data, camera and microphone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Running a Linux on a cellular phone enables new uses, especially for tech savvy, but it comes with its lot of drawbacks.
The main notable ones is that Linux phones is a brand new field, and a lot of apps are simply 'not ready'.
Either because their UI is not adaptive, because they have not been adapted to mobile user interactions (swiping and other gestures), or just because they have not been tested enough by users, so some actions feels convoluted.&lt;/p&gt;
&lt;p&gt;FOSS developers do their best, and a whole lot of great work has been done so far.
However we are not yet at a point where Linux phones can be put in the hands of a larger audience.
With our fresh eyes of new Linux mobile users, we want to list here the main things that we felt were really missing to provide a good user experience (at least for our biased geeky use).
We focused on &lt;a href="https://apps.gnome.org/"&gt;GNOME Core and Circle apps&lt;/a&gt;, and mobile/Librem5 specific apps developed by Purism.
What we expect from a phone is to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;place calls&lt;/li&gt;
&lt;li&gt;receive and send SMS&lt;/li&gt;
&lt;li&gt;receive and send emails&lt;/li&gt;
&lt;li&gt;be used as an alarm clock&lt;/li&gt;
&lt;li&gt;manage contacts&lt;/li&gt;
&lt;li&gt;manage tasks&lt;/li&gt;
&lt;li&gt;be used as a geolocation navigation device&lt;/li&gt;
&lt;li&gt;browse the internet&lt;/li&gt;
&lt;li&gt;play music&lt;/li&gt;
&lt;li&gt;take photos&lt;/li&gt;
&lt;li&gt;take notes&lt;/li&gt;
&lt;li&gt;display documents&lt;/li&gt;
&lt;li&gt;share internet connection&lt;/li&gt;
&lt;li&gt;be used as a torchlight&lt;/li&gt;
&lt;li&gt;discuss with people&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As patching has even more value than reporting, this list could be used by us (or you?) as a to-do list for some day if we get bored.&lt;/p&gt;
&lt;p&gt;We have tested the phone running &lt;a href="https://pureos.net/"&gt;PureOS byzantium&lt;/a&gt;, and we updated all the apps through &lt;a href="https://flathub.org"&gt;Flatpak&lt;/a&gt; when possible so we could get the latest GNOME 42 fixes.&lt;/p&gt;
&lt;h1&gt;Blockers&lt;/h1&gt;
&lt;p&gt;In this category we put the issues we feel are very discouraging for a daily use.
This mainly concerns UX friction and stress, and missing or broken features.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/"&gt;Squeekboard&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/-/issues/93"&gt;Alternate characters popovers&lt;/a&gt;: We Europeans use a lot of diacritics, the keyboard should offer us a way easily write any common accentuated character.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.puri.sm/Librem5/OS-issues/"&gt;Librem5&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/OS-issues/-/issues/84"&gt;Translation have to be forced&lt;/a&gt;: At first launch, the welcome panel asks the user for their language, but this action is uneffective and the system is displayed in English after that. This is easy to fix with a command-line, but surprising for a first-launch.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks"&gt;Clocks&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks/-/issues/1"&gt;Alarms should ring even when the application is not launched&lt;/a&gt;: If an alarm has been set, it should ring on time, no matter what. Having to launch the application to get the alarm ring is unexpected.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks"&gt;Clocks&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks/-/issues/100"&gt;Alarms should wake the system up&lt;/a&gt;: If an alarm has been set, it should ring on time, no matter what. Alarms should wake the system up if needed.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks"&gt;Clocks&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks/-/issues/10"&gt;Custom alarm sound&lt;/a&gt;: At the moment, the only alarm sound is the default one.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks"&gt;Clocks&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks/-/issues/160"&gt;Interact with an alarm from the lock screen&lt;/a&gt;: Currently it is needed to enter the PIN code before we can stop the alarms. When you wake up, this is harsh.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/"&gt;Squeekboard&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/-/issues/282"&gt;Input indicator&lt;/a&gt;: When a key is tapped, users should have a visual indication of which key is actually pressed.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.puri.sm/Librem5/linux"&gt;Librem5&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/linux/-/issues/387"&gt;Night light support&lt;/a&gt;: GNOME provide a night light feature that reddish the screen automatically depending on the hour. It seems there are some kernel thing to do to enable this. Without this, watching to the screen at night just kill your eyes.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/calls/"&gt;Calls&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/calls/-/issues/456"&gt;Alphabet side bar&lt;/a&gt;: The application lacks an alphabet side bar to quickly jump to some letters in the contact list. With thousands of contacts this would become more than useful.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-contacts"&gt;Contacts&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-contacts/-/issues/246"&gt;Alphabet side bar&lt;/a&gt;: The application lacks an alphabet side bar to quickly jump to some letters in the contact list. With thousands of contacts this would become more than useful.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-todo/"&gt;To-Do&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-todo/-/issues/274"&gt;Adaptive UI&lt;/a&gt;: The UI is not adaptive at the moment, so To-Do is not usable.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-weather/"&gt;Weather&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-weather/-/issues/236"&gt;Adaptive UI&lt;/a&gt;: The application is not adapted to mobile UI.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/fractal/"&gt;Fractal&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/fractal/-/issues/717"&gt;End-to-end encryption&lt;/a&gt;: At Yaal Coop we encrypt our conversations, so E2EE in Fractal is a blocker to us.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/"&gt;Maps&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/-/issues/264"&gt;Adaptive UI&lt;/a&gt;: The side-menu is not usable on a Librem 5 at this point.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/"&gt;Maps&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/-/issues/335"&gt;Navigation view&lt;/a&gt;: The application can calculate itineraries, but do not provide anything to follow the itineraries. Is is not usable in a car yet.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/"&gt;Maps&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/-/issues/2"&gt;Long-press to open the contextual menu&lt;/a&gt;: Some actions are only accessible via right click on desktop, so on mobile they just cannot be done. A long press on the map should have the same effect as a right click.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-online-accounts/"&gt;Online Accounts&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-online-accounts/-/issues/1"&gt;CarDAV &amp;amp; CalDAV provider support&lt;/a&gt;: This would allow to plug any contact, calendar and todo list provider to the system.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/mobile-broadband-provider-info"&gt;mobile-broadband-provider-info&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/mobile-broadband-provider-info/-/merge_requests/38"&gt;TeleCoop support&lt;/a&gt;: This allows to use data with &lt;a href="https://telecoop.fr/"&gt;TeleCoop&lt;/a&gt;. The patch is applied but not yet deployed.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-software"&gt;Software&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1472"&gt;UI is sluggish&lt;/a&gt;: When Flatpak in enabled, any actions takes decades to achieve, to the point that it is sometimes needed to restart the app.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/kop316/vvmplayer"&gt;Voicemail&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/OS-issues/-/issues/267"&gt;There is no working voicemail app at the moment&lt;/a&gt;: Having the ability to easily listen to voicemails is a must-have on a 2022 phone.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Comfort&lt;/h1&gt;
&lt;p&gt;In this category we put the issues that would improve our comfort.
This mainly concern mobile UX improvements.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/"&gt;Phosh&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/-/issues/9"&gt;Automatic light and dark theme switch&lt;/a&gt;: Along with the screen warmness adaptation, switching from a light to a dark theme when the night comes is a bliss for the eyes. This is achievable with GNOME Shell with the &lt;a href="https://extensions.gnome.org/extension/2236/night-theme-switcher/"&gt;Night Theme Switcher&lt;/a&gt; extension for instance.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/"&gt;Phosh&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/-/merge_requests/934"&gt;Swipe to open and close the menu&lt;/a&gt;: As of today, the application menu and the top menu can only be opened by tapping. However swiping to open the menu feels more natural on mobile. This have been implemented but not yet deployed.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/"&gt;Phosh&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/-/issues/397"&gt;Automatically unlock the keyring&lt;/a&gt;: When opening a new session with a PIN, it is then asked a second time to unlock the GNOME keyring. This feels redundant.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/"&gt;Phosh&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/-/issues/525"&gt;Hold the volume buttons to change volume&lt;/a&gt;: Currently, we have to press the buttons multiple times in order to change the volume.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.puri.sm/Librem5/OS-issues"&gt;Librem5&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/OS-issues/-/issues/265"&gt;Ask the encryption passphrase at first boot&lt;/a&gt;: At first boot, a (default) passphrase is asked to decrypt the disk, in English, with a qwerty keyboard. It would be friendlier to not ask it a the first boot and let the user choose it.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.puri.sm/Librem5/OS-issues"&gt;Librem5&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/OS-issues/-/issues/265"&gt;Disk decryption screen l10n&lt;/a&gt;: The disk decryption screen is in English, with a qwerty keyboard, so it is not adapted to other languages.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/"&gt;Phosh&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/-/issues/784"&gt;Keep the time displayed when the top menu is opened&lt;/a&gt;: The time is hidden when the top menu is opened. Time is still an interesting information to display when the menu is opened, and without this the top bar appears strangely empty. This seems to be fixed but not yet deployed.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/"&gt;Phosh&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/phosh/-/issues/783"&gt;Toggle geolocation from the top menu&lt;/a&gt;: In the top menu there are button to toggle wifi or bluetooth, but not to toggle geolocation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Sparkles&lt;/h1&gt;
&lt;p&gt;In this category we put everything else that we met during our test, from nice-to-have features to slight mobile UX improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://source.puri.sm/Librem5/chatty/"&gt;Chatty&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/chatty/-/issues/698"&gt;Swipe to return to the message list&lt;/a&gt;: When a message is displayed, there is an arrow button that allows to go back to the message list, but the more natural action on mobile would be to swipe left.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/geary/"&gt;Geary&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/geary/-/issues/1377"&gt;Swipe to return to the message list&lt;/a&gt;: When a message is displayed, there is an arrow button that allows to go back to the message list, but the more natural action on mobile would be to swipe left.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-calendar"&gt;Calendar&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/702"&gt;Swipe to navigate between weeks or months&lt;/a&gt;: Swipe would be more adapted to mobile screens than the current arrows.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-calendar"&gt;Calendar&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/838"&gt;Selection visual indicator&lt;/a&gt;: During a selection on touchscreen, users have no feedback until their finger is released.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-calendar"&gt;Calendar&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/670"&gt;Adaptive UI&lt;/a&gt;: Calendar displays good enough on mobile, but some details are missing. For instance, the tooltips can be larger than the screen.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks"&gt;Clocks&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-clocks/-/issues/238"&gt;Analog watch widget&lt;/a&gt;: Tapping multiple times on the screen to select hours and minutes is cumbersome. An analog watch widget could achieve the action in on two taps.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-disk-utility"&gt;Disks&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-disk-utility/-/issues/251"&gt;Adaptive UI&lt;/a&gt;: The encryption menu is not adaptive, but this is still usable.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dialect-app/dialect/"&gt;Dialect&lt;/a&gt; - &lt;a href="https://github.com/dialect-app/dialect/issues/254"&gt;Slow performances at startup&lt;/a&gt;: The applications takes several seconds to start.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dialect-app/dialect/"&gt;Dialect&lt;/a&gt; - &lt;a href="https://github.com/dialect-app/dialect/issues/255"&gt;Cannot close the preferences dialog&lt;/a&gt;: It has a close button on GNOME Shell, but not on phosh.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dialect-app/dialect/"&gt;Dialect&lt;/a&gt; - &lt;a href="https://github.com/dialect-app/dialect/issues/211"&gt;Offline translations&lt;/a&gt;: Because we are not always connected.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/"&gt;Maps&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/-/issues/1"&gt;Offline maps&lt;/a&gt;: To save mobile data, it would be better to pre-download maps and routes on a Wifi connection for instance.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-dictionary"&gt;Dictionary&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-dictionary/-/issues/15"&gt;Offline dictionary&lt;/a&gt;: Currently, an internet connection is needed to use the app.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/evince/"&gt;Evince&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/evince/-/issues/1256"&gt;Automatically switch to night mode&lt;/a&gt;: Evince allows to manually invert the background color at night. This should be done automatically depending on the system dark mode.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps"&gt;Maps&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-maps/-/issues/452"&gt;Double-tap to zoom&lt;/a&gt;: On desktop double-clicking zooms, as should do double-tapping on touchscreen.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard"&gt;Squeekboard&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/Phosh/squeekboard/-/merge_requests/552"&gt;Bépo support&lt;/a&gt;: This one does only concerns a few nerds, but bépo (a French dvorak layout) support would be awesome.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/geary"&gt;Geary&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/geary/-/issues/1196"&gt;Image banner is not adaptive&lt;/a&gt;: The image display banner does not display well on mobile.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/epiphany"&gt;Web&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/epiphany/-/issues/1801"&gt;Password banner is not adaptive&lt;/a&gt;: The password banner does not display well on mobile.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/World/deja-dup"&gt;Backups&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/World/deja-dup/-/issues/310"&gt;Adaptive UI&lt;/a&gt;: The home screen does not display well on mobile.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.puri.sm/Librem5/OS-issues"&gt;Librem5&lt;/a&gt; - &lt;a href="https://source.puri.sm/Librem5/OS-issues/-/issues/138"&gt;Mobile data traffic counter&lt;/a&gt;: This would be a useful utility when data is limited.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lakoliu/Furtherance"&gt;Furtherance&lt;/a&gt; - &lt;a href="https://github.com/lakoliu/Furtherance/issues/52"&gt;Home screen is not adaptive enough&lt;/a&gt;: The French translation of the application provokes UX adaptivity issues.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-notes/"&gt;Notes&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-notes/-/issues/134"&gt;Adaptive UI&lt;/a&gt;: Notes is not yet adaptive.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.gnome.org/GNOME/gnome-control-center"&gt;Settings&lt;/a&gt; - &lt;a href="https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/231#note_1469421"&gt;Bluetooth screen is not adaptive enough&lt;/a&gt;: As usual, some French content makes the panel too large.&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="gnome"/><category term="linux"/><category term="purism"/><category term="librem5"/></entry><entry><title>Dernières contributions à des logiciels libres par l'équipe Yaal Coop (début 2022)</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-debut-2022" rel="alternate"/><published>2022-05-12T00:00:00+02:00</published><updated>2022-05-12T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2022-05-12:/blog/dernieres-contributions-logiciels-libres-debut-2022</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop début 2022.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ces derniers mois nous avons principalement contribué à &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;, le serveur d'identité que nous développons,
ainsi que le menu d'autocomplétion &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt; et le greffon
&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt; qui permet à nextcloud de se connecter à des serveurs d'identité.&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion de formulaires web&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/721"&gt;Les champs de date peuvent manipuler plusieurs formats de date différents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/722"&gt;Fin du support de python 3.6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Serveur OpenID Connect simpliste, basé sur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/30"&gt;Délai d'expiration pour les liens d'invitation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/31"&gt;Les utilisateurs invités peuvent choisir leur identifiant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/33"&gt;Correction au lancement de la démo sur debian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/34"&gt;Le nom de famille est nécessaire à l'inscription pour les inetOrgPerson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/35"&gt;Début de séparation de la partie LDAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/36"&gt;Orthographe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/37"&gt;Augmentation de la longueur maximale des identifiants des jetons d'accès&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/38"&gt;Les jetons d'accès sont des JWT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/39"&gt;Correction graphique sur le menu administrateur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/40"&gt;Correction d'une faute de frappe dans la configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/41"&gt;Correction d'une erreur sur les groupes dans les invitations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/42"&gt;Correction de problèmes d'empaquetage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/43"&gt;Correction d'une erreur sur les utilisateurs sans nom de famille&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/45"&gt;Dockerisation de la démo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/46"&gt;Ajout d'une option pour désactiver la réinitialisation de mot de passe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/47"&gt;Ajout d'une option pour désactiver l'édition de profil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/48"&gt;Support d'authlib 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/49"&gt;Instructions pour la génération des catalogues de traduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/50"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/Pylons/webtest"&gt;webtest&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque de tests unitaires pour applications web&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Pylons/webtest/pull/241"&gt;Fin du support pour python 3.6, début du support pour python 3.10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Pylons/webtest/pull/242"&gt;Support des balises HTML 'input', de type 'file', avec l'attribut 'multiple'&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/nextcloud/server"&gt;nextcloud&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Logiciel de partage et de synchronisation de fichiers&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nextcloud/server/issues/31301"&gt;Rapport de bug sur les partages fédérés&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Plugin OpenID Connect pour nextcloud&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/150"&gt;Formattage du code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/159"&gt;Authentification avec les jetons utilisateurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/160"&gt;Authentification par mot de passe sur les vieilles routes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/161"&gt;De meilleurs messages d'erreur en cas de problème&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/165"&gt;Support des avatars&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/ansible/ansible"&gt;ansible&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Outil d'automatisation des déploiements&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ansible/ansible/pull/76378"&gt;Créations et suppressions de chaînes par le module iptables&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Composant svelte de suggestion d'éléments dans une liste déroulante&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/127"&gt;Arrêter de nettoyer les requêtes localement lorsqu'elle doivent être traîtées à distance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/147"&gt;Paramètre maxItemsToShowInList pour la fonction searchFunc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/156"&gt;Ajout de tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/157"&gt;Réparation du comportement async&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/158"&gt;Correction d'un bug lors du rechargement des pages sur le site de démo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/162"&gt;Refonte graphique du site de démo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/163/"&gt;Encarts d'en-tête et de pied du menu déroulant personalisables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/164"&gt;Correction d'un bug à l'initialisation avec une valeur pour le champ de saisie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/165/"&gt;Correction concernant l'affichage de la croix de nettoyage de la saisie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/166"&gt;Nettoyage des tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/168"&gt;Réorganisation des items par glisser-déposer en mode sélection multiple&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/migraf/fhir-kindling"&gt;fhir-kindling&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Brique de connexion à des serveurs de ressources FHIR&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/migraf/fhir-kindling/pull/51"&gt;Documentation de la classe QueryResponse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/migraf/fhir-kindling/pull/61"&gt;Suppression d'un print inutile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/migraf/fhir-kindling/pull/63"&gt;Correction d'un warning en python 3.10&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://www.debian.org/"&gt;Debian&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Coloration syntaxique de code source dans le manuel &lt;a href="https://www.debian.org/doc/debian-policy/index.html"&gt;Debian Policy&lt;/a&gt; : &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=999566"&gt;signalement incluant le .diff à appliquer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel Libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Last FOSS contributions from the Yaal Coop team (winter 2022)</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-debut-2022" rel="alternate"/><published>2022-05-12T00:00:00+02:00</published><updated>2022-05-12T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2022-05-12:/blog/en/dernieres-contributions-logiciels-libres-debut-2022</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during winter 2022.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Those last months we mainly worked on &lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;, our identity server,
as well as the autocompletion menu &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt; and
&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt; that allows nextcloud to connect to identity servers.&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;A flexible forms validation and rendering library for Python.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/721"&gt;Date related field can handle several formats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/722"&gt;Stop support python 3.6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simplistic OpenID Connect provider over OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/30"&gt;invitations expire after 48h&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/31"&gt;Invited users can choose their uid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/33"&gt;find slapadd and ldapadd binaries on debian 11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/34"&gt;surname is required when the user is created or updated&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/35"&gt;start the separation of the ldap parts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/36"&gt;Spellcheck a word in french translatio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/37"&gt;AuthorizationCode and Token have a new id parameter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/38"&gt;JWT access token&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/39"&gt;Fix: better consistency of admin dropdown menu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/40"&gt;Fix: spellcheck configuration key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/41"&gt;fix: groups are saved even when invited user does not have read permission on groups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/42"&gt;Fixed some packaging issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/43"&gt;fix cn/dn when user has no given name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/45"&gt;make demo entirely runnable with docker-compose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/46"&gt;Added an option to disable password recovery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/47"&gt;Added an option to disable self edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/48"&gt;authlib 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/49"&gt;Generate mo files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/50"&gt;more documentation to help contributors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/Pylons/webtest"&gt;webtest&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Wraps any WSGI application and makes it easy to send test requests to that application, without starting up an HTTP server.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Pylons/webtest/pull/241"&gt;stop python3.6 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Pylons/webtest/pull/242"&gt;Support for multiple file input&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/nextcloud/server"&gt;nextcloud&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Nextcloud server, a safe home for all your data&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nextcloud/server/issues/31301"&gt;Bug report: Accept/reject remote share action from "pending shares" view does not work&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Nextcloud login via a single OpenID Connect 1.0 provider&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/150"&gt;Use php-cs-fixer to format the code style&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/159"&gt;webdav Basic auth: login with user token&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/160"&gt;webdav endpoint v1 BasicAuthentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/161"&gt;BasicAuth: Raise an exception when the token is null or invalid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/165"&gt;Update user avatars on login&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/ansible/ansible"&gt;ansible&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;simple IT automation platform&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ansible/ansible/pull/76378"&gt;iptables: chains creation and deletion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simple Autocomplete / typeahead component for Svelte&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/127"&gt;skip client side input text filtering when request are done serverside&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/147"&gt;Pass maxItemsToShowInList to searchFunc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/156"&gt;Unit tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/157"&gt;Fixed async behavior&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/158"&gt;user HTML anchors to keep the demo tabs on reloading&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/162"&gt;demo: use bulma messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/163/"&gt;Added dropdown header and footer slots&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/164"&gt;Initialization with the 'text' parameter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/165/"&gt;Fixed multiple selection clear cross&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/166"&gt;Cleaned up directories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/168"&gt;multiple selection reordering with drag and drop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/migraf/fhir-kindling"&gt;fhir-kindling&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;FHIR resource and synthetic data set creation and management tool&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/migraf/fhir-kindling/pull/51"&gt;Document QueryResponse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/migraf/fhir-kindling/pull/61"&gt;removed a loud 'print'&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/migraf/fhir-kindling/pull/63"&gt;Fixed a python warning&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://www.debian.org/"&gt;Debian&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.debian.org/doc/debian-policy/index.html"&gt;Debian Policy&lt;/a&gt; syntax highlighting : &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=999566"&gt;bug report indication which patch to apply&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Visite aux JDLL 2022</title><link href="https://yaal.coop/blog/jdll-de-lyon" rel="alternate"/><published>2022-04-11T00:00:00+02:00</published><updated>2022-04-11T00:00:00+02:00</updated><author><name>Stéphane Blondon &lt;stephane@yaal.coop&gt;</name></author><id>tag:yaal.coop,2022-04-11:/blog/jdll-de-lyon</id><summary type="html">&lt;p&gt;Un (bref) résumé des Journées Du Logiciel Libre 2022 de Lyon&lt;/p&gt;</summary><content type="html">&lt;p&gt;Les 2 et 3 avril 2022, plusieurs associé·es de Yaal Coop étaient présents aux 23ièmes &lt;a href="https://www.jdll.org/"&gt;Journées du Logiciel Libre&lt;/a&gt; qui se déroulaient à Lyon. C'était l'occasion d'approfondir des sujets qui nous intéressaient, de faire quelques découvertes ainsi que de rencontrer des acteur·ices du Libre en personne.&lt;/p&gt;
&lt;p&gt;Comme nous construisons un service d'hébergement nommé &lt;a href="https://nubla.fr/"&gt;nubla&lt;/a&gt;, assister aux présentations sur le collectif des &lt;a href="https://www.chatons.org/"&gt;CHATONS&lt;/a&gt; (Collectif des Hébergeurs Alternatifs, Transparents, Ouverts, Neutres et Solidaires) et sur &lt;a href="https://zourit.net/"&gt;zourit&lt;/a&gt; ont été un moyen pour nous de confirmer (ou d'infirmer) nos choix sur le fonctionnement du service. Découvrir cette communauté donne du coeur à l'ouvrage !&lt;/p&gt;
&lt;p&gt;Cela fait aussi plaisir de constater l'intérêt pour le mouvement coopératif, comme ce fut le cas lors des discussions animées de la session d'échange "Gouvernance du libre/Gouvernance des coopératives : quels points communs ?". Tout un programme... Qui nous conforte dans notre choix de &lt;a href="https://yaal.coop/blog/de-yaal-a-yaal-coop"&gt;transformer Yaal en SCIC&lt;/a&gt; fin 2020. Un choix loin d'être unique comme l'a encore démontrée cette discussion organisée par d'autres coopératives du numérique : &lt;a href="https://hashbang.fr/"&gt;Hashbang&lt;/a&gt;, &lt;a href="https://tadaa.fr/"&gt;Tadaa&lt;/a&gt; et &lt;a href="https://www.probesys.com/"&gt;Probesys&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;D'un point de vue moins politique (quoi que...) à Yaal Coop nous avons un usage quotidien de claviers plus ou moins originaux (TypeMatrix, Truly Ergonomic, ErgoDox) et, pour certains, de personnalisations de disposition de clavier &lt;a href="https://bepo.fr"&gt;bépo&lt;/a&gt;. De fait, la présentation sur la fabrication personnalisée de clavier et sur la disposition récente tentant d'avoir une disposition agréable pour écrire en français, en anglais et pour programmer - &lt;a href="https://ergol.org/"&gt;ergoL&lt;/a&gt; -, ont piqué notre curiosité.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tellement de type de claviers dans la zone des associations !" src="/media/blog/articles/jdll-2022-collection-de-claviers.webp" title="Tellement de type de claviers dans la zone des associations !"&gt;&lt;/p&gt;
&lt;p&gt;Cette conférence était l'occasion de parler avec des passionnés mais aussi celle de recroiser et discuter avec des personnes déjà rencontrées lors d'autres conférences (en l'occurence &lt;a href="https://www.debconf.org/"&gt;DebConf&lt;/a&gt; et &lt;a href="https://www.pycon.fr"&gt;PyconFr&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Le village associatif en particulier a été pour nous un lieu d'échanges, notamment avec Framasoft sur les avantages et les différences des formats coopératifs et associatifs.&lt;/p&gt;
&lt;p&gt;Du coup, encore merci à tous les organisateurs et présentatrices, et vivement la prochaine ?&lt;/p&gt;</content><category term="Logiciel libre"/><category term="Logiciel libre"/></entry><entry><title>Retour d'expérience concernant l'usage d'AlpineLinux comme conteneur</title><link href="https://yaal.coop/blog/retour-d-experience-sur-alpine-linux-comme-conteneur" rel="alternate"/><published>2022-02-15T00:00:00+01:00</published><updated>2022-02-15T00:00:00+01:00</updated><author><name>Stéphane Blondon &lt;stephane@yaal.coop&gt;</name></author><id>tag:yaal.coop,2022-02-15:/blog/retour-d-experience-sur-alpine-linux-comme-conteneur</id><summary type="html">&lt;p&gt;La distribution AlpineLinux est célèbre pour la taille minuscule mais ce n'est pas sa seule spécificité. Les autres choix d'AlpineLinux ont eu des effets auxquels nous ne nous attendions pas.&lt;/p&gt;</summary><content type="html">&lt;p&gt;AlpineLinux est une distribution souvent utilisée pour des conteneurs (lxc/lxd, Docker, etc.) car la taille des images d'AlpineLinux est minuscule (seulement 6 Mo !).
C'est un avantage réel, surtout si on a beaucoup de conteneurs. Si cette performance est remarquable, il est cependant nécessaire de prendre en compte l'ensemble des choix réalisés par la distribution.
Sur le &lt;a href="https://www.alpinelinux.org/"&gt;site web&lt;/a&gt;, il est clairement indiqué « Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox. ». Voyons quelles contraintes cela apporte :&lt;/p&gt;
&lt;h1&gt;Les performances de musl&lt;/h1&gt;
&lt;p&gt;AlpineLinux a fait le choix de musl comme bibliothèque C, contrairement à la plupart des distributions Linux qui utilisent la libc GNU. Il peut y avoir des problèmes de compilation ou d'exécution de logiciel qui ont été testées avec la glibc et pas avec musl mais nous n'avons jamais rencontré ce problème.&lt;/p&gt;
&lt;p&gt;À l'exécution, musl est plus &lt;a href="https://andygrove.io/2020/05/why-musl-extremely-slow/"&gt;lente&lt;/a&gt; que la glibc. Par exemple, une compilation de cpython est &lt;a href="https://lists.alpinelinux.org/~alpine/users/%3C6df8863e77b970b466dbfc9a3a5c2bcec3199f48.camel%40aquilenet.fr%3E"&gt;deux fois plus lente&lt;/a&gt; qu'avec la glibc. C'est un problème connu des mainteneurs qui pourrait être résolu dans le futur en changeant d'allocateur mémoire. &lt;a href="https://github.com/microsoft/mimalloc#performance"&gt;Mimalloc&lt;/a&gt; semble être une bonne piste à l'avenir, mais pour l'instant, il faut vivre avec ce niveau de performance.&lt;/p&gt;
&lt;h1&gt;L'environnement espace utilisateur&lt;/h1&gt;
&lt;h2&gt;busybox&lt;/h2&gt;
&lt;p&gt;AlpineLinux utilise &lt;a href="https://www.busybox.net/"&gt;busybox&lt;/a&gt; pour les outils Unix de base. Busybox est un projet éprouvé et utilisé depuis de nombreuses années dans l'embarqué.&lt;/p&gt;
&lt;p&gt;Ce choix permet de minimiser la taille des outils embarqués par Alpine.&lt;/p&gt;
&lt;p&gt;Mais, si le développement de script shell est réalisé sur un système disposant des outils GNU, il est possible qu'il y ait des erreurs lors de son exécution sur un système Alpine car le comportement n'est pas exactement le même : par exemple, il peut manquer des paramètres à certains outils (en particulier lorsque ce sont des extensions GNU à la norme Unix). Dans ce cas, il faut modifier le code ou installer un paquet pour embarquer l'outil GNU que l'on souhaite.&lt;/p&gt;
&lt;h2&gt;systemd&lt;/h2&gt;
&lt;p&gt;AlpineLinux utilise les scripts de démarrage classique Unix (dans &lt;code&gt;/etc/init.d/&lt;/code&gt;) et non systemd. Selon les besoins et préférences de chacun, cela peut être une qualité ou un défaut.&lt;/p&gt;
&lt;h1&gt;Les mises-à-jour&lt;/h1&gt;
&lt;p&gt;Mettre à jour une version mineure d'alpine à l'autre (par exemple de 3.14 à 3.15) est très vite réalisé en quelques minutes. Comparé à la migration d'une version stable de Debian à la suivante, c'est étonnant et confortable puiqu'il n'y a pas de messages bloquants affichant les Changelog de changement incompatible ou des différences de fichiers de configuration entre la version du maitenant et celle du système en cours. L'inconvénient étant que les services peuvent être non fonctionnels ensuite...&lt;/p&gt;
&lt;p&gt;Ce comportement n'est pas forcément un problème si l'usage est celui de conteneurs Docker qui sont supprimés et reconstruits à chaque modification. Dans le cas d'un usage classique avec des mises-à-jour, ça l'est beaucoup plus. L'usage d'instantanés (snapshot) peut permettre de limiter le problème : une fois la mise-à-jour faite, si des problèmes sont présents, il faut restaurer l'instantané fait avant la mise-à-jour puis chercher quel est le problème sur la version mise-à-jour.&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Ces différents défauts ne sont pas forcément rédhibitoires selon l'usage fait d'AlpineLinux (par exemple pour des environnements docker locaux jetables). Il semble cependant important de les prendre en compte et se demander s'ils sont bloquants ou non avant de décider d'utiliser AlpineLinux selon l'usage prévu.&lt;/p&gt;
&lt;p&gt;Après avoir utilisé AlpineLinux pour nos conteneurs lxc, nous avons conclu que l'utilisation de Debian était plus adapté à nos besoins dans ce cadre. Les prochains conteneurs seront donc basé sur Debian et les anciens migrés au fur et à mesure.&lt;/p&gt;</content><category term="Logiciel libre"/><category term="Logiciel Libre"/><category term="Linux"/><category term="Alpine"/></entry><entry><title>Dernières contributions à des logiciels libres par l'équipe Yaal Coop (fin 2021)</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-fin-2021" rel="alternate"/><published>2021-12-17T00:00:00+01:00</published><updated>2021-12-17T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2021-12-17:/blog/dernieres-contributions-logiciels-libres-fin-2021</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop fin 2021.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;&lt;a href="https://github.com/yiisoft/yii2-authclient"&gt;yii2-authclient&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Brique de connexion OpenID Connect, notamment utilisée par &lt;a href="https://www.humhub.com/"&gt;humhub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yiisoft/yii2-authclient/pull/334"&gt;Correctif sur la lecture du champ « aud » des ID tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yiisoft/yii2-authclient/pull/333"&gt;Correctif concernant l'attribut « nonce » dans l'identification&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/mstilkerich/rcmcarddav"&gt;rcmcarddav&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Greffon de synchronisation des contacts CardDAV pour l'interface web de gestion des mails &lt;a href="https://roundcube.net/"&gt;Roundcube&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mstilkerich/rcmcarddav/pull/355"&gt;Traduction française&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Serveur OpenID Connect simpliste, basé sur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/8"&gt;Implémentation d'une commande 'check' qui vérifie la validité du fichier de configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/9"&gt;Fonctionnalité de choix des audiences pour les tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/10"&gt;Correction d'une erreur sur les droits d'introspection des tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/11"&gt;Fonctionnalité de pré-autorisations des clients&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/12"&gt;La commande 'check' vérifie les permissions de l'utilisateur LDAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/13"&gt;Les consentements sont mis à jours lorsqu'un 'scope' OpenID Connect plus large est demandé par une application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/14"&gt;Résolution d'un bug lorsque les groupes contiennent des membres invalides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/15"&gt;Fonctionnalité de thèmes personnalisés&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/16"&gt;Options de configuration pour paramétrer la journalisation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/18"&gt;Liens d'invitation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/19"&gt;Amélioration du nom de l'expéditeur dans les emails sortants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/20"&gt;Refonte du système de permissions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/21"&gt;Échappement des caractères spéciaux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/23"&gt;Option permettant de désactiver l'utilisation d'OpenID Connect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/24"&gt;Canaille reste utilisable si aucun serveur SMTP n'est configuré&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/25"&gt;Meilleures suggestions du champ d'identification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/26"&gt;Configuration d'autres attributs pour identifier les objets du LDAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/27"&gt;Gestion des attributs jpegPhoto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/28"&gt;Variabilisation du contenu des jetons JWT&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion de formulaires web&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/708"&gt;Corrections d'erreurs mineures de style&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/709"&gt;Mise à jour des dépendances de l'environnement de documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/710"&gt;Découpage d'un gros fichier en plusieurs petits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/releases/tag/3.0.0"&gt;Publication de la version 3.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/wtforms/flask-wtf"&gt;flask-wtf&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Intégration de WTForms dans Flask&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/484"&gt;Ménage des fonctionnalités dépréciées&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/releases/tag/v1.0.0"&gt;Publication de la version 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pallets/secure-cookie"&gt;secure-cookie&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;La bibliothèque secure-cookie devrait être utilisée dans Flask à l'avenir.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets/secure-cookie/pull/66"&gt;Création automatique des répertoires de session&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.alpinelinux.org/alpine/aports/"&gt;aports&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Paquets de la distribution Alpine Linux&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/27041"&gt;Création du paquet py3-flask-themer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/27255"&gt;Mise à jour du paquet py3-flask-wtf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/27256"&gt;Mise à jour du paquet py3-wtforms&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/sheraf"&gt;sheraf&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Surcouche objet à ZODB&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/22"&gt;Meilleur affichage en console des attributs de collection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/jumbojett/OpenID-Connect-PHP"&gt;OpenID-Connect-PHP&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque OpenID Connect en PHP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jumbojett/OpenID-Connect-PHP/pull/276"&gt;Correction d'un bug dans la fonction &lt;code&gt;verifyJWTclaims&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jumbojett/OpenID-Connect-PHP/releases/tag/v0.9.3"&gt;Publication de la version 0.9.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jumbojett/OpenID-Connect-PHP/releases/tag/v0.9.4"&gt;Publication de la version 0.9.4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Plugin OpenID Connect pour nextcloud&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/123"&gt;Support des jeton non JWT pour l'authentification WebDAV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/136"&gt;Support de l'authentification DAV par mot de passe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/137"&gt;Mise-à-jour d'OpenID-Connect-PHP en version 0.9.4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/141"&gt;Mise-à-jour d'OpenID-Connect-PHP en version 0.9.5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/python-ldap/python-slapd"&gt;python-slapd&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Interface pythonique pour contrôler un serveur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-ldap/python-slapd/pull/4"&gt;Support de la commande ldapsearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-ldap/python-slapd/pull/5"&gt;Le DN racine a les autorisations pour ajouter des schemas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://pygments.org/"&gt;Pygments&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque Python de coloration syntaxique&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pygments/pygments/pull/1946"&gt;Mise-à-jour du lexeur debian/control&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://www.debian.org/"&gt;Debian&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Mise-à-jour cosmétique des &lt;a href="https://salsa.debian.org/ddp-team/release-notes/-/merge_requests/125"&gt;notes de publication&lt;/a&gt;
et du &lt;a href="https://salsa.debian.org/installer-team/installation-guide/-/merge_requests/16"&gt;guide d'installation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Last FOSS contributions from the Yaal Coop team (fall 2021)</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-fin-2021" rel="alternate"/><published>2021-12-17T00:00:00+01:00</published><updated>2021-12-17T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2021-12-17:/blog/en/dernieres-contributions-logiciels-libres-fin-2021</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during the fall of 2021.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;&lt;a href="https://github.com/yiisoft/yii2-authclient"&gt;yii2-authclient&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Yii 2 authclient extension&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yiisoft/yii2-authclient/pull/334"&gt;OIDC: 'aud' claims can be arrays&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yiisoft/yii2-authclient/pull/333"&gt;Use nonce from the authentication request&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/mstilkerich/rcmcarddav"&gt;rcmcarddav&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;CardDAV plugin for RoundCube Webmailer&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mstilkerich/rcmcarddav/pull/355"&gt;French translations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simplistic OpenID Connect provider over OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/8"&gt;configuration check command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/9"&gt;tokens can have multiple audiences&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/10"&gt;fixed introspection access rights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/11"&gt;Implemented client pre-authorization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/12"&gt;'check' command check ldap permissions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/13"&gt;Updated consents when a larger scope is required&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/14"&gt;Fix bug on groups with non-existent members&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/15"&gt;use flask-themer to allow theme customization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/16"&gt;Logging is configurable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/18"&gt;Invitation links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/19"&gt;Use the 'NAME' configuration parameter in the email sender name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/20"&gt;Permissions overhaul&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/21"&gt;Escape filters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/23"&gt;Option to not use OIDC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/24"&gt;Disabled invitation and password reset when no smtp server has been configured&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/25"&gt;Login placeholder depends on the USER_FILTER configuration attribute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/26"&gt;Added configuration options to tune object IDs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/27"&gt;jpegPhoto management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/28"&gt;customize jwt claims with format string in config file&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;A flexible forms validation and rendering library for Python.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/708"&gt;Fixed some style errors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/709"&gt;updated docs dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/710"&gt;Field files split&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/releases/tag/3.0.0"&gt;Released version 3.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/wtforms/flask-wtf"&gt;flask-wtf&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/pull/484"&gt;1.0 version deprecations removal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/flask-wtf/releases/tag/v1.0.0"&gt;Released version 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pallets/secure-cookie"&gt;secure-cookie&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Secure cookies and sessions for WSGI&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets/secure-cookie/pull/66"&gt;FilesystemSessionStore create directories if they don't exist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.alpinelinux.org/alpine/aports/"&gt;aports&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Alpine packages build scripts&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/27041"&gt;py3-flask-themer package creation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/27255"&gt;py3-flask-wtf package update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/27256"&gt;py3-wtforms package update&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/sheraf"&gt;sheraf&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;A versatile ZODB abstraction layer&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/22"&gt;collections: better repr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/jumbojett/OpenID-Connect-PHP"&gt;OpenID-Connect-PHP&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Minimalist OpenID Connect client&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jumbojett/OpenID-Connect-PHP/pull/276"&gt;&lt;code&gt;verifyJWTclaims&lt;/code&gt;: fixed an exception when &lt;code&gt;$accessToken&lt;/code&gt; is null&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jumbojett/OpenID-Connect-PHP/releases/tag/v0.9.3"&gt;Released version 0.9.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jumbojett/OpenID-Connect-PHP/releases/tag/v0.9.4"&gt;Released version 0.9.4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login"&gt;nextcloud-oidc-login&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Nextcloud login via a single OpenID Connect 1.0 provider&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/123"&gt;Allow WebDAV authentication with non JWT tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/136"&gt;DAV Password authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/137"&gt;Upgraded OpenID-Connect-PHP to version 0.9.4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pulsejet/nextcloud-oidc-login/pull/141"&gt;Bumped to OpenID-Connect-PHP 0.9.5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/python-ldap/python-slapd"&gt;python-slapd&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Controls a slapd process in a pythonic way&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python-ldap/python-slapd/pull/4"&gt;ldapsearch command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-ldap/python-slapd/pull/5"&gt;rootdn can add schemas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://pygments.org/"&gt;Pygments&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Pygments is a generic syntax highlighter written in Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pygments/pygments/pull/1946"&gt;Update debian control&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://www.debian.org/"&gt;Debian&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://salsa.debian.org/ddp-team/release-notes/-/merge_requests/125"&gt;Publication notes&lt;/a&gt;
and &lt;a href="https://salsa.debian.org/installer-team/installation-guide/-/merge_requests/16"&gt;installation guide&lt;/a&gt; updates&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Un disque chiffré et partitionné avec Ubuntu</title><link href="https://yaal.coop/blog/un-disque-chiffre-et-partitionne-avec-ubuntu" rel="alternate"/><published>2021-10-26T00:00:00+02:00</published><updated>2021-10-26T00:00:00+02:00</updated><author><name>Loan Robert &lt;loan@yaal.coop&gt;</name></author><id>tag:yaal.coop,2021-10-26:/blog/un-disque-chiffre-et-partitionne-avec-ubuntu</id><summary type="html">&lt;p&gt;Tutoriel d'installation Ubuntu pour un disque chiffré et partitionné&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ça y est, c'est décidé, vous avez une nouvelle machine, ou bien vous voulez repartir sur des bases propres et vous aimeriez &lt;strong&gt;chiffrer&lt;/strong&gt; votre disque pour protéger vos données.&lt;/p&gt;
&lt;p&gt;Dans votre fougue, vous vous dites qu'il serait également intéressant de séparer l'OS de vos données perso, avoir un /home sur une autre partition car vous savez que cela présente pas mal d'avantages : réinstaller ou changer de système d'exploitation sans perdre vos données, partager ces données entre plusieurs systèmes, les récupérer plus simplement en cas d'incident... &lt;strong&gt;Partitionner&lt;/strong&gt; est une très bonne idée.&lt;/p&gt;
&lt;p&gt;Actuellement, il est facile de chiffrer un disque en faisant une nouvelle installation d'Ubuntu 21.04, il est également facile de partitionner son disque avec une nouvelle installation d'Ubuntu 21.04. L'installeur est assez bon pour faire ces deux choses, mais il reste limité. Si vous voulez faire les deux en même temps à l'installation sur une machine, il va falloir faire ça à la main.&lt;/p&gt;
&lt;p&gt;Pas de panique, vous êtes au bon endroit, cet article va vous donner les étapes à suivre pour installer &lt;strong&gt;Ubuntu 21.04&lt;/strong&gt; (mais également beaucoup de versions &lt;strong&gt;précédentes&lt;/strong&gt; et probablement beaucoup de &lt;strong&gt;futures versions&lt;/strong&gt;) en ayant des partitions, notamment votre /home, sur un disque chiffré.&lt;/p&gt;
&lt;h1&gt;Backup de vos données&lt;/h1&gt;
&lt;p&gt;Tout d'abord, vous voulez protéger tout ce qui fait de votre ordinateur quelque chose d'unique. Vous sauriez le trouver parmi d'autres et il sait vous reconnaître. Vous avez vos habitudes avec lui et il en sait pas mal sur vous, vous aimeriez le retrouver tel quel.&lt;/p&gt;
&lt;p&gt;Bref, il faut &lt;strong&gt;sauvegarder&lt;/strong&gt; vos fichiers personnels, vos identités, vos configurations particulières, noter vos applications préférées...&lt;/p&gt;
&lt;h2&gt;Fichiers&lt;/h2&gt;
&lt;p&gt;Rien de très surprenant ici, votre dossier &lt;code&gt;/home&lt;/code&gt; est probablement un bon endroit pour commencer.&lt;/p&gt;
&lt;p&gt;Faites un &lt;strong&gt;backup&lt;/strong&gt; de tout ce que vous voulez garder quelque part, comme un ssd, une clé usb, ou sur un Nextcloud de chez &lt;a href="https://nubla.io"&gt;Nubla&lt;/a&gt; ☁️ par exemple, un super service de cloud hébergé par une &lt;a href="https://yaal.coop"&gt;petite coopérative Bordelaise sympathique&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mais vous faites probablement déjà tout ça, faire des sauvegardes régulières ou bien synchroniser vos fichiers important quelque part, n'est-ce pas ? Bien sûr que oui, car comme tout le monde, vous êtes prudent et intelligent. Personne ne serait assez étourdi pour ne pas faire de sauvegarde, évidemment.&lt;/p&gt;
&lt;h2&gt;Applications&lt;/h2&gt;
&lt;p&gt;Cette partie dépend de votre façon préférée d'installer des applications. Avec apt, snap, Ubuntu Software Center ? Probablement un peu de tout...&lt;/p&gt;
&lt;h3&gt;Paquets apt&lt;/h3&gt;
&lt;p&gt;Vous pouvez utiliser cette commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;comm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;showmanual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gzip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;installer&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;initial&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s/^Package: //p&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apps_backup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pour générer une liste des paquets qui ont été manuellement installés et les enregistrer sur un fichier &lt;code&gt;apps_backup.txt&lt;/code&gt;. Ce n'est qu'une seule manière de faire, vous pouvez modifier cette commande pour avoir une liste plus exhaustive si vous préférez valider que tout va bien.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;apt-mark showmanual&lt;/code&gt; donne les paquets apt installés manuellement ainsi que ceux installés avec l'installeur d'Ubuntu. On peut récupérer cette liste de paquets d'installation initiale dans le log &lt;code&gt;/var/log/installer/initial-status.gz&lt;/code&gt;. On compare ces deux listes et on ne garde que ce qui reste de la première avec la commande comm pour l'inscrire dans un fichier &lt;code&gt;apps_backup.txt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Vous trouverez beaucoup de commandes similaires sur les internets, trouvez celle qui vous conviendra le mieux, celle-ci a bien fonctionné pour moi. Évidemment, vous devez garder ce fichier en lieu sûr.&lt;/p&gt;
&lt;h3&gt;snap&lt;/h3&gt;
&lt;p&gt;Il est possible que dans certains cas vous ayez eu besoin de snap pour installer certains logiciels. vous pouvez les lister avec :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;snap list
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Malheureusement, je n'ai pas trouvé de de moyens de lister ceux qui ont été installés manuellement, mais vous serez capable de faire le tri, retenez ceux que vous utilisez.&lt;/p&gt;
&lt;h3&gt;Ubuntu Software&lt;/h3&gt;
&lt;p&gt;Vous pouvez aussi lancer Ubuntu Software Center et afficher la liste des applications installées.&lt;/p&gt;
&lt;h2&gt;Fichiers de configuration&lt;/h2&gt;
&lt;p&gt;En tant que personne maline, vous n'avez pas besoin de lire cette partie, car vos fichiers de configuration perso, vos "dotfiles", sont déjà copiés quelque part, probablement partagés et peut-être même versionnés.&lt;/p&gt;
&lt;p&gt;Alors, je vais seulement lister les quelques fichiers importants que j'utilise, juste pour mon futur moi, lui éviter la jobardise et atteindre, qui sait, cet état d'intelligente prudence :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les fichiers .profile ou .bash_profile ou .bash_login... pour les sessions&lt;/li&gt;
&lt;li&gt;.bashrc, .zshrc et/ou autres pour le shell&lt;/li&gt;
&lt;li&gt;les aliases&lt;/li&gt;
&lt;li&gt;.gitconfig et/ou .hgrc pour la config de vos VCS&lt;/li&gt;
&lt;li&gt;la config de votre prompt&lt;/li&gt;
&lt;li&gt;.vimrc pour la config de vim&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Identités&lt;/h2&gt;
&lt;p&gt;À moins que vous ayez envie de recommencer depuis zéro avec vos identifiants, comptes, etc., vous devriez garder précieusement vos configurations ssh (où toutes vos connections serveur sont paramétrées), votre base de donnée pass ou keepass (ou tout autre manager de mot de passe local), vos paires de clés publiques ET privées SSH, GPG et autres..., vos vaults et probablement beaucoup d'autres choses dont comme moi, vous vous souviendrez malheureusement trop tard. Je ne vous le souhaite pas, soyez organisé...&lt;/p&gt;
&lt;h1&gt;Installation d'Ubuntu&lt;/h1&gt;
&lt;p&gt;Vous êtes détendu, frais, tout est en sécurité, alors vous êtes prêt.&lt;/p&gt;
&lt;h2&gt;Lancer Ubuntu&lt;/h2&gt;
&lt;p&gt;Vous avez besoin d'une clé usb bootable, d'au moins 4gb, que vous pouvez créer avec le paquet usb-creator-gtk (ou usb-creator-kde).&lt;/p&gt;
&lt;p&gt;Il faudra ensuite redémarrer votre ordinateur avec la clé usb branchée. Pour booter sur la clé, vous devez lancer le menu de boot normalement en pressant "&lt;em&gt;F12&lt;/em&gt;", mais cela peut changer selon les machines. En général, un message sera affiché sur l'écran de lancement pour vous indiquer quelle touche il faudra enfoncer (pour moi, il s'agissait d'appuyer frénétiquement sur "&lt;em&gt;Enter&lt;/em&gt;" jusqu'à ce qu'un son soit émis...).&lt;/p&gt;
&lt;p&gt;Une fois qu'Ubuntu a été lancé depuis la clé, l'installeur se lance automatiquement. Vous pouvez cliquer sur "&lt;strong&gt;Try Ubuntu&lt;/strong&gt;" ou bien aller un peu en avant dans l'installation de votre Ubuntu ce qui pourra peut-être vous faciliter la suite.&lt;/p&gt;
&lt;p&gt;À titre d'exemple, de mon côté j'ai choisi l'anglais comme langue d'installation et donc la langue d'Ubuntu (principalement pour trouver plus simplement des ressources sur le web) puis sur l'écran suivant, j'ai sélectionné la disposition correspondant à mon clavier (ce qui facilite nos prochaines manipulations). J'ai ensuite quitté l'installateur sans aller plus loin pour pouvoir paramétrer le disque.&lt;/p&gt;
&lt;p&gt;Une fois sur l'interface classique d'Ubuntu (mais lancé depuis la clé), vous pouvez si c'est nécessaire formater votre disque avec l'application gnome disks pour avoir une machine "comme" neuve.&lt;/p&gt;
&lt;h2&gt;Partitionner le disque&lt;/h2&gt;
&lt;p&gt;Nous allons utiliser fdisk depuis le terminal avec "&lt;em&gt;ctrl-alt-t&lt;/em&gt;" (ou bien "&lt;em&gt;super-a&lt;/em&gt;" et rechercher le terminal).&lt;/p&gt;
&lt;p&gt;Pour simplifier le processus et comme la plupart des commandes nécessitent un niveau de permission superuser, il faut entrer :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo -s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ensuite, vous pouvez lister les disques disponibles avec :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;fdisk -l
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le disque en question sera probablement &lt;code&gt;/dev/sda&lt;/code&gt; ou &lt;code&gt;/dev/vda&lt;/code&gt; pour moi c'était plutôt &lt;code&gt;/dev/nvme0n1&lt;/code&gt;. La suite de cette doc suivra les particularités de ma machine.&lt;/p&gt;
&lt;p&gt;Pour &lt;strong&gt;partitionner&lt;/strong&gt; ce disque, entrez :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;fdisk /dev/nvme0n1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Il nous faut une partition &lt;strong&gt;EFI&lt;/strong&gt;, une partition de &lt;strong&gt;boot&lt;/strong&gt;, et une autre partition (celle qui sera &lt;strong&gt;chiffrée&lt;/strong&gt;) qui occupera le reste du disque. Dans fdisk, pour obtenir de l'aide, appuyez sur "&lt;em&gt;m&lt;/em&gt;" et en cas de doute sur les différentes partitions, vous pouvez appuyer sur "&lt;em&gt;q&lt;/em&gt;" pour quitter sans sauvegarder vos modifications.&lt;/p&gt;
&lt;h3&gt;EFI&lt;/h3&gt;
&lt;p&gt;Pour créer la première partition EFI, appuyez sur&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;n
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le prompt va alors vous demander le numéro de la partition, gardez la valeur par défaut en pressant&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;↵
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ensuite, il vous demande quel est le premier secteur à allouer. Par défaut, ce sera le premier qu'il trouve, appuyez donc sur&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;↵
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et enfin le dernier secteur. Cette partition de EFI de nécessite pas de beaucoup de place. Mais suffisant, ce n'est pas assez pour moi, j'ai donc arbitrairement préféré 2G parce que mon disque est assez gros pour supporter un sacrifice de cette valeur. Indiquez dans le prompt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;+2G
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Boot&lt;/h3&gt;
&lt;p&gt;Pour la partition de boot, même procédure, 2G c'est trop, généralement, 512M sont suffisant, mais trop, c'est pas grave aussi :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;n
↵
↵
+2G
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;À chiffrer&lt;/h3&gt;
&lt;p&gt;Enfin pour la dernière partition, même procédure, sauf que l'on veut occuper le reste du disque. Le dernier secteur de cette partition doit donc être le dernier secteur du disque, et ça tombe bien, c'est la valeur par défaut :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;n
↵
↵
↵
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Il faut maintenant sauvegarder toutes ces modifications de la table de partition en pressant&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;w
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Les partitions sont maintenant créées, nous pouvons passer au chiffrement de cette dernière partition nommée &lt;code&gt;nvme0n1p3&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Chiffrer votre partition principale&lt;/h2&gt;
&lt;p&gt;Il est temps de choisir un nom pour votre volume chiffré. Vous pouvez par exemple choisir le nom que vous voulez donner à votre machine. Lors du lancement de votre ordinateur, c'est ce nom qui apparaîtra lorsque vous sera demandé votre mot de passe pour &lt;strong&gt;déchiffrer&lt;/strong&gt; le disque. Ici, pour l'exemple, nous l'appellerons &lt;code&gt;pasvraimentcrypté&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Nous pouvons lancer la procédure de chiffrement avec&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cryptsetup luksFormat /dev/nvme0n1p3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le prompt demandera confirmation en entrant YES ce que nous pouvons faire en toute sérénité. Il demandera ensuite d'entrer la &lt;strong&gt;passphrase&lt;/strong&gt;, ce sera votre clé pour déchiffrer votre disque à chaque démarrage, ne l'oubliez pas !&lt;/p&gt;
&lt;p&gt;Nous avons ensuite besoin d'ouvrir cette partition chiffrée, pour en faire un volume physique et pour y créer un groupe de volume nommé ubuntu et différents volumes logiques. Entrons&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cryptsetup luksOpen /dev/nvme0n1p3 pasvraimentcrypté
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Comme nous ouvrons un volume chiffré, le prompt nous demande la passphrase. Cette commande va créer un nouveau device nommé &lt;code&gt;/dev/mapper/pasvraimentcrypté&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Nous allons ensuite utiliser LVM2 (Logical Volume Manager) pour &lt;strong&gt;partitionner&lt;/strong&gt; ce nouveau device. Dans notre cas, nous voulons une partition &lt;strong&gt;root&lt;/strong&gt; de minimum 8G pour l'OS, une partition &lt;strong&gt;home&lt;/strong&gt; pour l'utilisateur et une partition &lt;strong&gt;swap&lt;/strong&gt; de 8G pour la mémoire. Vous pouvez être imaginatif sur vos partition, vous trouverez beaucoup de ressources et différents avis sur la question de la taille à allouer, mais ce cas suffit à mes besoins.&lt;/p&gt;
&lt;p&gt;Nous allons faire de notre partition déchiffrée un volume physique :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pvcreate /dev/mapper/pasvraimentcrypté
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Puis créer un groupe &lt;em&gt;ubuntu&lt;/em&gt; (ou autre) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;vgcreate ubuntu /dev/mapper/pasvraimentcrypté
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Et enfin les volumes logiques du groupe &lt;em&gt;ubuntu&lt;/em&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;lvcreate -L 64G -n root ubuntu
lvcreate -L 8G -n swap ubuntu
lvcreate -l 100%FREE -n home ubuntu
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nous pouvons maintenant relancer l'installeur. Lorsque celui-ci demandera de choisir le type d'installation, cliquez sur le bouton "&lt;strong&gt;Autre chose&lt;/strong&gt;", ce qui nous permettra d'utiliser les partitions et volumes créés. Configurons les trois volumes logiques :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/dev/mapper/ubuntu-root&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser comme : Ext4 journaling filesystem&lt;/li&gt;
&lt;li&gt;Formater la partition&lt;/li&gt;
&lt;li&gt;Point de montage : &lt;code&gt;/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/dev/mapper/ubuntu-swap&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser comme : Swap area&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/dev/mapper/ubuntu-home&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser comme : Ext4 journaling filesystem&lt;/li&gt;
&lt;li&gt;Formater la partition&lt;/li&gt;
&lt;li&gt;Point de montage : &lt;code&gt;/home&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et pour les devices :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;/dev/nvme0n1p1&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser comme : EFI&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;/dev/nvme0n1p2&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser comme : Ext2 filesystem&lt;/li&gt;
&lt;li&gt;Formater la partition&lt;/li&gt;
&lt;li&gt;Point de montage : &lt;code&gt;/boot&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un petit récapitulatif des changement sera affiché. Nous pouvons poursuivre l'installation d'Ubuntu. Une fois l'installation terminée, choisissez "Continuer à tester", nous devons encore faire un peu de configuration.&lt;/p&gt;
&lt;h2&gt;Instructions de déchiffrement au démarrage&lt;/h2&gt;
&lt;p&gt;Ubuntu est installé sur votre machine. Il nous faut maintenant décrire quel device doit être &lt;strong&gt;déchiffré au démarrage et comment&lt;/strong&gt;. Nous avons donc besoin d'éditer la crypttab pour donner ces instructions. Pour que tout cela soit pris en compte, il nous faut reconstruire initramfs qui gère le répertoire racine temporaire pendant le démarrage du système. Enfin, cette reconstruction ne peut être réalisée que depuis la nouvelle installation.&lt;/p&gt;
&lt;p&gt;Mais avant tout, il nous faut copier l'&lt;strong&gt;UUID&lt;/strong&gt; du disque chiffré. Ouvrez un nouveau terminal (ou un nouvel onglet) et entrez&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo blkid /dev/nvme0n1p3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;vous pourrez par la suite retourner sur cet onglet, il vous suffira de le mettre en surbrillance pour qu'il soit copié dans le buffer de votre souris (et collé avec le bouton du milieu de votre souris). Vous pouvez aussi utiliser "&lt;em&gt;shift+ctrl+c&lt;/em&gt;" pour copier le texte en surbrillance et "&lt;em&gt;shift+ctrl+v&lt;/em&gt;" pour le coller.&lt;/p&gt;
&lt;h3&gt;Basculer sur la nouvelle installation&lt;/h3&gt;
&lt;p&gt;Nous allons utiliser chroot pour passer dans le nouveau système. Entrez les commandes suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mount /dev/mapper/ubuntu-root /mnt
mount --bind /dev /mnt/dev
chroot /mnt
mount -t proc proc /proc
mount -t sysfs sys /sys
mount -t devpts devpts /dev/pts
mount -a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nous sommes maintenant dans le nouveau système, avec différents devices montés sur différents répertoires.&lt;/p&gt;
&lt;h3&gt;Instructions de démarrage&lt;/h3&gt;
&lt;p&gt;Nous devons créer le fichier &lt;code&gt;/etc/crypttab&lt;/code&gt;. Le fichier doit contenir la ligne suivante, vous pouvez l'éditer avec nano, vi, emacs, bref, votre éditeur préféré et il n'est évidemment pas nécessaire ici de débattre de la supériorité de l'un par rapport aux autres 😘&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pasvraimentcrypté   UUID=e7167ac4-b606-4be0-98a7-ace4e5e13f6b   none    luks,discard
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nous avons donc quatre champs : le nom du device à déchiffrer, son UUID (remplacez-le par celui de votre device chiffré, celui que vous avez copié précédemment, sans guillemets), le mot de passe (à none puisque l'objectif est qu'il vous soit demandé à chaque démarrage) et des options.&lt;/p&gt;
&lt;p&gt;Sauvegardez ce fichier et quittez l'éditeur (pas le terminal).&lt;/p&gt;
&lt;h3&gt;Mettre à jour initramfs&lt;/h3&gt;
&lt;p&gt;Une fois l'éditeur quitté, toujours dans le terminal, il nous suffit de rentrer la commande suivante :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;update-initramfs -k all -u
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nous pouvons maintenant quitter &lt;code&gt;chroot&lt;/code&gt; en tapant&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Depuis notre shell de départ, il nous faut maintenant démonter &lt;code&gt;mnt&lt;/code&gt; avec&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;umount -R /mnt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;Fin&lt;/h1&gt;
&lt;p&gt;Nous pouvons maintenant fermer le shell et &lt;strong&gt;relancer&lt;/strong&gt; la machine. Au démarrage, elle devrait nous demander la &lt;strong&gt;passphrase&lt;/strong&gt; pour déchiffrer le device &lt;code&gt;pasvraimentcrypté&lt;/code&gt; puis Ubuntu se lancera normalement.&lt;/p&gt;
&lt;p&gt;La commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;lsblk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;nous permet d'avoir un visuel sur le résultat de nos différentes manipulations :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;NAME&lt;/span&gt;&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="nl"&gt;MAJ&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;MIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RM&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="k"&gt;SIZE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TYPE&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;MOUNTPOINT&lt;/span&gt;
&lt;span class="n"&gt;nvme0n1&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="mi"&gt;259&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;476&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;disk&lt;/span&gt;
&lt;span class="err"&gt;├─&lt;/span&gt;&lt;span class="n"&gt;nvme0n1p1&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="mi"&gt;259&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;efi&lt;/span&gt;
&lt;span class="err"&gt;├─&lt;/span&gt;&lt;span class="n"&gt;nvme0n1p2&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="mi"&gt;259&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;boot&lt;/span&gt;
&lt;span class="err"&gt;└─&lt;/span&gt;&lt;span class="n"&gt;nvme0n1p3&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="mi"&gt;259&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;472&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;└─&lt;/span&gt;&lt;span class="n"&gt;pasvraimentcrypté&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;253&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;472&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;crypt&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;├─&lt;/span&gt;&lt;span class="n"&gt;ubuntu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="mi"&gt;253&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lvm&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;├─&lt;/span&gt;&lt;span class="n"&gt;ubuntu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;swap&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="mi"&gt;253&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lvm&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SWAP&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;└─&lt;/span&gt;&lt;span class="n"&gt;ubuntu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="mi"&gt;253&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lvm&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On peut résumer cela ainsi :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le disque physique &lt;code&gt;nvme0n1&lt;/code&gt; est divisé en trois partitions physiques : &lt;code&gt;nvme0n1p1&lt;/code&gt;, &lt;code&gt;nvme0n1p2&lt;/code&gt; et &lt;code&gt;nvme0n1p3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;la partition &lt;code&gt;nvme0n1p1&lt;/code&gt; est une partition EFI (nécessaire depuis Ubuntu 20.04) requise par le système d'exploitation&lt;/li&gt;
&lt;li&gt;la partition &lt;code&gt;nvme0n1p2&lt;/code&gt; est la partie &lt;code&gt;/boot&lt;/code&gt; qui permet au système de démarrer&lt;/li&gt;
&lt;li&gt;la partition &lt;code&gt;nvme0n1p3&lt;/code&gt; contient un volume chiffré &lt;code&gt;pasvraimentcrypté&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ce volume chiffré &lt;code&gt;pasvraimentcrypté&lt;/code&gt; que l'on doit déchiffrer au démarrage contient les trois volumes logiques LVM suivants :&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ubuntu-root&lt;/code&gt;, la racine de l'arborescence du système Ubuntu&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ubuntu-swap&lt;/code&gt;, l'extension de mémoire vive&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ubuntu-home&lt;/code&gt;, contenant les dossiers et fichiers personnels des utilisateurs, isolé du reste du système&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ça y est, votre nouvelle vie commence avec votre nouvelle machine super secrète super rangée ! 🥳&lt;/p&gt;</content><category term="Administration système"/><category term="Ubuntu"/><category term="Logiciel libre"/><category term="Linux"/></entry><entry><title>Premier pied dans Yaal, en sabots</title><link href="https://yaal.coop/blog/premier-pied-dans-yaal-en-sabots" rel="alternate"/><published>2021-10-18T00:00:00+02:00</published><updated>2021-10-18T00:00:00+02:00</updated><author><name>Brunélie Lauret &lt;brunelie@yaal.coop&gt;</name></author><id>tag:yaal.coop,2021-10-18:/blog/premier-pied-dans-yaal-en-sabots</id><summary type="html">&lt;p&gt;Création d'identité visuelle, design de produit et création d'une boutique en ligne pour la Brasserie du Sabot.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mars 2020, un moment pas très bien choisi pour tenter de faire des entretiens d'embauche. Pourtant, je vois Yaal en visio d'abord, et j'apprécie beaucoup ce que j'entend pendant cet entretien !&lt;/p&gt;
&lt;p&gt;On garde le contact, on se dit qu'on se verra après le confinement, mais comme les semaines s'étirent, on continue à distance et c'est le premier juillet 2020 et que je suis officiellement embauché⋅e dans Yaal en tant que graphiste webdesigner.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ma première mission ?&lt;/em&gt;
Développer l'identité visuelle du projet tout neuf de quelques associé⋅es de Yaal : &lt;em&gt;Une brasserie&lt;/em&gt; !&lt;/p&gt;
&lt;h1&gt;La Brasserie du Sabot, c'est quoi ?&lt;/h1&gt;
&lt;p&gt;Le projet d'associé⋅es de Yaal. Une brasserie artisanale installée à Villenave d'Ornon, au sud de Bordeaux.&lt;/p&gt;
&lt;p&gt;Un projet coopératif et militant. D'ailleurs, c'est pas pour rien que ça s'appelle le Sabot : Si au premier abord on va penser à l'aspect artisanal de la chaussure en bois d'antan, c'est plutôt du symbole révolutionnaire dont on parle ici. Le sabot qu'on coince dans les rouages de la machine à l'usine en signe de protestation. Le sabotage, quoi !&lt;/p&gt;
&lt;p&gt;Pour moi, en tant que graphiste, ça fait deux grands axes à explorer pour concilier tout le monde :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;L'esthétique de l'engagement, de la contreculture, un truc un peu révolutionnaire. Militantisme, anarchisme, affichage sauvages, tracts syndicaux, pochoirs et graffitis, affiches déchirées, c'est ce genre d'images là que j'ai eu en tête.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L'artisanal. Le bois, le recyclé, le matériau brut, l'écologie. C'est aussi un sujet clé pour les associé⋅es de la brasserie.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Des idées en vrac&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Dessins de départ pour la brasserie" src="/media/blog/articles/dessins-initiaux.webp" title="dessins de départ pour la brasserie"&gt;&lt;/p&gt;
&lt;p&gt;Inspirations de dessin à la ligne claire, mais aussi de découpage de pochoir, puis de gravure.&lt;/p&gt;
&lt;h2&gt;et ça sur des bouteilles, ça donnerait quoi ?&lt;/h2&gt;
&lt;p&gt;Ces pistes, déclinées pleeein de fois sur des formats d'étiquette pour se donner une meilleure idée de ce que ça donne, ci-dessous un petit florilège :&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pistes et essais d'étiquettes" src="/media/blog/articles/design_tests_etiquette.webp" title="pistes et essais d'étiquettes"&gt;&lt;/p&gt;
&lt;p&gt;Toujours avec une texture un peu papier dans le fond, on se rappelle à la fois de l'aspect artisanal et des tracts de manif', une pierre deux coups.
Et pour s'y croire encore plus, j'en ai intégré certaines sur des mockups de bouteilles. Toujours plus d'immersion.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mockups d'étiquettes sur des bouteilles" src="/media/blog/articles/bouteilles-mockup.webp" title="Mockups d'étiquettes sur des bouteilles"&gt;&lt;/p&gt;
&lt;h2&gt;Le choix final&lt;/h2&gt;
&lt;p&gt;Avec ces prévisualisations en tête, plus simple de se faire une idée et de savoir ce qui nous parle vraiment.&lt;/p&gt;
&lt;p&gt;Voilà le logo choisi, qui servira aussi pour les étiquettes d'expérimentation :&lt;/p&gt;
&lt;p&gt;&lt;img alt="Logo final de la Brasserie du Sabot" src="/media/blog/articles/Logo_red.webp" title="Logo final de la Brasserie du Sabot"&gt;&lt;/p&gt;
&lt;h2&gt;Déclinaison&lt;/h2&gt;
&lt;p&gt;Les étiquettes finales mettront à l'honneur des figures de l'anarchisme, et principalement des femmes !
En voilà quelques unes, à l'image d'Emma Goldman et Louise Michel.&lt;/p&gt;
&lt;p&gt;Le logo principal quand à lui, se prête à l'exercice des brassins de test, du site internet, des flyers, des sous-bock et de la devanture de la brasserie elle-même.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Etiquettes finales (en situation ?)" src="/media/blog/articles/bouteilles-experimentation.webp" title="Etiquettes finales en situation"&gt;
&lt;img alt="Etiquettes finales (en situation ?)" src="/media/blog/articles/bouteilles-finales.webp" title="Etiquettes finales en situation"&gt;
Les étiquettes finales, après retouches faites en interne à la brasserie.&lt;/p&gt;
&lt;h2&gt;Le site&lt;/h2&gt;
&lt;p&gt;Dans un premier temps, j'ai développé un site internet vitrine pour la Brasserie, dont l'objectif principal était d'annoncer sa future ouverture et de la faire découvrir.&lt;/p&gt;
&lt;p&gt;Puis dans un second temps est venue la partie boutique, celle qui permet de commander ses bières en ligne !&lt;/p&gt;
&lt;p&gt;&lt;img alt="Homepage du site de la brasserie" src="/media/blog/articles/homepage.webp" title="Homepage du site de la brasserie"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Page boutique de la brasserie" src="/media/blog/articles/sabot-boutique.webp" title="Page boutique de la brasserie"&gt;&lt;/p&gt;
&lt;h1&gt;Tada !&lt;/h1&gt;
&lt;h2&gt;Et surtout, n'hésitez pas à aller jeter un oeil par vous même sur 🍺 &lt;a href="https://sabot.beer"&gt;https://sabot.beer&lt;/a&gt; 🍺 !&lt;/h2&gt;</content><category term="Design"/><category term="Design"/></entry><entry><title>De Yaal à Yaal Coop</title><link href="https://yaal.coop/blog/de-yaal-a-yaal-coop" rel="alternate"/><published>2021-09-24T00:00:00+02:00</published><updated>2021-09-24T00:00:00+02:00</updated><author><name>Camille Daniel &lt;camille@yaal.coop&gt;</name></author><id>tag:yaal.coop,2021-09-24:/blog/de-yaal-a-yaal-coop</id><summary type="html">&lt;p&gt;Transition d'une entreprise coopérative&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Yaal Coop&lt;/strong&gt; est officiellement née le 1er septembre 2020 et a accueilli ses premier·es salarié·es 2 mois plus tard, en novembre 2020.
C'est la petite soeur de &lt;a href="https://yaal.fr/"&gt;Yaal SAS&lt;/a&gt;, créée il y a bien plus longtemps, en 2010 (ce qui ne rajeunit pas ses fondateurs Arthur et Colin !).&lt;/p&gt;
&lt;p&gt;Comme je sais que la co-existence des deux entreprises peut être source de confusion, voici ma tentative pour raconter l'aventure Yaal Coop.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer : mon point de vue est personnel et forcément biaisé. Et pas forcément très synthétique non plus.&lt;/em&gt; 😗🎶&lt;/p&gt;
&lt;h2&gt;Yaal kézako ?&lt;/h2&gt;
&lt;p&gt;Yaal est une vieille entreprise d'informatique (sisi 2010 c'est forcément vieux, je n'avais même pas entamé ma première carrière professionnelle de bio-physicienne à cette époque !).
Mais une entreprise qui n'a de classique que son statut juridique de SAS, car pour le reste, on dévie pas mal des standards du milieu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auto-organisation&lt;/strong&gt; et &lt;strong&gt;auto-gouvernance&lt;/strong&gt; sont des principes qui font partie de l'ADN de Yaal depuis toujours.
Si l'entreprise a grossi, jusqu'à atteindre une trentaine de personnes en 2019, elle a eu à coeur de maintenir ces principes en effaçant la hierarchie et en proposant aux salarié·es de s'associer après un an de collaboration.
Transparence des salaires et des finances permet à chacun·e, associé·e comme salarié·e, de saisir les enjeux, de se forger une opinion et d'en discuter lorsqu'il le désire.&lt;/p&gt;
&lt;p&gt;Une autre particularité de Yaal est son modèle économique reposant sur &lt;strong&gt;l'investissement technique&lt;/strong&gt;. L'ambition est grande : casser les règles habituelles du couple client/prestataire informatique en partageant les risques aussi bien techniques que financiers avec les porteur·euses de projets innovants auxquels elle s’associe.
Pour se donner les moyens de ces ambitions, les associé·es touchent tous le même salaire, sensiblement plus faible que le prix du marché pour permettre à l'entreprise d'investir dans les projets, et se partagent plus tard les bénéfices en cas de succès collectif. Finalement, sur 10 ans, les revenus des associés chez Yaal sont comparables à ceux d'autres entreprises informatiques.&lt;/p&gt;
&lt;p&gt;Car cela marche : le plus gros projet de Yaal, &lt;a href="https://myelefant.com/en/"&gt;Myelefant&lt;/a&gt;, &lt;a href="https://objectifaquitaine.latribune.fr/innovation/2019-11-14/comment-yaal-investit-de-la-technique-dans-les-startups-832940.html"&gt;est revendu 21 millions d'euros en novembre 2019&lt;/a&gt; !&lt;/p&gt;
&lt;h2&gt;Pourquoi créer Yaal Coop ?&lt;/h2&gt;
&lt;p&gt;Avec le rachat de Myelefant par Sinch, une partie de l'équipe quitte Yaal pour suivre ce projet et rejoint Sinch en mars 2020.
Parmi ceux et celles qui font le choix de rester, des associé·es de Yaal de longue date mais aussi des salarié·es plus récent·es, dont je fais partie.&lt;/p&gt;
&lt;p&gt;Embauchée à Yaal en octobre 2018, je n'ai pas eu le temps d'y devenir associée, l'opération de vente de Myelefant ayant gelé les opérations d'entrée et sortie du capital à l'été 2019.
Et après le rachat, la situation financière de Yaal a évidemment pas mal changé. Il n'est d'un coup plus aussi simple de rentrer au capital de Yaal SAS dont la valorisation financière a pas mal évolué. 😅&lt;/p&gt;
&lt;p&gt;Pour autant j'aime toujours Yaal et son modèle inspirant qui m'a séduite d'entrée !
Et je ne suis pas la seule.&lt;/p&gt;
&lt;p&gt;Alors que certain·es profitent de ce tournant pour se lancer dans une aventure de &lt;a href="https://sabot.beer/"&gt;production de bière&lt;/a&gt;, je commence un sacré remue-méninges avec mes collègues pour imaginer un Yaal 2.0 encore plus beau, encore plus fort, et encore plus autogestionné. 💪&lt;/p&gt;
&lt;p&gt;Tant qu'à devoir changer de structure pour assurer à tous ses membres un même niveau d'engagement et de pouvoir décisionnel, pourquoi ne pas remettre les choses à plat et changer de statut ?
En passant à celui officiel de &lt;strong&gt;coopérative&lt;/strong&gt;, cela clarifie notre fonctionnement (1 personne = 1 voix) et nos valeurs (recherche d'équilibre entre toutes les parties prenantes et d'une rentabilité compatible avec cet objectif).&lt;/p&gt;
&lt;h2&gt;Qu'est-ce qui change alors dans Yaal Coop ?&lt;/h2&gt;
&lt;p&gt;Yaal Coop est une Société Coopérative d'Intéret Collectif (SCIC). Entre autre, ça veut dire que :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tout·e salarié·e peut un jour devenir associé·e. Chez nous, c'est même devenu une obligation après un an de salariat, inscrite dans nos statuts. On souhaite ainsi aligner nos intérêts et nos engagements, éviter de créer un fossé entre coopérateur·rices associé·es et salarié·es. Fin 2019 à Yaal, un tiers seulement des salarié·es étaient associé·es et il nous semble nécessaire d'inverser la dynamique au sein de Yaal Coop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le processus d'entrée et sortie des associé·es au sein de la coopérative est simplifié car il est décrit dans nos statuts et détaché de la valorisation financière de l'entreprise, au contraire d'une entreprise classique. Cela assure également une lucrativité limitée puisque'aucune plus-value n’est possible lors du remboursement des parts en cas de départ.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Au contraire d'une SCOP (un autre statut plus connu des entreprises coopératives), le capital et le pouvoir n'est pas réservé aux seul·es salarié·es. Plusieurs collèges d'associé·es existent, dont celui des salarié·es, mais ce n'est pas le seul.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aujourd'hui à Yaal Coop nous avons désigné 4 collèges :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;celui des &lt;strong&gt;salarié·es&lt;/strong&gt; qui dispose de 50% des voix, le maximum possible en SCIC, car il nous semble primordial que les travailleur·euses soient majoritaires pour décider des orientations de leur entreprise&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;celui des &lt;strong&gt;bénéficiaires&lt;/strong&gt; (composé de clients, usagers ou fournisseurs). Collège obligatoire en SCIC, il fait toute la particularité de ce statut et concrétise la recherche de l'intérêt collectif, en intégrant les autres parties prenantes du travail réalisé au sein de l'entreprise&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;celui des &lt;strong&gt;investisseur·euses&lt;/strong&gt; qui nous a permis d'accueillir Yaal SAS et de bénéficier d'un premier apport pour lancer l'activité !&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;et celui des &lt;strong&gt;observateur·rices et soutiens&lt;/strong&gt;, qui vise à accueillir toute personne morale ou physique qui contribuerait par tout moyen à l'activité de Yaal Coop : professionnel·le collaborateur·rice, réseau ou organisme partenaire (acteur·rice de l'ESS, des biens communs...), bénévole, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour créer Yaal Coop, nous nous sommes fait accompagner par &lt;a href="https://www.finacoop.fr/"&gt;Finacoop Nouvelle Aquitaine&lt;/a&gt;, qui est aujourd'hui notre cabinet comptable mais aussi le premier membre officiel de notre collège des bénéficiaires 💚, ainsi que par l'URSCOP.&lt;/p&gt;
&lt;p&gt;Nous avons aussi procédé à un rachat de l'activité partielle de Yaal SAS pour basculer nos contrats de travail, et nous avons signé un contrat de licence d'exploitation de la marque Yaal pour pouvoir porter fièrement l'héritage de Yaal jusque dans notre nom. ✊&lt;/p&gt;
&lt;h2&gt;Mais concrètement au quotidien ça fonctionne comment ?&lt;/h2&gt;
&lt;p&gt;Pour l'instant la mise en oeuvre de nos principes coopératifs et d'auto-gouvernance est plutôt simplifiée : en passant de plus de 30 salarié·es à &lt;strong&gt;5 coopérateur·rices salarié·es associé·es&lt;/strong&gt;, on a naturellement beaucoup fluidifié la communication et le partage d'informations entre nous (même si la crise sanitaire ne nous a, elle, pas beaucoup aidés 😩).&lt;/p&gt;
&lt;p&gt;Aujourd'hui on se retrouve la plupart des jours de la semaine en présentiel dans notre local pour travailler sur nos différents projets.
Même lorsqu'on ne travaille pas sur la même chose au même moment, c'est d'autant plus facile de discuter des autres sujets autour d'une pause thé ou du déjeuner.&lt;/p&gt;
&lt;p&gt;Le mardi en particulier est sanctuarisé pour pouvoir discuter et travailler sur des sujets collectifs : tout le monde se retrouve au bureau et personne ne travaille isolé en prestation. &lt;em&gt;(Au contraire le mercredi est le seul jour où tout le monde télétravaille alors ne prévoyez pas de passer au local ce jour là pour boire un café !).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Lorsque tout le monde est arrivé, on commence notre &lt;strong&gt;weekly&lt;/strong&gt; où l'on discute à tour de rôle des activités de la semaine passée et celle à venir en s'appuyant sur notre trello* d'équipe qu'on met à jour à ce moment là. On y met en particulier toutes les tâches de gestion, projets internes et pistes/prospects pour assurer un suivi partagé.&lt;/p&gt;
&lt;p&gt;Avec notre instance de cloud nextcloud qui nous permet de numériser et ranger tous les documents de l'entreprise (notamment les factures, contrats, fiches de paie, etc.) et de partager des agendas (par exemple celui de nos congés/absences), c'est notre outil principal pour la gestion.&lt;/p&gt;
&lt;p&gt;On a aussi une petite interface maison héritée de Yaal qui nous permet à tous d'avoir un oeil sur l'évolution du compte en banque, un bon gros tableau libre office à l'ancienne en guise de plan de tréso et un mini-wiki dans un simple document texte partagé pour documenter nos habitudes de gestion, qu'on étoffe au fur et à mesure (comment on commande des tickets resto ? Comment on range une facture ? Comment on fait la paie &lt;em&gt;(sans risquer d'oublier la dernière étape de bien fêter la fête 🎉)&lt;/em&gt; ?).&lt;/p&gt;
&lt;p&gt;Les mails et surtout la messagerie Element complètent nos outils de communication interne, en particulier les jours où nous sommes à distance et/ou asynchrones.&lt;/p&gt;
&lt;p&gt;De manière plus macro, on a fait le choix du &lt;strong&gt;salaire unique&lt;/strong&gt; et du &lt;strong&gt;temps plein&lt;/strong&gt; pour les associé·es.
Notre salaire est donc indépendant de notre expérience, de notre fonction et du montant que l'on facture.
Et son montant est encore bas pour continuer de pouvoir investir à la manière de Yaal SAS.&lt;/p&gt;
&lt;p&gt;On a eu pas mal de discussions riches sur le sujet, en particulier une session animée par &lt;a href="https://davidbruant.github.io/"&gt;David Bruant&lt;/a&gt;, extérieur à la coop, qui aime réfléchir au sujet de la rémunération juste (merci d'être venu en parler avec nous l'année dernière !).
Je suis assez curieuse d'autres modèles alternatifs, comme celui de &lt;a href="http://scopyleft.fr/"&gt;Scopyleft&lt;/a&gt; par exemple, où chacun se paie ce dont il a besoin après avoir pris soin d'en discuter avec tout le monde.&lt;/p&gt;
&lt;p&gt;Mais pour l'instant le salaire unique nous convient et nous permet de démarrer simplement. On aimerait s'augmenter dès que la coopérative aura atteint un régime de croisière mais on est aussi plus dans la team "réduisons notre temps de travail" que "gagnons toujours plus", donc on verra bien...&lt;/p&gt;
&lt;p&gt;Côté projets, on continue l'investissement technique (comme avec notre premier projet &lt;a href="https://lum1.fr/"&gt;Lum1&lt;/a&gt; !), mais on fait aussi un peu de bénévolat à &lt;a href="https://supercoop.fr/"&gt;Supercoop&lt;/a&gt; (le supermarché coopératif de Bordeaux) et d'autres projets internes : bientôt &lt;a href="https://nubla.io"&gt;Nubla&lt;/a&gt; ☁️ ?! On fait aussi un peu de prestation plus classique vu qu'on continue notamment à travailler pour Sinch, ce qui assure une certaine stabilité financière.&lt;/p&gt;
&lt;p&gt;Au fond on cherche encore l'équilibre qui conviendra (et qui évoluera probablement !) et on est ouvert sur les modes de collaboration possibles.
Ce que l'on veut surtout c'est &lt;strong&gt;participer à des projets qui ont du sens&lt;/strong&gt; et &lt;strong&gt;avec des personnes qui partagent nos valeurs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Enfin côté vie coopérative élargie, et en particulier animation des autres collèges d'associé·es, on a encore un tas de chose à explorer. On a la chance de pouvoir commencer petits, avec peu d'associé·es qui nous connaissent et nous font confiance. Donc nos efforts sont pour l'instant concentrés ailleurs. Mais on a en tête que c'est une chose à laquelle on va devoir consacrer plus de temps ensuite ! Et on a hâte d'avoir les moyens de le faire.&lt;/p&gt;
&lt;p&gt;Yaal Coop n'a même pas un an, on n'est qu'au début de l'aventure et de l'expérimentation ! 🌱&lt;/p&gt;
&lt;h2&gt;Et Yaal SAS alors ?&lt;/h2&gt;
&lt;p&gt;Je suis sans doute mal placée pour parler de Yaal SAS car je n'en fais plus partie. Son activité est aujourd'hui en sommeil, il n'y a d'ailleurs plus aucun salarié : seulement &lt;a href="https://www.yaal.fr/equipe"&gt;9 associé.es&lt;/a&gt; dispersés entre Yaal Coop, Sinch, La Brasserie du Sabot et d'autres projets personnels. Dispersés mais pas bien loin, alors rendez-vous à la prochaine bière ! 🍻&lt;/p&gt;
&lt;p&gt;&lt;em&gt;*Oui Trello. L'outil détonne au milieu des autres outils libres qu'on utilise et dont on est plus friand. Mais pour l'instant on n'a pas trouvé d'alternative cool et aussi pratique pour la gestion de projet donc on fait avec 🙂 (vous utilisez quoi vous ?)&lt;/em&gt;&lt;/p&gt;</content><category term="Vie coopérative"/><category term="coop"/><category term="vie coopérative"/></entry><entry><title>Design et création d'un nuage, Nubla.io</title><link href="https://yaal.coop/blog/design-et-creation-d-un-nuage-nubla-io" rel="alternate"/><published>2021-09-07T00:00:00+02:00</published><updated>2021-09-07T00:00:00+02:00</updated><author><name>Brunélie Lauret &lt;brunelie@yaal.coop&gt;</name></author><id>tag:yaal.coop,2021-09-07:/blog/design-et-creation-d-un-nuage-nubla-io</id><summary type="html">&lt;p&gt;Création de notre nuage&lt;/p&gt;</summary><content type="html">&lt;h1&gt;C'est quoi, Nubla ?&lt;/h1&gt;
&lt;p&gt;Nubla, c'est un projet de service pour fournir des e-mails, de l'espace de stockage Cloud, de messagerie instantanée et d'agenda pour tous⋅tes, sans passer sous le giron de Google et des géants du web.&lt;/p&gt;
&lt;p&gt;On veut passer par des solutions libres, mises à disposition à des frais qui varient selon les moyens de nos utilisateurs. Ca, on y tient. C'est un souhait aussi depuis le début, s'adapter et faire un service qui puisse profiter à un maximum de monde, sans vente de données, sans fins publicitaires et sur mesure.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Bannière nubla.io" src="/media/blog/articles/meta-picture.webp" title="bannière nubla.io"&gt;&lt;/p&gt;
&lt;h1&gt;☁️&lt;/h1&gt;
&lt;hr&gt;
&lt;h1&gt;Design et création d'un nuage, Nubla.io ☁️&lt;/h1&gt;
&lt;p&gt;Ma priorité sur le site de Nubla, c'est de faire un site internet fonctionnel, accessible et lisible. Et quand je dis accessible, c'est au sens de l'accessibilité à tous⋅tes : Choix de polices d'écriture intelligibles, contrastes suffisants, hiérarchisation des contenus et facilité de navigation.&lt;/p&gt;
&lt;p&gt;La seconde, c'est de créer quelque chose qui me fasse plaisir à imaginer, à dessiner, puis à intégrer.&lt;/p&gt;
&lt;p&gt;Utiliser des outils et des techniques qui me plaisent : &lt;a href="https://wwW.coolors.co"&gt;coolors&lt;/a&gt; pour le choix des palettes de couleur, me tourner vers des polices d'écriture libres, des illustrations open source aussi avec &lt;a href="https://www.undraw.co"&gt;undraw&lt;/a&gt;, l'utilisation de &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout"&gt;CSS Grid&lt;/a&gt; pour l'intégration...&lt;/p&gt;
&lt;h2&gt;Premières pistes&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Palettes, tests de fonts avec le texte nubla.io" src="/media/blog/articles/palettes-fonts.webp" title="Palettes, tests de fonts avec le texte nubla.io"&gt;&lt;/p&gt;
&lt;p&gt;Quand j'ai proposé au vote les différentes palettes à l'équipe, on s'en est sortis avec une égalité retentissante.&lt;/p&gt;
&lt;p&gt;Le point commun entre toutes : Elles sont colorées. Vraiment.
Dans mes préférences, j'aimerais garder au moins une palette qui contient du jaune pour faire une petite référence discrète à Yaal Coop.&lt;/p&gt;
&lt;p&gt;Parmi les autres couleurs, je tiens généralement à utiliser un noir qui n'est pas parfaitement noir, et un blanc pas parfaitement blanc. Juste pour ne pas trop agresser la rétine, je trouve ça plus doux. Ici, #323232 fait office de noir, et #F4F4F4 fait office de blanc.&lt;/p&gt;
&lt;h3&gt;Les fonts testées ici sont :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://indestructibletype.com/Jost.html"&gt;Jost&lt;/a&gt; - Une police d'écriture libre, adaptée à la technologie &lt;a href="https://v-fonts.com/"&gt;variable font d'OpenType&lt;/a&gt;, reproduisant l'esprit de la légendaire Futura.&lt;/li&gt;
&lt;li&gt;Varela Round - Une police d'écriture ronde, sympathique, créée par le designer &lt;a href="https://dribbble.com/JoePrince"&gt;Joe Prince&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'ai finalement opté pour Jost, du fait de sa grande polyvalence, mais également pour son aspect géométrique et lisible qui viendra contraster avec les motifs décoratifs plutôt ronds du site (les fameux blobs).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tests d'interaction des couleurs entre elles" src="/media/blog/articles/color-shapes.webp" title="Tests d'interaction des couleurs entre elles"&gt;&lt;/p&gt;
&lt;p&gt;Côté formes, décoratives, j'ai testé le géométrique et l'anguleux, mais pour un projet cloud avec une face amicale/familiale, je lui ai préféré les courbes et les "blobs" arrondis. La police d'écriture choisie elle-même déjà tout en angles et en pointes créée un contraste et une dynamique amusants.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image du blob de fond" src="/media/blog/articles/blob.webp" title="image du blob de fond"&gt;&lt;/p&gt;
&lt;h2&gt;Wireframes&lt;/h2&gt;
&lt;p&gt;Sur la sturcture du site, j'avais très envie de travailler avec &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout"&gt;CSS Grid&lt;/a&gt; Je suis partie sur une structure de cinq colonnes, chacune séparée d'une gouttière de 20px, la première et la dernière colonne restant "vides" pour aérer le site. Je met vides entre guillemets, parce que c'est dans la colonne de droite que j'ai prévu de poser la navigation, fixée en haut à droite de l'écran pour rester toujours visible.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Wireframe de la page d'accueil, en noir et blanc" src="/media/blog/articles/wireframe-1.webp" title="Wireframe de la page d'accueil, en noir et blanc"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Wireframe de la page à propos, en noir et blanc" src="/media/blog/articles/wireframe-3.webp" title="Wireframe de la page à propos, en noir et blanc"&gt;&lt;/p&gt;
&lt;h2&gt;Déclinaison de maquettes&lt;/h2&gt;
&lt;p&gt;Les maquettes ci-dessous ne sont pas finales, mais sont là pour donner une idée assez claire des différents layouts qui seront mis en place sur le site et du rendu qu'on pourra obtenir.&lt;/p&gt;
&lt;p&gt;Je suis pas vraiment adepte des maquettes pixel perfect (je vais pas m'étaler là dessus), d'autant plus lorsque je ne suis pas seul responsable des contenus du site. Je préfère poser une base, voir quels contenus sont proposés puis m'y adapter en respectant l'esprit et les déclinaisons de layouts choisis pour le site.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Maquettes graphiques du site Nubla.io" src="/media/blog/articles/maquette-homepage.webp" title="Maquettes graphiques du site Nubla.io"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Maquettes graphiques du site Nubla.io" src="/media/blog/articles/maquette-about.webp" title="Maquettes graphiques du site Nubla.io"&gt;&lt;/p&gt;
&lt;p&gt;Pourquoi le cadre ? Jeu sur la structure du site, évite la sensation de "flottement" des éléments dans le vide. Peut aussi permettre des jeux de parallaxe.
Jouer avec le scroll à l'intérieur du cadre, avec la navigation fixe, je trouve ça assez marrant.&lt;/p&gt;
&lt;h1&gt;☁️&lt;/h1&gt;
&lt;hr&gt;
&lt;h1&gt;Le Site&lt;/h1&gt;
&lt;h2&gt;Structure du site :&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Schéma de la structure du site" src="/media/blog/articles/wireframe-grid.webp" title="Schéma de la structure du site"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le body, sur lequel je place le blob de fond.&lt;/li&gt;
&lt;li&gt;Un conteneur, celui qui a le cadre noir et un padding qui laisse la place pour la scrollbar à droite et les notes de pied de page en bas&lt;/li&gt;
&lt;li&gt;Un layout en grille CSS de 5 colonnes, séparées par des gouttières de 20px.&lt;/li&gt;
&lt;li&gt;La navigation, qui semble posée sur la 5eme colonne mais est en réalitée positionnée en position:fixed; pour ne pas bouger d'un pouce lorsque l'on navigue sur la page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Les petits détails qui font plaiz&lt;/h2&gt;
&lt;p&gt;... ou comment faire l'effet de soulignement dynamique des liens :&lt;/p&gt;
&lt;p&gt;&lt;img alt="Gifs de quelques interactions animées, genre le soulignage des liens" src="/media/blog/articles/link-hover.gif" title="gif d'interaction animée"&gt;&lt;/p&gt;
&lt;h3&gt;C'est fait comme ça :&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;line&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;font-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;z-index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;--dark&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;hover&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;focus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;--dark&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;line&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="kt"&gt;em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;--yellow&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;z-index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;line&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;before&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="kt"&gt;em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;--magenta&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;z-index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;.2&lt;/span&gt;&lt;span class="kt"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;before&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;before&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;.2&lt;/span&gt;&lt;span class="kt"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ce serait dommage de se priver de ce genre de petites choses ! Ca me fait expérimenter un peu, et puis c'est toujours amusant à voir. Bien sûr, dans un souci d'accessibilité, les animations se déclenchent aussi lorsqu'un élément est placé en [focus] et pas seulement au survol de la souris.&lt;/p&gt;
&lt;h1&gt;☁️&lt;/h1&gt;
&lt;hr&gt;
&lt;h1&gt;Et voilà !&lt;/h1&gt;
&lt;h3&gt;Vous voulez voir ce que ça donne en vrai ? C'est par là : 👉 &lt;a href="https://nubla.io"&gt;https://nubla.io&lt;/a&gt; 👈&lt;/h3&gt;
&lt;p&gt;Et n'hésitez pas à faire un tour sur notre &lt;a href="https://framaforms.org/outils-informatiques-1593440082"&gt;sondage&lt;/a&gt; concernant vos usages e-mail, cloud et internet, et savoir si l'offre de Nubla pourrait vous intéresser !&lt;/p&gt;
&lt;p&gt;J'espère que la lecture vous a plu !&lt;/p&gt;</content><category term="Design"/><category term="design"/></entry><entry><title>Dernières contributions à des logiciels libres par l'équipe Yaal Coop (rentrée 2021)</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-rentree-2021" rel="alternate"/><published>2021-09-01T00:00:00+02:00</published><updated>2021-09-01T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2021-09-01:/blog/dernieres-contributions-logiciels-libres-rentree-2021</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop entre le printemps et septembre 2021.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;&lt;a href="https://github.com/pytest-dev/pytest"&gt;pytest&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Outil de tests unitaires en Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/pull/8752"&gt;Personnalisation des thèmes de la coloration syntaxique&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Composant svelte de suggestion d'éléments dans une liste déroulante&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/94"&gt;Installation d'une suite de tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/95"&gt;Ignorer les accents lors de la surbrillance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/74"&gt;Préchargement de la liste lorsque le composant est initialisé avec une valeur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/70"&gt;Le contenu peut-être figé&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Diverses maintenances &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/100"&gt;#100&lt;/a&gt;
  &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/92"&gt;#92&lt;/a&gt; &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/83"&gt;#83&lt;/a&gt;
  &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/77"&gt;#77&lt;/a&gt; &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/76"&gt;#76&lt;/a&gt;
  &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/75"&gt;#75&lt;/a&gt; &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/72"&gt;#72&lt;/a&gt; &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/69"&gt;#69&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/nhn/tui.editor/"&gt;toast-ui editor&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Éditeur markdown wysiwyg en Javascript&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nhn/tui.editor/pull/1772"&gt;Attribut 'autofocus' qui permet au composant de ne pas prendre le focus au chargement d'une page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Serveur OpenID Connect simpliste, basé sur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/6"&gt;Ajout, édition et suppression des groupes d'utilisateurs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/sheraf"&gt;sheraf&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Surcouche objet à ZODB&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/21"&gt;Décorateur sur les attributs sheraf pour personnaliser les fonctions de recherche et d'indexation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/18"&gt;Utilitaires pour vérifier l'état de l'indexation d'une instance d'un modèle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/zopefoundation/ZEO"&gt;ZEO&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Serveur de base de données pour ZODB&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/zopefoundation/ZEO/pull/183"&gt;Correction dans la documentation d'un paramètre&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/leapfrogonline/rstr"&gt;rstr&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque Python produisant des chaînes de caractères aléatoire&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mises à jour du paquet (&lt;a href="https://github.com/leapfrogonline/rstr/pull/6"&gt;métadonnées&lt;/a&gt;, &lt;a href="https://github.com/leapfrogonline/rstr/pull/9"&gt;versions de python&lt;/a&gt;), une &lt;a href="https://github.com/leapfrogonline/rstr/pull/7"&gt;vérification de paramètres passées&lt;/a&gt;. L'ensemble est disponible dans la version 2.0 sur &lt;a href="https://pypi.org/project/rstr/"&gt;pypi.org&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://pygments.org/"&gt;Pygments&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque Python de coloration syntaxique&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ajout d'un lexeur à &lt;a href="https://github.com/pygments/pygments/pull/1808"&gt;Pygments&lt;/a&gt; pour le format &lt;a href="https://devcenter.heroku.com/articles/procfile#procfile-format"&gt;Procfile&lt;/a&gt;. Les fichiers Procfile sont utilisés par des hébergeurs comme Heroku mais ils servent aussi pour des développements locaux (avec Foreman ou Honcho).&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://python.org"&gt;Python.org&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Correction d'un exemple de code sur le site &lt;a href="https://github.com/python/pythondotorg/pull/1763"&gt;python.org&lt;/a&gt;. La correction est intégrée dans le dépôt, mais pas encore disponible sur le site.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Last FOSS contributions from the Yaal Coop team (summer 2021)</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-rentree-2021" rel="alternate"/><published>2021-09-01T00:00:00+02:00</published><updated>2021-09-01T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2021-09-01:/blog/en/dernieres-contributions-logiciels-libres-rentree-2021</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during summer 2021.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;&lt;a href="https://github.com/pytest-dev/pytest"&gt;pytest&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;The pytest framework makes it easy to write small tests, yet scales to support complex functional testing&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pytest-dev/pytest/pull/8752"&gt;Syntax highlighting theme customization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simple Autocomplete / typeahead component for Svelte&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/94"&gt;Unit tests suite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/95"&gt;Words highlighting ignore accents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/74"&gt;async: Loads item list on focus when the component is pre-initialized&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/70"&gt;Lockable input&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Janitoring &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/100"&gt;#100&lt;/a&gt;
  &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/92"&gt;#92&lt;/a&gt; &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/83"&gt;#83&lt;/a&gt;
  &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/77"&gt;#77&lt;/a&gt; &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/76"&gt;#76&lt;/a&gt;
  &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/75"&gt;#75&lt;/a&gt; &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/72"&gt;#72&lt;/a&gt; &lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/69"&gt;#69&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/nhn/tui.editor/"&gt;toast-ui editor&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Markdown WYSIWYG Editor&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nhn/tui.editor/pull/1772"&gt;add an 'autofocus' option that can disable initial focus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simplistic OpenID Connect provider over OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/6"&gt;Group management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/sheraf"&gt;sheraf&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;A versatile ZODB abstraction layer&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/21"&gt;Attribute decorators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/18"&gt;Indexation helpers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/zopefoundation/ZEO"&gt;ZEO&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;ZODB Client-Server framework&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/zopefoundation/ZEO/pull/183"&gt;Replaced 'cache-size-bytes' with 'cache-size' in the documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/leapfrogonline/rstr"&gt;rstr&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;rstr is a helper module for easily generating random strings of various types.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Package updates (&lt;a href="https://github.com/leapfrogonline/rstr/pull/6"&gt;metadata&lt;/a&gt;, &lt;a href="https://github.com/leapfrogonline/rstr/pull/9"&gt;python versions&lt;/a&gt;), &lt;a href="https://github.com/leapfrogonline/rstr/pull/7"&gt;parameters check&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://pygments.org/"&gt;Pygments&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Pygments is a generic syntax highlighter written in Python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pygments/pygments/pull/1808"&gt;Procfile lexer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://python.org"&gt;Python.org&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python/pythondotorg/pull/1763"&gt;Code sample fix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry><entry><title>Dernières contributions à des logiciels libres par l'équipe Yaal Coop</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-mi-2021" rel="alternate"/><published>2021-06-10T00:00:00+02:00</published><updated>2021-06-10T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2021-06-10:/blog/dernieres-contributions-logiciels-libres-mi-2021</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Composant svelte de suggestion d'éléments dans une liste déroulante&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/35"&gt;Flag html5 &lt;em&gt;autocomplete&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/43"&gt;Délai entre les requêtes&lt;/a&gt; (afin de ne pas surcharger le serveur)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/44"&gt;Ignorer les vieilles réponses qui arrivent trop tard&lt;/a&gt; (afin de ne pas afficher de vieux résultats)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/46"&gt;Personnalisation des éléments de la liste&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/50"&gt;Indicateur d'activité&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/54"&gt;Support des générateurs asynchrones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/58"&gt;Ignorer les accents pour suggérer des éléments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/59"&gt;Soumettre le formulaire en appuyant sur la touche Entrée&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/68"&gt;Trier les résultats en fonction de leur pertinence&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Serveur OpenID Connect simpliste, basé sur OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/5"&gt;Gestion des groupes d'utilisateurs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/sheraf"&gt;sheraf&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Surcouche objet à ZODB&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/16"&gt;Possibilité d'enregistrer des crochets à la création, l'édition ou la suppression d'attributs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/15"&gt;Les méthodes d'indexation des indexes peuvent ne retourner qu'une unique valeur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/14"&gt;De meilleures performances pour les QuerySet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/13"&gt;Attribut Enum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/12"&gt;Indexes partagés entre différents attributs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/11"&gt;Plusieurs manières de définir des indexes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/10"&gt;Levée d'une erreur lorsqu'un ModelAttribute n'est pas appelé avec un Model&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/python-ldap/python-slapd"&gt;python-slapd&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python pour contrôler un server OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Création et publication du projet.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;cpython&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;pprint.pprint() dispose d'un &lt;a href="https://github.com/python/cpython/pull/24864"&gt;paramètre underscore_numbers&lt;/a&gt; qui améliore la lisibilité des gros entiers (sera disponible dans la prochaine version)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python/cpython/pull/23872"&gt;Correction de liens internes dans la documentation&lt;/a&gt; (rétroporté vers les versions 3.8 et 3.9)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python/pythondotorg/pull/1763"&gt;Correction d'un exemple de code sur le site web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Bibliothèque python de gestion de formulaires web&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/689"&gt;Nouveau logo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Debian&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;modernisation d'icônes pour les &lt;a href="https://salsa.debian.org/ddp-team/release-notes/-/merge_requests/103"&gt;notes de publication&lt;/a&gt; (permet une cohérence graphique avec la mise-à-jour du &lt;a href="https://salsa.debian.org/installer-team/installation-guide/-/merge_requests/11"&gt;guide d'installation&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</content><category term="Logiciel libre"/><category term="Logiciel libre"/><category term="contributions"/></entry><entry><title>Last FOSS contributions from the Yaal Coop team (spring 2021)</title><link href="https://yaal.coop/blog/en/dernieres-contributions-logiciels-libres-mi-2021" rel="alternate"/><published>2021-06-10T00:00:00+02:00</published><updated>2021-06-10T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2021-06-10:/blog/en/dernieres-contributions-logiciels-libres-mi-2021</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during the spring 2021.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete"&gt;simple-svelte-autocomplete&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simple Autocomplete / typeahead component for Svelte&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/35"&gt;&lt;em&gt;autocomplete&lt;/em&gt; html5 flag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/43"&gt;Delay between requests&lt;/a&gt; (afin de ne pas surcharger le serveur)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/44"&gt;Ignore the old late responses&lt;/a&gt; (afin de ne pas afficher de vieux résultats)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/46"&gt;List items customization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/50"&gt;Activity indicator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/54"&gt;Async generator support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/58"&gt;Suggestions ignore diacritics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/59"&gt;Submit enter by pressing Enter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pstanoev/simple-svelte-autocomplete/pull/68"&gt;Sort results by pertinence&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/canaille"&gt;canaille&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simplistic OpenID Connect provider over OpenLDAP&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/5"&gt;Groups support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gitlab.com/yaal/sheraf"&gt;sheraf&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;A versatile ZODB abstraction layer&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/16"&gt;Attribute hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/15"&gt;Values method can index single values&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/14"&gt;Better QuerySet performances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/13"&gt;Enum attribute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/12"&gt;Attribute shared indexes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/11"&gt;Indexes alternate definitions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/sheraf/-/merge_requests/10"&gt;raise exception if ModelAttribute is called without Model&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/python-ldap/python-slapd"&gt;python-slapd&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Controls a slapd process in a pythonic way&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project creation and publication.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;cpython&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/python/cpython/pull/24864"&gt;pprint.pprint function displays integer with underscores&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python/cpython/pull/23872"&gt;Change URL for 'from' link when used in a raised exception&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python/pythondotorg/pull/1763"&gt;fix input-output order in interpreter example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://github.com/wtforms/wtforms"&gt;wtforms&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;A flexible forms validation and rendering library for Python.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/wtforms/wtforms/pull/689"&gt;New logo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Debian&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://salsa.debian.org/ddp-team/release-notes/-/merge_requests/103"&gt;Improved publication notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="FOSS"/><category term="FOSS"/><category term="contributions"/></entry></feed>