Journal des changements

1.2.1 -> 1.3.0

Note

PHP 8.3 minimum is required

Security

  • CSRF protection now relies on HTTP headers (Sec-Fetch-Site, with a fallback on Origin) rather than on per form tokens

  • Session cookie is now flagged SameSite=Lax

  • Session identifier is renewed on login, and when impersonating a member or coming back from it

  • Failed authentication attempts are now counted, and further attempts refused for a while: per account and address, per address, and per account as a backstop against attacks spread over many addresses. Thresholds and durations are in the advanced configuration

  • Password recovery requests are limited as well, per account asked about and per address asking

  • Self subscriptions are limited per address

  • Plugins can limit their own forms through the same mechanism, under a name of their own

  • Password recovery no longer says whether an account exists, but is still in the history and the logs

  • A new page under Configuration lists what is being refused, and lifts it

  • Everything that is typed in and later rendered as is - mailing preview, public document comment, dynamic fields values, PDF models, mails subjects and bodies - is now sanitized when it is stored

  • Password recovery relies on a dedicated token

  • The legacy md5 password fallback has been removed

  • Random strings are generated using a cryptographically secure generator

  • Coming back from impersonation is restricted to sessions that were really impersonating someone

  • A corrupted password strength setting no longer silently disables the check against personal information

  • The uniqueness check on the super administrator login could be skipped

  • Missing authentication checks on few routes

  • Demonstration mode freezes sender addresses, super administrator credentials and mail method, including from the advanced configuration page

  • Add optional two-factor authentication (experimental, disabled by default), using time based codes (TOTP) from any authenticator application:

    • Two-factor authentication can be made mandatory for administrators and staff members, or for everyone, behind the two-factor-required feature flag: under a mandatory policy, a wrong clock or a botched enrolment locks an association out of its own instance, and the way back is a SQL statement

    • Members enrolling get ten single use recovery codes; administrators and staff can reset a member second factor

    • Administrators and staff members without a second factor are invited to set one up when they log in, until they decline

    • The super administrator can use a second factor as well; it is cleared from the preferences in database

New features

  • Mailings can be sent in batches (experimental): a delay can be set between two messages, and hourly and daily quotas can be enforced. Sending goes through a queue that can be resumed; reminders use it as well. Default values keep the previous behavior

  • New advanced configuration page, listing every preference, including those the configuration forms do not show; each one tells whether it holds its default value, has been modified, is locked by a constant from behavior.inc.php or is unknown, and secret ones only tell whether they are set

  • Some settings moved from behavior.inc.php to the database: instance URL (GALETTE_URI), reverse proxy address index (GALETTE_X_FORWARDED_FOR_INDEX) and session duration (GALETTE_TIMEOUT). The constants still work and still take precedence; they are then reported as locked

  • The maximum size of an upload is now a setting, one per kind of upload: pictures, mailing attachments, documents, CSV imports and dynamic fields files. They are in the advanced configuration, and default to the single value that was hard coded until now

  • Plugins now have their own database version, and are updated on their own; the plugins page has been reworked, and lists disabled, not installed and outdated plugins

  • Plugins can declare public pages, each with a visibility of its own, set from the preferences page like the core ones

  • Dynamic fields can be added on preferences

  • Filters and pagination on the documents list

  • Contribution types can carry a description

  • Emailing settings can be tested from the values in the form, without storing them first; a new button checks the connection without sending anything

  • The adaptative PDF member card is now the default; the former implementation has been removed

  • Install and update are guarded by a lock file, and the update no longer asks for the database configuration

  • New galette:superadmin:password console command to change the super administrator password

  • bin/console is now shipped with release archives

  • Language selector has been reworked: regionalised languages are handled, the current language is listed, and the installer offers the same list

  • Contributions and transactions shortcuts on the groups managers dashboard

  • Maintenance mode tells the super administrator it is enabled when they are logged in

  • The reminders cron script takes the instance URL from the settings

  • New feature flags mechanism, to ship features that are not production ready yet; flags are declared in behavior.inc.php, only apply in debug mode, and a galette:feature:status console command tells what is enabled

  • Improvements on dynamic fields: choice, date and file can now be repeated and you can now import up to 10 dynamic fields from CSV import.

