<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Yaal Coop</title><link href="https://yaal.coop/en/" rel="alternate"/><link href="https://yaal.coop/en/blog/feeds/all.atom.xml" rel="self"/><id>https://yaal.coop/en/</id><updated>2026-06-21T00:00:00+02:00</updated><entry><title>Spring 2026 FOSS contributions by the Yaal Coop team</title><link href="https://yaal.coop/en/blog/dernieres-contributions-logiciels-libres-printemps-2026" rel="alternate"/><published>2026-06-21T00:00:00+02:00</published><updated>2026-06-21T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2026-06-21:/en/blog/dernieres-contributions-logiciels-libres-printemps-2026</id><summary type="html">&lt;p&gt;The last free and open-source software contributions from the Yaal Coop team during spring 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;&lt;a href="https://zsh.sourceforge.io/"&gt;ZShell&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Powerful shell&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.zsh.org/mla/workers/2026/msg00094.html"&gt;Add -r parameter to zcalc completion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/authlib/auth-playground"&gt;auth-playground&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Demonstration OAuth2 / OIDC client&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/auth-playground/pull/3"&gt;Support for rpinitiated-logout&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;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/873"&gt;Validate BCP47 language tags with a regex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/874"&gt;OpenID Connect Back-Channel Logout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/875"&gt;Documentation overhaul&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/881"&gt;Fix authlib.jose deprecation warning poping from _joserfc_helpers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/884"&gt;Fix RFC7523 signing with non RSA keys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/886"&gt;Fix the readme links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/887"&gt;Allow non-recommended algorithms in ClientSecretJWT and PrivateKey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/888"&gt;Prefer &lt;code&gt;id_token_signed_response_alg&lt;/code&gt; client metadata to guess algs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/pallets-eco/flask-dramatiq"&gt;flask-dramatiq&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Plug Dramatiq task queue in your Flask web application.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-dramatiq/pull/7"&gt;Migration from Gitlab CI to GHA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-dramatiq/pull/14"&gt;Fix CI doc step and add RTD configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-dramatiq/pull/15"&gt;Add support for dramatiq 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-dramatiq/pull/17"&gt;GHA release flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-dramatiq/pull/21"&gt;Update doc URLs to point to the github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-dramatiq/pull/22"&gt;Add ruff and prek configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/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/674"&gt; CSRF meta tag helper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/ThiefMaster/maildump"&gt;maildump&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;A python-based mailcatcher clone&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ThiefMaster/maildump/pull/64"&gt;Replace pkg_resources with importlib.metadata&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.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/46"&gt;Query methods can use ResponseParameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/48"&gt;Etags support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.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/135"&gt;Document web framework integrations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/136"&gt;Attribute inclusion and exclusion overhaul&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/137"&gt;Enforce immutable mutability checks at runtime in PATCH operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/138"&gt;Add &lt;code&gt;Resource.replace()&lt;/code&gt; for PUT immutability verification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/139"&gt;Add SCIMValidator and SCIMSerializer annotations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/140"&gt;Add context type aliases shortcuts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/142"&gt;Add compatibility with pydantic 2.13&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.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/18"&gt;Fix multi-value attributes patch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.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/48"&gt;Attribute inclusion/exclusions checks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/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/105"&gt;Implement &lt;code&gt;:locator:&lt;/code&gt; to match a given element in the page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/106"&gt;Implement screencast directive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/115"&gt;Dependencies update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/118"&gt;Lossless screencasts and ffmpeg customization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/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/888"&gt;GHA improvements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/889"&gt;Re-introduce Choice and SelectChoice dataclasses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/891"&gt;ListField use Meta.bind_field instead of the default bind method.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/892"&gt;Implement ButtonField&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/893"&gt;Add links to MDN in the documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/894"&gt;Add &lt;code&gt;test_environment&lt;/code&gt; support for the Email validator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/895"&gt;Reset FieldList index state when calling process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/896"&gt;Fix filters documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/897"&gt;Deprecate DateTimeField&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/898"&gt;Implement RangeInput min and max parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/900"&gt;Do not render 'for' in radio &lt;label&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/901"&gt;FieldList improvement to handle entries with indices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/902"&gt;Error messages customization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/905"&gt;Add a tz parameter to &lt;code&gt;DateTimeLocalField&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/906"&gt;Escape double quotes in HTML attribute values&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/907"&gt;&lt;code&gt;html_params&lt;/code&gt; returns &lt;code&gt;Markup&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/908"&gt;Fix False value with Select&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/909"&gt;Clarify how Select choice is processed in the documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/910"&gt;Render-time checked kwargs take precedence over field.checked&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/912"&gt;Use consecutive ids in FieldList when using insert and remove&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/913"&gt;Improve custom widgets documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/914"&gt;Add a fieldlist of formfield example in the documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/916"&gt;Enum support for SelectField&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/917"&gt;Respect email_validator default values&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/918"&gt;Customize regexp validator match method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/920"&gt;Restore &lt;code&gt;sorted(set())&lt;/code&gt; instead of &lt;code&gt;list(dict.fromkeys())&lt;/code&gt; to sort keys in FieldList&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/921"&gt;Datalist implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/923"&gt;SelectField backward compatibility and minor QoL improvements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/924"&gt;Pass &lt;code&gt;formdata&lt;/code&gt; parameter to &lt;code&gt;post_process&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/926"&gt;Improve SelectField enum coerce&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/kvesteri/wtforms-alchemy"&gt;wtforms-alchemy&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Tools for creating wtforms from sqlalchemy models&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kvesteri/wtforms-alchemy/pull/180"&gt;Prepare for wtforms 3.3 support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/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;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms-sqlalchemy/pull/55"&gt;Support for py310-314, GHA 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/334"&gt;Support for SCIM attribute inclusion and exclusions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/335"&gt;Support SCIM ETags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/336"&gt;Implement SCIM /Me endpoint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/337"&gt;Add SQL configuration parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/338"&gt;Add support for pooled LDAP connections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/339"&gt;Avoid HTTP loopback when fetching logo for mails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/340"&gt;Implement a loading indicator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/341"&gt;Fix dynamic registration tokens documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/342"&gt;Implement rfc8628 device authorization grant&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/bersace/periodiq"&gt;periodiq&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simple Scheduler for Dramatiq Task Queue&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/bersace/periodiq/-/merge_requests/24"&gt;Support for Python 3.14 and dramatiq 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/bersace/periodiq/-/merge_requests/25"&gt;Migration from poetry to uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/bersace/periodiq/-/merge_requests/26"&gt;Bump to v0.14.0&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 2026</title><link href="https://yaal.coop/blog/dernieres-contributions-logiciels-libres-printemps-2026" rel="alternate"/><published>2026-06-21T00:00:00+02:00</published><updated>2026-06-21T00:00:00+02:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2026-06-21:/blog/dernieres-contributions-logiciels-libres-printemps-2026</id><summary type="html">&lt;p&gt;Les dernières contributions à des logiciels libres par l'équipe Yaal Coop pendant le printemps 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;&lt;a href="https://zsh.sourceforge.io/"&gt;ZShell&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Interprète de commande puissant&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.zsh.org/mla/workers/2026/msg00094.html"&gt;Ajout du paramètre -r au complètement de zcalc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/authlib/auth-playground"&gt;auth-playground&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Client de démonstration OAuth2 / OIDC&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/auth-playground/pull/3"&gt;Support de la déconnexion initiée par le RP&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;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/873"&gt;Validation des étiquettes de langue BCP47 avec une expression régulière&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/874"&gt;Déconnexion par back channel OpenID Connect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/875"&gt;Refonte de la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/881"&gt;Correction de l'avertissement de dépréciation de authlib.jose provenant de _joserfc_helpers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/884"&gt;Correction de la signature RFC7523 avec des clés non RSA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/886"&gt;Correction des liens du readme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/887"&gt;Autoriser les algorithmes non recommandés dans ClientSecretJWT et PrivateKey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/authlib/authlib/pull/888"&gt;Préférer la métadonnée client &lt;code&gt;id_token_signed_response_alg&lt;/code&gt; pour deviner les algorithmes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/pallets-eco/flask-dramatiq"&gt;flask-dramatiq&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Branchez la file de tâches Dramatiq dans votre application web Flask.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-dramatiq/pull/7"&gt;Migration de Gitlab CI vers GHA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-dramatiq/pull/14"&gt;Correction de l'étape de doc de la CI et ajout de la configuration RTD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-dramatiq/pull/15"&gt;Ajout du support de dramatiq 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-dramatiq/pull/17"&gt;Flux de publication GHA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-dramatiq/pull/21"&gt;Mise à jour des URLs de doc pour pointer vers le dépôt github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-dramatiq/pull/22"&gt;Ajout de la configuration ruff et prek&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/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, incluant CSRF, l'upload de fichiers et l'intégration de Recaptcha.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/flask-wtf/pull/674"&gt;Assistant de balise meta CSRF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/ThiefMaster/maildump"&gt;maildump&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Un clone de mailcatcher basé sur python&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ThiefMaster/maildump/pull/64"&gt;Remplacement de pkg_resources par importlib.metadata&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/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/46"&gt;Les méthodes de requête peuvent utiliser ResponseParameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-client/pull/48"&gt;Support des ETags&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.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/135"&gt;Documentation des intégrations aux frameworks web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/136"&gt;Refonte de l'inclusion et de l'exclusion d'attributs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/137"&gt;Application des contrôles de mutabilité immuable à l'exécution dans les opérations PATCH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/138"&gt;Ajout de &lt;code&gt;Resource.replace()&lt;/code&gt; pour la vérification d'immuabilité lors des PUT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/139"&gt;Ajout des annotations SCIMValidator et SCIMSerializer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/140"&gt;Ajout de raccourcis d'alias de types de contexte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/python-scim/scim2-models/pull/142"&gt;Ajout de la compatibilité avec pydantic 2.13&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/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/18"&gt;Correction du patch des attributs multi-valués&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.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é 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/48"&gt;Contrôles d'inclusion/exclusion d'attributs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/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/105"&gt;Implémentation de &lt;code&gt;:locator:&lt;/code&gt; pour cibler un élément donné de la page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/106"&gt;Implémentation de la directive screencast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/115"&gt;Mise à jour des dépendances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tushuhei/sphinxcontrib-screenshot/pull/118"&gt;Screencasts sans perte et personnalisation de ffmpeg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/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/888"&gt;Améliorations GHA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/889"&gt;Réintroduction des dataclasses Choice et SelectChoice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/891"&gt;ListField utilise Meta.bind_field au lieu de la méthode bind par défaut.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/892"&gt;Implémentation de ButtonField&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/893"&gt;Ajout de liens vers MDN dans la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/894"&gt;Ajout du support de &lt;code&gt;test_environment&lt;/code&gt; pour le validateur Email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/895"&gt;Réinitialisation de l'état d'index de FieldList lors de l'appel à process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/896"&gt;Correction de la documentation des filtres&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/897"&gt;Dépréciation de DateTimeField&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/898"&gt;Implémentation des paramètres min et max de RangeInput&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/900"&gt;Ne pas rendre l'attribut 'for' dans les &lt;label&gt; des boutons radio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/901"&gt;Amélioration de FieldList pour gérer les entrées avec indices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/902"&gt;Personnalisation des messages d'erreur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/905"&gt;Ajout d'un paramètre tz à &lt;code&gt;DateTimeLocalField&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/906"&gt;Échappement des guillemets doubles dans les valeurs d'attributs HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/907"&gt;&lt;code&gt;html_params&lt;/code&gt; retourne &lt;code&gt;Markup&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/908"&gt;Correction de la valeur False avec Select&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/909"&gt;Clarification du traitement des choix de Select dans la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/910"&gt;Les kwargs checked au moment du rendu priment sur field.checked&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/912"&gt;Utilisation d'ids consécutifs dans FieldList lors de l'usage d'insert et remove&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/913"&gt;Amélioration de la documentation des widgets personnalisés&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/914"&gt;Ajout d'un exemple de fieldlist de formfield dans la documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/916"&gt;Support des Enum pour SelectField&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/917"&gt;Respect des valeurs par défaut de email_validator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/918"&gt;Personnalisation de la méthode match du validateur regexp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/920"&gt;Restauration de &lt;code&gt;sorted(set())&lt;/code&gt; au lieu de &lt;code&gt;list(dict.fromkeys())&lt;/code&gt; pour trier les clés dans FieldList&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/921"&gt;Implémentation de Datalist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/923"&gt;Compatibilité ascendante de SelectField et améliorations mineures de confort&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/924"&gt;Passage du paramètre &lt;code&gt;formdata&lt;/code&gt; à &lt;code&gt;post_process&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms/pull/926"&gt;Amélioration de la coercition d'enum de SelectField&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/kvesteri/wtforms-alchemy"&gt;wtforms-alchemy&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Outils pour créer des wtforms à partir de modèles sqlalchemy&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kvesteri/wtforms-alchemy/pull/180"&gt;Préparation du support de wtforms 3.3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://api.github.com/repos/pallets-eco/wtforms-sqlalchemy"&gt;wtforms-sqlalchemy&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Intégration de WTForms pour SQLAlchemy&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pallets-eco/wtforms-sqlalchemy/pull/55"&gt;Support de py310-314, améliorations GHA&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/334"&gt;Support de l'inclusion et de l'exclusion d'attributs SCIM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/335"&gt;Support des ETags SCIM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/336"&gt;Implémentation de l'endpoint SCIM /Me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/337"&gt;Ajout de paramètres de configuration SQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/338"&gt;Ajout du support des connexions LDAP par pool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/339"&gt;Éviter le rebouclage HTTP lors de la récupération du logo pour les mails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/340"&gt;Implémentation d'un indicateur de chargement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/341"&gt;Correction de la documentation des jetons d'enregistrement dynamique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/yaal/canaille/-/merge_requests/342"&gt;Implémentation du flux d'autorisation par appareil rfc8628&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="https://gitlab.com/bersace/periodiq"&gt;periodiq&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Ordonnanceur simple pour la file de tâches Dramatiq&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/bersace/periodiq/-/merge_requests/24"&gt;Support de Python 3.14 et dramatiq 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/bersace/periodiq/-/merge_requests/25"&gt;Migration de poetry vers uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/bersace/periodiq/-/merge_requests/26"&gt;Passage à la v0.14.0&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/en/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:/en/blog/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'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>Autumn 2025 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/en/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:/en/blog/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>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>Canaille beta is out</title><link href="https://yaal.coop/en/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:/en/blog/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>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>Summer 2025 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/en/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:/en/blog/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>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>Canaille obtains the OpenID Connect certification</title><link href="https://yaal.coop/en/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:/en/blog/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>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>Spring 2025 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/en/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:/en/blog/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>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>New features and latest news on Canaille</title><link href="https://yaal.coop/en/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:/en/blog/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>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>Winter 2025 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/en/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:/en/blog/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'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>Autumn 2024 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/en/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:/en/blog/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>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>New security features implemented in Canaille</title><link href="https://yaal.coop/en/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:/en/blog/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>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>Python SCIM toolbox</title><link href="https://yaal.coop/en/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:/en/blog/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>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>Summer 2024 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/en/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:/en/blog/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 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>Spring 2024 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/en/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:/en/blog/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>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>Winter 2024 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/en/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:/en/blog/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'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>Autumn 2023 FOSS contributions from by the Yaal Coop team</title><link href="https://yaal.coop/en/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:/en/blog/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>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>Canaille, a lightweight identity and authorization management software</title><link href="https://yaal.coop/en/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:/en/blog/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&lt;sup id="sf-canaille-nlnet-pytest-iam-1-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-1" class="simple-footnote" title="or more exactly, a software implementing the LDAP protocol"&gt;1&lt;/a&gt;&lt;/sup&gt; 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&lt;sup id="sf-canaille-nlnet-pytest-iam-2-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-2" class="simple-footnote" title="that are called schemas"&gt;2&lt;/a&gt;&lt;/sup&gt;.
And you'd better be confident when you do it, because no update mechanism is provided for neither data nor data models&lt;sup id="sf-canaille-nlnet-pytest-iam-3-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-3" class="simple-footnote" title="at least with OpenLDAP"&gt;3&lt;/a&gt;&lt;/sup&gt;.
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;&lt;sup id="sf-canaille-nlnet-pytest-iam-4-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-4" class="simple-footnote" title="what we did, our IANA number is 56207"&gt;4&lt;/a&gt;&lt;/sup&gt;, 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&lt;sup id="sf-canaille-nlnet-pytest-iam-5-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-5" class="simple-footnote" title="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"&gt;5&lt;/a&gt;&lt;/sup&gt; 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;&lt;sup id="sf-canaille-nlnet-pytest-iam-6-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-6" class="simple-footnote" title="a cooperative supermarket near Bordeaux, France"&gt;6&lt;/a&gt;&lt;/sup&gt;, 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;&lt;sup id="sf-canaille-nlnet-pytest-iam-7-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-7" class="simple-footnote" title="for sake of simplicity, I will keep to OIDC"&gt;7&lt;/a&gt;&lt;/sup&gt;.
(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.&lt;sup id="sf-canaille-nlnet-pytest-iam-8-back"&gt;&lt;a href="#sf-canaille-nlnet-pytest-iam-8" class="simple-footnote" title="They can also be a driving force for new features, like RFC7628 or RFC9068 that were commonly used before they became standards."&gt;8&lt;/a&gt;&lt;/sup&gt;&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;&lt;ol class="simple-footnotes"&gt;&lt;li id="sf-canaille-nlnet-pytest-iam-1"&gt;or more exactly, a software implementing the LDAP protocol &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;that are called &lt;em&gt;schemas&lt;/em&gt; &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;at least with OpenLDAP &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;what we did, our IANA number is &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-4-back" class="simple-footnote-back"&gt;↩︎&lt;/a&gt;&lt;/li&gt;&lt;li id="sf-canaille-nlnet-pytest-iam-5"&gt;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 &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;a cooperative supermarket near Bordeaux, France &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;for sake of simplicity, I will keep to &lt;em&gt;OIDC&lt;/em&gt; &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;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. &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="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[ref]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[/ref] 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[ref]du moins avec OpenLDAP[/ref].
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;[ref]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;[/ref], 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[ref]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[/ref] 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;[ref]le supermarché coopératif de l’agglomération bordelaise[/ref], 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;)[ref]par abus de langage, je dirai simplement &lt;em&gt;OIDC&lt;/em&gt;[/ref]. 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;[ref]l’« Internet Engineering Task Force » un organsime étasunien de développement et de promulgation de standards[/ref].
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.[ref]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.[/ref]&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;/abr&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;</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/en/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:/en/blog/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 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>FOSS contributions from the Yaal Coop team during spring 2023</title><link href="https://yaal.coop/en/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:/en/blog/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>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 winter 2023</title><link href="https://yaal.coop/en/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:/en/blog/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>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>Last FOSS contributions from the Yaal Coop team (automn 2022)</title><link href="https://yaal.coop/en/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:/en/blog/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 (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 (summer 2022)</title><link href="https://yaal.coop/en/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:/en/blog/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>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>Purism Librem 5 software review : our list to Santa</title><link href="https://yaal.coop/en/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:/en/blog/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>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>Last FOSS contributions from the Yaal Coop team (winter 2022)</title><link href="https://yaal.coop/en/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:/en/blog/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>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 (fall 2021)</title><link href="https://yaal.coop/en/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:/en/blog/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>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 (summer 2021)</title><link href="https://yaal.coop/en/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:/en/blog/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 (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 (spring 2021)</title><link href="https://yaal.coop/en/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:/en/blog/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><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>How to plug OpenSMTPD with OpenLDAP on Debian Buster</title><link href="https://yaal.coop/en/blog/how-to-plug-opensmtpd-with-openldap-on-debian-buster" rel="alternate"/><published>2019-12-27T00:00:00+01:00</published><updated>2019-12-27T00:00:00+01:00</updated><author><name>Éloi Rivard &lt;eloi@yaal.coop&gt;</name></author><id>tag:yaal.coop,2019-12-27:/en/blog/how-to-plug-opensmtpd-with-openldap-on-debian-buster</id><summary type="html">&lt;p&gt;This should be easy to do; it is not.&lt;/p&gt;</summary><content type="html">&lt;p&gt;So you want to host your own mail server with opensmtpd, but you don't have
time to understand everything going on? Here is an expeditious guide for doing
just that.&lt;/p&gt;
&lt;p&gt;In this guide I used OpenSMTPD 6.6.1 on Debian Buster.&lt;/p&gt;
&lt;p&gt;Lets start by blindly copy-pasting this snippet to install the dependencies we
will need:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;opensmtpd&lt;span class="w"&gt; &lt;/span&gt;libpam-ldap&lt;span class="w"&gt; &lt;/span&gt;libnss-ldap
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;OpenSMTPD&lt;/h1&gt;
&lt;p&gt;OpenSMTPD has some LDAP support with the &lt;code&gt;opensmtpd-extras&lt;/code&gt; package, but not
enough for LDAP authentication. Someone opened a &lt;a href="https://github.com/OpenSMTPD/OpenSMTPD/issues/812"&gt;bug
report&lt;/a&gt; stating that you can
request some fields from the LDAP server, giving you access to the hashed user
password, but that's it. You do not know which hash algorithm was used, and
even if you did, OpenSMTPD will only use the one provided by
&lt;a href="http://man7.org/linux/man-pages/man3/crypt.3.html"&gt;crypt&lt;/a&gt;, so there is a good
chance that comparing hashed passwords won't work. Later, an OpenSMTPD
developer
&lt;a href="https://github.com/OpenSMTPD/OpenSMTPD/issues/812#issuecomment-458482184"&gt;confirmed&lt;/a&gt;
that there was no such thing as LDAP authentication in OpenSMTPD, but that one
should rely on standard authentication mechanisms such as PAM or bsd_auth:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[...] OpenSMTPD authenticate using crypt(3) by default, which indeed will
require credentials to be adapted for that function, but it does so through
bsd_auth(3) on OpenBSD and may be configured to use pam(3) on other systems,
so you may just delegate authentication to an ldap layer if you actually
don't want the system's auth to take place.&lt;/p&gt;
&lt;p&gt;This seems like the right approach to tackle this issue to me, if I were to
authenticate against ldap, I'd use an ldap authenticator for bsd_auth(3) or
pam(3).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here is an example of a &lt;code&gt;/etc/smtpd.conf&lt;/code&gt; file.&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;pki&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mydomain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tld&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/path/to/fullchain.pem&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;pki&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mydomain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tld&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/path/to/privkey.pem&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;pki&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mydomain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tld&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dhe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;

