2024 ended with a lot of new developments on Canaille, funded by NLNet. You can read it all on our dedicated blog post. We went through another round of developments, still under the same fund. You can read it all on this page!
Security audit and improvements
Canaille started 2025 with a security audit, conducted by Radically Open Security. Our main objectives were to know the weaknesses of our product and implement fixes before the end of march.
Better password reset security
The implementation of the flask TRUSTED_HOSTS (see documentation here) configuration variable prevents our "magic links" at user registration and password reset to be falsified and hijacked by a malicious host.
We also improved the way these links are generated to make them more secure and introduce a time limit in their validity.
Logo retrieval vulnerability
We removed a vulnerability that could theoretically permit a server-side request forgery (SSRF) when retrieving the logo of the application.
Better user URL validation
We improved the validation of the user website's URL to make it more restrictive.
Implementation of Content Security Policy
Content Security Policy (CSP) has been implemented on Canaille via Flask-Talisman. CSP makes it harder to disrupt our application, for example with cross-site scripting (XSS) attacks.
OIDC Certification
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 Authlib to get better support of the OpenID Specification.
Part of the progress done was:
Match OIDC specification on redirect URIs validation.
Update our models to implement attributes required by OIDC.
Displaying Terms of Service and Privacy policy links if the client requesting authorization issues them.
Displaying most request errors as JSON error pages.
Responding with JSON web tokens when requested by the client.
Improvement on Canaille's handling of JWTs and JWKS.
Packaging: Docker image
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.
The creation of this docker image was made possible by building a nix package.
Accessibility audit and improvements
Canaille benefited from an Accessibility audit as well, conducted by HAN accessibility lab. The results provided underlined several contrast issues and lack of differentiation of links from regular text, and a few keyboard navigation issues.
Accessibility improvements
Most color contrast issues have been fixed.
Most link differentiation and visual changes on focus and hover have been fixed.
A skip link has been added at the top of every page.
SCIM Provisioning
Canaille already provided a SCIM server implementation since our last security update. 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.
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.
Je code une librairie python en utilisant les annotations de type. Elle manipule des tableaux numériques de type Numpy, PyTorch, …
Donc j'ai des fonctions qui peuvent prendre n'importe qu'elle type de tableau et je comprends pas comment faire les annotations. Pour le moment, je fais ça
Array=TypeVar("Array")defis_array(x)->TypeGuard[Array]:"""A TypeGuard for array-like objects."""returnarray_api_compat.is_array_api_obj(x)deffunc(inarray:Array)->Array:...
mais pyright me dit
warning: TypeVar "Array" appears only once in generic function signature. Use "object" instead (reportInvalidTypeVarUse)
Par ailleurs, j'utilise is_array dans mes fonctions
ifnotis_array(inarray):raiseValueError("`inarray` must be a compatible with Array API Standard (eg. numpy, pytorch, ...)")des_choses_avec_inarray
mais mypy me dit que inarray est de type Never (mais pas pyright)…
Bref, je suis un peu perdu, il semble que l'on rentre dans des subtilités hors de ma portée. Si vous pouvez m'aidez merci !
Je tente de modifier des tableurs ODS existants pour remplir des cellules avec odfpy (paquet pas mis à jour récemment, mais ça a l’air d’être le plus stable et sérieux de PyPI néanmoins ?).
Mon postulat initial était que pour accéder à une cellule, il suffisait de parcourir les éléments du XML dans l’ordre : C5 serait donc la ligne à l’indice 4 (5) puis la colonne 2 (C).
Cette théorie marche bien tant qu’il n’y a pas de cellule fusionnée dans le document. Le cas contraire, ça se complique et je ne comprends plus grand chose.
J’ai fait un test.ods et un notebook ici pour illustrer mon incompréhension. Cela montre que, après des cellules fusionnées (en ligne ou en colonne), les autres cellules subissent un offset, que je ne sais pas expliquer.
Alors voilà, je suis sur un tuto YouTube d'assistant virtuel, et bien que j'ai énormément creusé, je souffre. C'est pourquoi je me suis inscrit.
OK pour l'install de packages en cascade…
Mais ma première question concerne le fait que après l'install d'un package réussie, il n'est pas forcément reconnu dans mon code (genre sur l'import, ou plutôt sur l'appel de certaines méthodes), bien qu'il soit présent dans le terminal.
En gros, j'ai bien compris ce que je ne comprenais pas.
2 sujets :
- les installs homebrew
- l'environnement virtuel
Marco 'Lubber' Wienkoop pour son travail sur Fomantic-UI, un chouette framework CSS que nous utilisons dans canaille. Fomantic-UI est aussi utilisé par d'autres outils sur lesquels nous comptons, comme Forgejo.
Hsiaoming Yang pour son travail sur authlib, une bibliothèque python d'authentification que nous utilisons dans canaille.