Improvements

  • Global accessibility improvements

  • Dynamic choice fields values are now stored as JSON along the field, instead of one dedicated table per field

  • Repeatable dynamic fields: labels, one add button per field, per field counters, maximum number of repetitions, and fields that cannot be repeated

  • Groups addition form has been reworked and simplified

  • Mailings list and forms carry more information

  • Buttons have been reworked all over the application, and theme contrasts improved

  • Page titles have been improved throughout the application

  • A missing asset now renders a proper error page instead of a blank one

  • Error messages name the setting that holds an invalid address

  • A file size is shown in the unit that fits - octets, Ko, Mo or Go - wherever it appears: the upload limits, the error a file too big raises, and the list of import files

  • Reuse SMTP connection on several calls

  • Load news with ajax call to prevent dashboard hangs

  • Superadmin login and password settings moved from the Preferences to the « My information » page in the « My account » menu

Fixes

  • A mailing attachment over the maximum allowed size raised a fatal error instead of being reported

  • The maximum size allowed for a dynamic field file was announced in bytes, and called kilobytes

  • Line breaks were lost in the text version of the mail signature

  • A new mailing could not be created once a mailing had been sent

  • Groups managers could not edit their own member record

  • Groups managers could not get receipts and invoices of the members they manage

  • Members could not get their own vCard

  • Wrong count and sum on contributions and transactions lists

  • Wrong contribution end date when the previous contribution ends the day before the beginning of membership

  • A member renewing on the last valid day of their membership was considered expired; beginning of membership calculation is also leap year safe

  • Wrong beginning of membership calculation when a beginning of membership date is set

  • Wrong lines alignment on PDF models using a multiline address

  • Underscores were escaped in plain text emails

  • Payment types were not created at install; wrong scheduled payment type on update, and missing engine and relation on the scheduled payments table with MySQL

  • Group selection on member form was broken

  • Requests on robots.txt no longer raise a not found error

  • The news cache was written but never read back, so galette.eu was contacted on every displayed page, even for anonymous visitors

  • Members list could be ordered on a column that does not exist

  • Preferences values were limited to 255 characters

  • The association address could be read from an arbitrary member when the configured source is unreadable

  • A public page whose visibility cannot be read is now closed, rather than open to everyone

  • Documents tab could be hidden by ad blockers

  • Several fixes on the web installer, including Javascript errors

  • GALETTE_SQL_DEBUG was tested for existence only, so declaring it to false still dumped every query

  • Fix mass change when only a group removal is selected

  • Customized PDF models and email texts were reset to their default values on every update

  • Occurrences of a dynamic field holding the same value collapsed into one in PDF and mail replacements, and a dynamic file link could point to another occurrence

L10n

  • New Slovenian translation, complete

  • New Brazilian Portuguese translation, started

  • Russian translation went from a quarter of the strings to almost complete

  • German and Tamil translations are complete again

  • Catalan, Portuguese and Turkish translations have progressed

  • Translatable strings are being reworked to only use positional parameters

Removals and requirements

  • Javascript is now required; a message says so when it is disabled, and the per feature warnings and the markup that was kept hidden for browsers without it have been dropped

  • PHP 8.3 is now the minimum required version

  • The fileinfo PHP module is now required; compatibility tests now also check ctype, dom, filter and iconv, and gettext is no longer reported as optional

  • Mime type detection now always relies on fileinfo; the extension based fallback and the FileTrait::$mime_types map it used have been removed

  • Database version is now 1.300; new tables have been added for plugins, authentication attempts and the mailing queue

  • The QMAIL mail method has been removed; installations using it are switched to sendmail

  • The GMAIL mail method has been removed; installations using it are switched to SMTP

  • GALETTE_DISPLAY_VERSION, GALETTE_HIDE_VERSION and GALETTE_ADAPTATIVE_CARDS constants have been removed

  • Updating from 0.6x releases is deprecated

  • Third party libraries have been updated

Plugins and development

  • Plugins declare an install class implementing InstallableInterface; the former way still works, but is deprecated, and a plugin class is now mandatory

  • Plugins can declare their own preferences; they are stored along the others, and their values are kept while the plugin is disabled

  • Plugins can refuse the removal of a group, and give the reason

  • Routes can be declared from controllers using the #[Route] attribute; this does not replace routes files yet, it is a first step

  • New AbstractEntity class and #[Column] attribute; Pdf is now abstract, and History members are protected

  • Preferences have been split behind a declarative schema, and a new Html utility class handles cleaning and stripping markup

  • Old deprecated routes, and Galette::showPublicPages() deprecated since 1.2.0, have been removed

  • The plugins directory can be set from the environment

  • New tools for developers: bin/serve, and galette:check-routes, galette:headers-check and galette:seed-fixtures console commands

1.2.0.1 -> 1.2.1