&lt;span class="n"&gt;public_addr&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="s2"&gt;&amp;quot;xxx.xxx.xxx.xxx&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;public_addr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;465&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;smtps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pki&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mydomain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tld&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;
&lt;span class="n"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;public_addr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;587&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tls&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pki&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mydomain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tld&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;

&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ldap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ldap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ldap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;

&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lmtp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/var/run/dovecot/lmtp&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;userbase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ldap&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;relay&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;relay&lt;/span&gt;

&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mydomain.tld&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dovecot&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;relay&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that the &lt;code&gt;userbase&lt;/code&gt; parameter is not directly linked with user authentication.
It actually defines the list of available recipients. Here is an example of
&lt;code&gt;/etc/mail/ldap.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;url                     ldap://ldap.mydomain.tld
username                cn=admin,dc=mydomain,dc=tld
password                MyAmazingPassword
basedn                  ou=Users,dc=mydomain,dc=tld

userinfo_filter         (&amp;amp;(objectClass=posixAccount)(uid=%s))
userinfo_attributes     uidNumber,gidNumber,homeDirectory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Without further configuration, the &lt;code&gt;auth&lt;/code&gt; keyword in &lt;code&gt;smtpd.conf&lt;/code&gt; tells OpenSMTPD
to use PAM authentication. So this is what we should now configure.&lt;/p&gt;
&lt;h1&gt;PAM&lt;/h1&gt;
&lt;p&gt;According to its man page, &lt;em&gt;PAM is a system of libraries that handle the
authentication tasks of applications (services) on the system.&lt;/em&gt; In Debian, it
mainly consists of a collection of configuration files in &lt;code&gt;/etc/pam.d&lt;/code&gt; for
programs that need a generic way to handle authentication, session management,
etc. Each file is a set of rules for one program. Those rules generally use a
&lt;code&gt;pam_foobar.so&lt;/code&gt; file depending on the method used (unix, ldap etc.). The idea
is to chain rules to define an authentication policy (e.g. try to authenticate
against the unix backend, if that fails try against LDAP, then if that fails
reject the user). By default, OpenSMTPD will look into the &lt;code&gt;/etc/pam.d/smtpd&lt;/code&gt;
file for its rules, so this is where we want to write some configuration. The
&lt;code&gt;pam_ldap.so&lt;/code&gt; module we are interested in is provided by the &lt;code&gt;libpam-ldap&lt;/code&gt;
package.&lt;/p&gt;
&lt;p&gt;Here is an example of a &lt;code&gt;/etc/pam.d/smtpd&lt;/code&gt; file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt;%PAM-1.0

