Changelog

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

  • Now entirely translated into Italian language!

  • Do not display links to public documents page if public pages are not enabled (#1848)

  • Fix info message display on new release (#1849)

  • Fix typehint issues on dynamic fields (#1850)

  • Check for possible null from DB converted to int

  • Fix member search on contribution type (#1852)

  • Contributions types and payments types were no longer selected when displaying search parameters

  • Fix SQL issue searching on dynamic booleans fields with PostgreSQL

  • Fix return types on parameted exports (#1853)

1.1.0 -> 1.1.1

  • Cannot sort transactions on payment type column (#1837)

  • Self subscriptions cannot be stored (#1838)

  • Error on sorting sent mailings (#1839)

  • Error filtering members on status (#1840)

  • Cannot replay a saved search (#1841)

  • Cannot list saved search with “show identifiers” parameters set to false (#)

1.0.x -> 1.1.0

  • Add print logo variable in PDF models (#1741)

  • No longer use unsafe serialization for database storage (#1744)

  • More explicit upgrade warning when already on latest release (#1779)

  • Prevent instance indexation from search engines bots (#1784)

  • Clear old cache at upgrade (#1788)

  • Change MySQL and MariaDB encoding (#1794)

  • Add min size on dynamic fields (#1795)

  • Add amounts on contributions types (#273)

  • Add region field (#583)

  • Check if new Galette version is available (#1785)

  • Improve member form display (#1775)

  • Add new specific constant to enable debug mode

  • Option to disable social networks on member form/view (#1802)

  • Factorize permissions on core and dynamic fields (#1798)

  • Manage administrative documents (#1216)

  • Allow plugins to provide their own fonts

  • Use decimal for all amounts, drop defaults

  • Rework PDF footer, fix pagination on attendance sheet (#1816)

  • Fix color for staff members on member cards (#1814)

  • Display first staff members on public lists (#1809)

  • Identify sponsors in members list (#1792)

  • Dispatch contribution into scheduled payments (#1193)

  • Filter contributions list on type (#1470)

  • Menu entry was not always correctly selected (#1818)

  • Add payment type on transactions (#574)

  • Remove non user related files from configuration folder (#1822)

  • Add monthly contribution membership (#1438)

  • PDF Member card adaptative size (#1817)

  • Reminders were not sent (#1614)

1.0.3 -> 1.0.4

  • Cannot access tabs definition on some resolutions (#1799)

  • HTML Email preview shows source (#1800)

  • Fix scrolling in emailing preview’s modal

  • Few fixes on dependency injection usage

  • Number of show member automatically set to “all” (#1803)

  • Groups modification not visually added on member form (#1801)

  • Fix redirection when dynamic file does not exists

  • Menu horizontal scroll when name is too long (#1805)

  • Should not select a member as its own parent (#1806)

  • Add preferences footer in replacements (#1808)

1.0.2 -> 1.0.3

  • Logo in mail signature is not shown (#1783)

  • Missing HTML editor for dynamic fields information field (#1774)

  • Update and maintainance pages are no longer working (#1782)

  • Do not throw events on mass edition (#1733)

  • Make cache version dependent (#1787)

  • Check preferences website is valid (#1789)

  • Link to asso website from logo (#1790)

  • Rework UI messages (#1786)

1.0.1 -> 1.0.2

  • Public pages access restriction (CVE-2024-24761 - #1778)

  • Remove useless class from templates (#1771) and fix social networks search dropdown (#1760)

  • Ensure language is changed when login from cron; closes (#1769)

  • Make replacements icon in PDF Model more visible (#1770)

  • Fix possible issue on group creation (#1773)

  • Fix URL redirection (#1777)

1.0.0 -> 1.0.1

  • Title in members list causes an error (#1756)

  • Cannot enter a new social network name (#1760)

  • Pagination and search on members list broken adding contribution (#1761)

  • Contribution start date overload (#1762)

  • Groups “accordion tree” not opened when a name contains a slash (#1764)

  • open_basedir prevents files in /etc to be read (#1765)

  • Some issues with contribution amount set to 0 (#1767)

  • Fatal error with PHP 7.4 (#1768)

  • Cron user does not have lang defined (#1769)

0.9.6.1 -> 1.0.0

Note

PHP 8.1 minimum is required

Added

  • Modern UI

  • Major improvements on UI/UX and also responsiveness (#1611)

  • Use of YAML files instead of XML for exports configuration

  • New preference to show/hide borders around PDF member cards (#184)

  • WebP image support (#1681)

  • Removed free search on advanced search (#1684)

  • Check for minimal database version at install (#1725)

  • Resize and crop member picture to a fixed ratio (#1717)

Fixed

  • Update issues (not defined constants) (#1615)

  • Fatal error when cookie not set after login (#1617)

  • Sort members by status (#1618)

  • Several PHP 8.1 compatibility fixes (#1629, #1655)

  • Groups manager cannot edit their own information (#1635)

  • Inconsistent count and display of reminders members (#1491)

  • Minimum PHP version not displayed on compat page (#1682)

  • Simple members can’t access their list of contributions (#1675)

  • Contributions mass removal (#1661)

  • Disable inline images in mailings (#1659)

  • Issue editing members with wrong values imported in dynamic choice fields (#1650)

  • Parent group removed when a manager edit a group (#1648)

  • Fix logo size on member card (#1626)

  • Fix timeout using logo on PDF member cards (#1726)

  • Fix dynamic files on contributions and transactions (#1697)

  • Drop required fields on PDF member cards (#781)

  • Parent group can be lost when a groupmanager edits a group (#1708)

  • Mass add contribution fail if data is missing (#1694)

  • Dynamic contribution fields not rendered on advanced search (#1693)

  • Dynamic contributions choice fields on advanced search fail using postgres (#1692)

  • Several minor issues with RTL languages on PDF generation (#1727)

  • Issues on transactions search with some date formats (#1731)

  • Selected members were not reset creating a new mailing (#1742)

Under the hood…

  • Template rendering is now assumed by Twig instead of Smarty (#1619)

  • Use of Fomantic UI framework for whole display (#1324)

  • Update third party libraries

  • No longer use atoum (dead project) for testing (#1674)

  • LibreJS compatibility (#1642)

Legacy versions