See full 1.2.1 changelog for all details.

  • Rework groups management user interface

  • Several fixes and improvements on logo (webp transparency, logo display in mails, …)

  • Change default order on contributions and transactions

  • Fix attaching existing contribution on transaction

  • Fixes on PDF member cards

  • Fix text emails signature

  • Fix debug mode using release archives

  • Minor fix on CSV exports

  • Fix contributions creation from payments plugins

  • Fix issues on some PostgreSQL sequences

1.2.0 -> 1.2.0.1

See full 1.2.0.1 changelog for all details.

  • Fix logo size on maintenance, install an compatibility pages

  • Fix PostgreSQL wrong sequences after update

  • Rework installation proposed versions

1.1.6.1 -> 1.2.0

See full 1.2.0 changelog for all details.

  • Rework/harmonize SQL scripts - review some data types and defaults values

  • Dynamic dates are now stored using Y-m-d format only

  • Dates validation is a bit stricter

  • Remove photo drag’n drop

  • Remove log preferences (logs are always enabled)

  • Fix several typehint issues

  • Use transaction payment type as default on new contributions

  • Contributions amount no longer can be zero

  • Add links to relevant parts of the documentation

  • Add few parameters to customize appearance

  • Plugins can now add Javascript just before the closing body tag

  • Add staff public pages (list and gallery)

  • Prevent main social networks to be removed on update

  • Fix mass changes on boolean fields

  • Add phone number and contact email in settings

  • Fix few dynamic translations issues

  • Fix CSRF error when using filters on scheduled payments with ajax mode

  • Remove show ID preference

  • PHP 8.5 compatibility

  • Remove support for PHP 8.1

  • Fix stored XSS CVE-2025-48076 and reflected XSS CVE-2025-48884

  • Fix groups manager access bypass CVE-2025-53922 and CVE-2025-58052

  • Plugins no longer require write access to their root directory to be disabled/enabled

  • FIx mass adding members to group when one selected member is already in the group

  • Prevent group managers from creating contributions with scheduled payments

  • Simple users cannot filter their own list of scheduled payments

  • Wrong toast message displayed when saving a contribution

  • Display issues on contributions/scheduled payments/transactions lists

  • Fix member storage when some fields are not present in the form

  • Plugins can display news on dashboard

  • Admin field is shown even if it is configured to be hidden

  • New members are set inactive when activity field is hidden

1.1.6.1 -> 1.1.6.2

  • Fixed typed property must not be accessed

  • Make sure fields visible for anyone don’t cause errors

  • Login must never be empty

  • Fix donation begin date

1.1.6 -> 1.1.6.1

  • Fix some issues when Status objects was not loaded from DI

1.1.5.2 -> 1.1.6

  • Improve checks on members

  • Use fields configuration to restrict to allowed fields only

1.1.5.1 -> 1.1.5.2

  • Wrong year on new contributions when using begin of membership date

  • Several issues on mass groups adding

  • Update German translation

1.1.5 -> 1.1.5.1

  • Loop issue on new contributions when using begin of membership date

  • Update TCPDF to latest version