account     [default=bad success=ok user_unknown=ignore] pam_ldap.so debug

auth        sufficient      pam_ldap.so debug
auth        required        pam_deny.so
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Basically, this configuration tells PAM to rely on &lt;code&gt;pam_ldap.so&lt;/code&gt; to manage user
accounts and authentication. As you can see, there is not a lot of information
in this file. The &lt;a href="https://wiki.debian.org/LDAP/PAM"&gt;Debian documentation&lt;/a&gt;
explains that this is because &lt;code&gt;pam_ldap.so&lt;/code&gt; delegates everything to &lt;a href="https://wiki.debian.org/LDAP/NSS"&gt;Name
Service Switch&lt;/a&gt;. The &lt;code&gt;debug&lt;/code&gt; keywords are
used for verbosity, and can safely be removed.&lt;/p&gt;
&lt;h1&gt;NSS&lt;/h1&gt;
&lt;p&gt;The NSS is provided by the &lt;code&gt;libnss-ldap&lt;/code&gt; package. It is a daemon that holds the
LDAP configuration and caches the requests to the LDAP.&lt;/p&gt;
&lt;p&gt;You can configure your ldap URI, your search DN and your bind credentials in
&lt;code&gt;/etc/nslcd.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;...
uri ldap://ldap.mydomain.tld

