<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Yaal Coop - FOSS</title><link href="https://yaal.coop/en/" rel="alternate"/><link href="https://yaal.coop/en/blog/feeds/foss.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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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></feed>