1.1.4 -> 1.1.5

  • Fixes for PHP 8.4 compatibility

  • Members cannot access their invoices/receipts (#1886)

  • Fatal error adding contribution when no type is present (#1887)

  • Fix few typehint issues

  • Mass add/remove members from groups (#1624)

  • Use previous begin of membership date for new contributions (#1893)

  • Update translations in various languages, add new Tamil lang

1.1.3 -> 1.1.4

  • Groups managers can add or list contributions and transactions (from a preference - #1863)

  • Install from command line (#1180)

  • Improve dashboard (#1864)

  • Activate choice after member creation for groups managers (#1873)

  • Revert PDF member card to previous version, new adaptative one is optional (#1871)

  • Fix PDF footer overlaps (#1858)

  • Notify members when groups managers edit their account (#1860)

  • Preferences socials networks were removed on telemetry update (#1862)

  • Special HTML character are encoded on members search, therefore no results are found (#1865)

  • Begin membership date changes on keyboard browse (#1869)

  • Improve Preferences checks for membership extension/date (#1870)

  • Cannot remove emails from emails management (#1872)

  • Force image crop in preferences does not work (#1877)

  • Display PHP startup messages on error page

  • Display max_input_vars configuration on sys info page

  • Fix SQL issue with postgres searching on dynamic dates

1.1.2 -> 1.1.3

  • Impossible to update database (#1857)

Note

Since 2024-07, Changelog will no longer be translated. All new entries will be available in english only.

1.1.1 -> 1.1.2

  • Désormais traduite entièrement en Italien !

  • Ne pas afficher les liens vers la page publique des documents si les pages publiques ne sont pas activées (#1848)

  • Correction de l’affichage du message d’information d’une nouvelle version (#1849)

  • Correction de types sur les champs dynamiques (#1850)

  • Vérification de possibles valeurs vides converties en entiers

  • Correction de la recherche d’adhérents sur les types de contributions (#1852)

  • Les types de contributions et de paiements n’étaient plus sélectionnés à l’affichage des paramètres de recherche

  • Correction d’une erreur SQL avec PostgreSQL sur la recherche de champs dynamiques de type booléen

  • Correction des types de retour sur les exports paramétrés (#1853)

1.1.0 -> 1.1.1

  • Impossible de trier les transactions sur la colonne type de paiement (#1837)

  • Les inscriptions par l’adhérent ne pouvaient pas être enregistrées (#1838)

  • Erreur sur le tri dans la liste des envois (#1839)

  • Erreur sur le filtrage par status de la liste des adhérents (#1840)

  • Impossible de rejouer une recherche sauvegardée (#1841)

  • Impossible de lister les recherches sauvegardées avec le paramètre « afficher les identifiants » désactivé (#)

1.0.x -> 1.1.0

  • Ajout d’une variable pour le logo d’impression dans les modèles PDF (#1741)

  • Ne plus utiliser la sérialisation pour le stockage en base (#1744)

  • Message d’avertissement davantage explicite lorsque l’on est déjà sur la dernière release (#1779)

  • Empêcher l’indexation de l’instance par les moteurs de recherche (#1784)

  • Suppression de l’ancien cache à la mise à jour (#1788)

  • Modification de l’encodage MySQL et MariaDB (#1794)

  • Ajout d’une taille minimale sur les champs dynamiques (#1795)

  • Ajout des montants sur les types de contributions (#273)

  • Ajout du champ région (#583)

  • Vérification de la disponibilité d’une nouvelle version de Galette (#1785)

  • Amélioration de l’affichage du formulaire adhérent (#1775)

  • Ajout d’une constante spécifique pour activer le mode de débogage

  • Option pour désactiver les réseaux sociaux à l’affichage et la modification des adhérents (#1802)

  • Factorisation des droits entre les champs du cœur et les champs dynamiques (#1798)

  • Gestion des documents administratifs (#1216)

  • Autoriser les plugins à fournir leurs propres polices de caractères

  • Utilisation du format décimal pour tous les montants, suppression des valeurs par défaut

  • Revue du pied de page des PDF, correction de la pagination sur les listes d’émargement (#1816)

  • Correction de la couleur pour les membres du bureau sur les cartes adhérent (#1814)

  • Affichage en tête de liste des membres du bureau sur les pages publiques (#1809)

  • Identification des sponsors dans la liste des adhérents (#1792)

  • Ventilation des contributions en paiements planifiés (#1193)

  • Filtre des contributions selon leur type (#1470)

  • L’entrée de menu n’était pas toujours correctement sélectionnée (#1818)

  • Ajout du type de paiement sur les transactions (#574)

  • Suppression des fichiers non relatifs à l’utilisateur du dossier de configuration (#1822)

  • Ajout des contributions mensuelles (#1438)

  • Taille adaptative des cartes de membre PDF (#1817)

  • Les rappels n’étaient pas envoyés (#1614)

1.0.3 -> 1.0.4

  • Impossible d’accéder aux tabulations sur certaines résolutions (#1799)

  • L’aperçu HTML des courriels affiche le code (#1800)

  • Correction du défilement dans la fenêtre d’aperçu des courriels

  • Corrections sur l’utilisation de l’injection de dépendances

  • Le nombre d’adhérents affichés était automatiquement remis à « tous » (#1803)

  • Les modifications de groupes n’étaient pas visuellement affichées sur le formulaire adhérent (#1801)

  • Correction de la redirection lorsqu’un fichier dynamique n’existe pas

  • Défilement horizontal du menu lorsque le nom est trop long (#1805)

  • Un adhérent ne peut pas être son propre parent (#1806)

  • Ajout du pied de page des préférences dans les remplacements (#1808)

1.0.2 -> 1.0.3

  • Le logo n’apparaissait pas dans la signature des courriels (#1783)

  • L’éditeur HTML était absent sur le champ information des champs dynamiques (#1774)

  • Les pages de maintenance et de mise à jour ne fonctionnaient plus (#1782)

  • Ne pas déclencher les évènements lors de l’édition de masse (#1733)

  • Le cache est désormais dépendant de la version (#1787)

  • Vérification de la validité du site web (#1789)

  • Lien vers site de l’asso depuis le logo (#1790)

  • Amélioration des messages dans l’interface (#1786)

1.0.1 -> 1.0.2

  • Restriction d’accès des pages publiques (CVE-2024-24761 - #1778)

  • Suppression de classes inutiles (#1771) et correction de la création de nouveaux réseaux sociaux (#1760)

  • Modification de la langue de l’utilisateur cron (#1769)

  • Icône des variables de remplacements davantage visible pour les modèles PDF (#1770)

  • Correction d’un problème éventuel à la création de groupes (#1773)

  • Correction de la redirection d’URL (#1777)

1.0.0 -> 1.0.1

  • Le titre dans la liste des adhérents provoquait une erreur (#1756)

  • Impossible de créer un nouveau nom de réseau social (#1760)

  • Pagination et recherche sur la liste des adhérents cassée à l’ajout d’une contribution (#1761)

  • Chevauchement de la date de début de contribution (#1762)

  • « L’accordéon » des groupes n’était pas ouvert lorsque le nom contient un slash (#1764)

  • open_basedir empêche l’a lecture des fichiers dans /etc (#1765)

  • Quelques problèmes sur les contributions avec un montant à 0 (#1767)

  • Erreur fatale avec PHP 7.4 (#1768)

  • L’utilisateur cron n’avait pas de langue définie (#1769)

0.9.6.1 -> 1.0.0

Note

PHP 8.1 minimum requis

Ajouts

  • UI moderne

  • Améliorations majeures sur les UI/UX et responsive (#1611)

  • Utilisation de YAML au lieu de XML pour la configuration des exports

  • Nouvelle préférence pour afficher/masquer les bordures autour des cartes de membres PDF (#184)

  • Support des images WebP (#1681)

  • Suppression de la recherche libre dans la recherche avancée (#1684)

  • Vérification de la version minimale de la base de données à l’installation (#1725)

  • Retaillage et recadrage des images des adhérents selon un ratio fixe (#1717)

Corrections

  • Problèmes de mise à jour (constantes non définies) (#1615)

  • Erreur fatale lorsque le cookie n’est pas défini après connexion (#1617)

  • Tri des adhérents par statut (#16118)

  • Correction de plusieurs problèmes de compatibilité PHP 8.1 (#1629, #1655)

  • Les responsables de groupes ne peuvent éditer leurs propres informations (#1635)

  • Compte et affichage différent des adhérents des rappels (#1491)

  • La version minimale de PHP n’était pas affichée sur la page de compatibilité (#1682)

  • Les simples adhérents ne peuvent accéder à la liste de leurs contributions (#1675)

  • Suppression en masse de contributions (#1661)

  • Désactivation des images en ligne dans les courriels (#1659)

  • Problème à l’édition d’adhérents avec des fausses valeurs en liste de choix dynamiques (#1650)

  • Le groupe parent était perdu lorsqu’un responsable de groupe modifiait un groupe (#1648)

  • Correction de la taille du logo sur les cartes de membre (#1626)

  • Correction d’un timeout à l’utilisation du logo dans les cartes de membre PDF (#1726)

  • Correction des fichiers dynamiques sur les contributions et transactions (#1697)

  • Suppression de champs requis sur les cartes de membre PDF (#781)

  • Le groupe parent pouvait être perdu lorsqu’un responsable de groupe modifiait un groupe (#1708)

  • L’ajout en masse de contribution échouait s’il manquait une donnée (#1694)

  • Les champs dynamiques des contributions n’étaient pas affichés dans la recherche avancée (#1693)

  • Les champs dynamiques de type choix sur les contributions échouaient avec postgres (#1692)

  • Plusieurs issues mineures avec les langues RTL à la génération de PDF (#1727)

  • Problème dans les recherches des transactions avec certains formats de date (#1731)

  • Les adhérents sélectionnés n’étaient pas remis à jour à la création d’un nouvel envoi (#1742)

Sous le capot…

  • Le rendu des pages est désormais assuré par Twig au lieu de Smarty (#1619)

  • Utilisation du framework Fomantic UI pour l’ensemble de l’affichage (#1324)

  • Mise à jour des bibliothèques tierces

  • Atoum (projet mort) n’est plus utilisé pour les tests (#1674)

  • Compatibilité LibreJS (#1642)

Anciennes versions