base ou=Users,dc=mydomain,dc=tld

binddn cn=admin,dc=mydomain,dc=tld
bindpw MyVerySecretPassphrase
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;SSHD&lt;/h1&gt;
&lt;p&gt;On debian Buster, enabling LDAP on it has a side effect: SSH sessions will try to authenticate against the LDAP via PAM, unless you switch &lt;code&gt;UsePAM&lt;/code&gt; to &lt;code&gt;no&lt;/code&gt; in &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;.&lt;/p&gt;
&lt;h1&gt;Debug your installation&lt;/h1&gt;
&lt;p&gt;To debug this installation, let's launch all those services manually and make
them verbose:&lt;/p&gt;
&lt;p&gt;Check the system authentication logs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tail&lt;span class="w"&gt; &lt;/span&gt;--follow&lt;span class="w"&gt; &lt;/span&gt;/var/log/auth.log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;pam_ldap
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Launch opensmtpd in verbose mode:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;opensmtpd
sudo&lt;span class="w"&gt; &lt;/span&gt;/usr/sbin/smtpd&lt;span class="w"&gt; &lt;/span&gt;-dv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Launch the NSS daemon in verbose mode:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;nslcd
sudo&lt;span class="w"&gt; &lt;/span&gt;nslcd&lt;span class="w"&gt; &lt;/span&gt;--debug
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Check what is going on with your LDAP server:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tail&lt;span class="w"&gt; &lt;/span&gt;--follow&lt;span class="w"&gt; &lt;/span&gt;/var/log/syslog&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;slapd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Mail"/><category term="OpenSMTP"/><category term="FOSS"/><category term="Debian"/><category term="Buster"/><category term="Linux"/></entry></feed>