Hello everyone,
The following version of Totara has been released:
This version contains security fixes as well as bug fixes and improvements.
A big thanks to the following people for their contributions to this release:
- * Catalyst IT - TL-44414 - Catalyst IT
- * Dan Marsden at Catalyst - TL-43795 - Dan Marsden at Catalyst
- * Petter Fogelqvist at Aleido - TL-43481 - Petter Fogelqvist at Aleido
Kind regards Release Team
Release 19.1.0 (08th July 2025):
Important:
TL-43428 Updated the list of countries in lang/en/countries.php as per ISO 3166-1
Source: https://www.iso.org/obp/ui/
The significant changes are:
* North Macedonia
* Eswatini
* Netherlands (Kingdom of the)
* Taiwan (Province of China)
* Holy See
All other changes are formal, such as changing the letter case of the ‘And’
(the current ISO uses the lower case ‘and’). Our own existing modifications
of the list (such as having just ‘United States’ and ‘United Kingdom’
instead of the full long name) were kept.
TL-44293 Added check for empty keys array to redis and memcached implementation of delete_many
Previous versions of the Redis extension for PHP ignored the missing parameter,
but a recent update caused cache deletion to fail with an exception when asked
to delete nothing.
Without this patch, upgrading PHP (even to the same minor version) on a site
using Redis for caching can prevent users from creating a new course.
Security issues:
TL-42851 Prevented API errors from revealing absolute paths in normal error mode
TL-43031 Added security check related to the CSV report export format
Added a new warning to the security report when a site uses the CSV report
export format. CSV (Optimised for Excel) should be used instead.
TL-43046 Removed 5x multiplier from guest session expiration (CVE-2024-55648)
TL-43048 Improved handling of group access to ensure correct record visibility (CVE-2024-55646)
TL-43050 Improved validation to restrict users from viewing others with a specified tag (CVE-2024-55644)
TL-43202 Added a new warning to the security report if local IP addresses have not been blocked
TL-43204 Fixed an insecure redirect problem
TL-43220 Improved output cleaning of json_editor emoji node
TL-43231 Improved handling of special characters in json_editor renderer
TL-43368 Updated the metadata fetch functionality to use the local CURL system
TL-43607 Fixed SQL injection risk in course search module list filter (MSA-25-0010) (CVE-2025-26533)
TL-43612 Cleaned drop zone label text in ddimageortext question type (CVE-2025-26528)
TL-43614 Fixed that Feedback responses did not always properly respect separate groups modes (CVE-2025-26526)
TL-43615 Fixed arbitrary file read risk through pdfTeX in TeX filter (CVE-2025-26525)
TL-43788 Fixed IDOR in badges allowing disabling of arbitrary badges (CVE-2025-26531 / MSA-25-0008)
TL-43800 Added a new critical security report that will warn if the setting wkhtml2pdf is enabled
We strongly recommend disabling wkhtml2pdf as an export option and relying on
the regular built in PDF exports. From Totara 20 wkhtmltopdf support is removed.
TL-43912 Fixed a redirect problem with the SSOSAML authentication plugin
TL-44112 Removed hidden grades on some reports for users without permissions (CVE-2025-32045)
TL-44468 Backported MDL-84473: Fixed a security problem with EQUELLA repository (CVE-2025-3642)
TL-44469 Fixed an issue with Dropbox and serialisation (CVE-2025-3641)
TL-44479 Updated TeX filter to prevent remote code execution (CVE-2024-40446)
TL-45240 Disabled caching on the login page (CVE-2025-49513)
TL-45250 Fixed external API's disable introspection setting
New features:
TL-39249 Added ability to remove and restore access to closed participant instances for users with the Manage participant instances capability
Users with the Manage participant instances capability can now remove or restore
access to closed participant instances.
* When access is removed, the participant can no longer access the activity via
that instance or see any reference to it.
* If the participant has other active assignments to the same activity, they
will still retain access through those remaining instances.
* Other users assigned to the activity can still view the removed participant's
responses.
* All performance activity queries that return instance data will now check
whether access has been removed.
TL-43166 Added external API service totara_reportbuilder_get_report for querying select reports
A new GraphQL service has been created to enable users to retrieve reports
created in Totara that have been made available to the API user. Details for
this new service can be found in the schema under
totara_reportbuilder_get_report. The endpoint requires the Report ID, and
optionally accepts a sort column, page number, and saved search ID. Each of
these behaves as they do in the UI.
TL-43427 Added GraphQL services for seminars
The following GraphQL services have been added to the seminars activity module
({{mod_facetoface}}):
* Query {{mod_facetoface_seminar}} - Get a single seminar
* Query {{mod_facetoface_seminars_in_course}} - Query a list of seminars within
a specific course
* Query {{mod_facetoface_event}} - Get a single seminar event
* Query {{mod_facetoface_events}} - Query a list of events
* Query {{mod_facetoface_event_user_booking}} - Gets the user booking for a
given seminar event
* Mutation {{mod_facetoface_event_cancel_user_booking}} - Cancel a user
booking/signup for a seminar event
* Mutation {{mod_facetoface_event_create_user_booking}} - Create a user
booking/signup for a seminar event
New installations will have all necessary capabilities assigned to the API user
archetype by default. Upgraded Totara sites will need to manually assign the
following capabilities to the service user to use these new services:
* {{mod/facetoface:signup}}
* {{mod/facetoface:view}}
* {{mod/facetoface:viewallsessions}}
TL-43476 Added a Capability for accessing Tui samples page and removed the page's login check
* Added a Capability 'totara/tui:samples' for accessing Tui samples page
* Removed the require_login check in /totara/tui/index.php
TL-44011 Added self check-in functionality to seminars
Seminars now support self check-in via a new set of settings that define a
self-attendance window.
When enabled, users can mark themselves as attended to a seminar event by
either:
* Visiting a provided link, or
* Scanning a *QR code*
This feature provides greater flexibility for attendance tracking and reduces
administrative overhead for facilitators.
TL-44174 Added setting to exclude courses from the catalogue
A new *Exclude from catalogue* checkbox has been added to the course settings
page, under *Visibility* settings.
When enabled, the course will be hidden from all catalogue views, including
Explore, Mobile, and Grid catalogues. The course will still be accessible
through other channels, such as:
* Current learning
* Programs and plans
* Direct links
This provides admins with greater control over which courses appear in the
catalogue without affecting course availability elsewhere.
TL-44200 Added webhooks
Totara now comes with webhooks. This allows a third party to subscribe to events
that happen in Totara and have them sent as they occur.
This opens up the 900+ events in Totara to send out delta updates as they occur.
The requests are signed so that third parties can verify that the content comes
directly from Totara and hasn’t been tampered with. Webhooks also ships with a
data sanitation hook, allowing custom plugins to redact or expose the data that
is sent out.
TL-44414 Added the Excimer profiling plugin
If you have the Excimer PHP extension installed, this plugin can be used to
capture and investigate slow performing requests.
TL-44443 Added self enrolment options for programs and certifications
It is now possible to configure programs and certifications to allow learners to
self-enrol. This is achieved through a new assignment type called Groups.
In the Assignments interface within programs and certifications, administrators
now have the option of creating one or more assignment groups. A group is a
collection of users whose members can be controlled within the program or
certification. When created, administrators can give the group a name and
description which are used to inform learners as to the purpose of the
assignment group. A completion date can be set on a group, and all users who
join the group will be given that due date.
Administrators can configure each group to allow self-enrolment and, separately,
withdrawal. When ‘Allow learners to enrol’ is enabled, learners can enrol in
the group using the Enrol button provided on the program or certification
overview page. Likewise, if ‘Allow learners to withdraw’ is enabled,
learners can use the Enrolment options link to remove themselves from the group.
As well as allowing self-enrolment, the new group assignment type can be used as
an easier way to manage individual assignments. Administrators can optionally
manually manage the individuals within groups. Administrators can choose to
disable both learner enrolment and withdrawal - in this case the group will only
contain users manually added by an administrator. This provides the benefit of
being able to configure the completion date for all users in the group at once,
rather than setting it for each individual individually. Additionally, managing
individuals in groups rather than as Individual assignments means that the main
Assignments list will be easier to manage.
TL-44818 Added a new settings page for enabling new features and improvements in minor releases
Performance improvements:
TL-40368 Improved performance for resetting / archiving course completions for courses with a large amount of users by running actions in bulk
TL-42203 Added an option to reports to disable the visibility check when rendering user profile links
Complex setups can significantly slow down profile visibility checks in reports.
With this change, a new option is now available on the performance tab. If this
option is enabled, the link to the user's profile will be displayed without
checking for a valid relationship. If no relationship exists, clicking on the
profile link will result in a ‘permission denied’ error.
TL-42960 Optimised audience, organisations and positions preloading in course restriction settings
TL-43184 Improved the performance of generating role maps for approval workflows
TL-43188 Improved the performance for mobile completed learning API calls
Previously the completed learning API was fetching the entirety of a users
completed learning, before combining learning types, and paginating. This could
potentially lead to a performance hit for users with large amounts of completed
learning, so we have limited this to the 100 most recently completed items of
each type.
TL-43676 Improved performance of menu item checks for course category and content marketplace administration
TL-44131 Improved performance when loading tiles in Explore catalog blocks
We improved the queries used to retrieve information needed to display the tiles
in Explore catalog blocks resulting in a reduction in the number of database
queries.
TL-45056 Added caching for user profile custom fields to improve HR Import performance when importing many custom fields for a user
Improvements:
TL-37496 Added a check to the performance overview report for users with the prohibit capability flag
The performance overview report now includes a check that respects the prohibit
capability flag.
This ensures that users explicitly prohibited from accessing certain performance
data (via capability settings) are correctly excluded from report results -
enhancing alignment with role-based permission controls.
TL-39382 Enabled AI course tag suggestions generated for draft course content
TL-41009 Added pagination to the categories in the courses and categories page
Pagination has been introduced for the categories list on the Courses and
categories page.
This feature improves performance and usability when managing large numbers of
categories.
TL-41805 Added information about pathway format to the course format help text
TL-41897 Added support for filters in the mobile find learning API
TL-41993 Added support for the progress bar to the mobile catalogue API
TL-42136 Improved positioning of buttons when restoring a backed up course
TL-42258 Increased the program 'fullname' database field length to better support multi-language
Increased the program ‘fullname’ database field length from 254 to 1333
characters.
TL-42378 Improved spacing between the user image and a glossary entry
TL-42401 Improved the user interface for managing filters in a course
TL-42430 Improved accessibility of notification close buttons
TL-42521 Added total number of Totara goal tasks to product usage data
TL-42522 Added total number of Totara goal comments to product usage data
TL-42651 Added configurable fallback SQL 'LIKE' search to catalogue
A new fallback SQL LIKE search has been added to enhance catalogue search
functionality.
This fallback can be configured in catalogue settings to run:
* Always
* Only when no results are found
* Or never
This feature provides more flexible search behavior, especially when exact
matches aren't available.
TL-42704 Increased side panel height to match the content
TL-43005 Improved the alignment of sections and activities when editing courses
TL-43089 Trigger events for assigning and un-assigning audiences from programs
This change can be opted out by adding {{$CFG->revert_TL_43089_until_t20 =
true;}} in your {{config.php}} file. However it will be enforced for Totara 20.
TL-43185 Added the ability to rotate the client secret for a specific external API client
When the client secret for an external API client is rotated, all existing
access tokens are deleted, and the client secret value is regenerated. This
means any external integrations relying on the existing client secret value will
need to be updated, and any sessions relying on existing access tokens will be
invalidated.
TL-43212 Improved the error string when the mobile server is not reachable
TL-43386 Added options to compress (.zip) scheduled report attachments and limit file size
Within the settings of a Scheduled report, there is now a ‘Compress file’
checkbox which can be selected to compress the file size of the scheduled
report.
TL-43487 Added IP whitelisting support for external API clients
This update introduces the ability to restrict external API client access to
specific IP addresses via whitelisting.
* Requests from non-whitelisted IPs are rejected based on the configured *API
debug level*:
** {{None}}: returns ‘404 Not Found’
** {{Normal}}: returns ‘403 Forbidden’
** {{Developer}}: returns a detailed GraphQL error
* Blocked requests are logged server-side for auditing
* Site-level IP restrictions remain in effect as an additional layer of control
* If no whitelist is configured, access is unrestricted, unless limited by
existing site-level security settings
This feature enhances security by allowing tighter control over which clients
can access external APIs.
TL-43528 Added timemodified as properties for hierarchy positions and organisations in GraphQL and the ability to filter records on since_timemodified
Added {{timemodified}} property to {{hierarchy_position_position}},
{{totara_hierarchy_position}}, {{hierarchy_organisation_organisation}}, and
{{totara_hierarchy_organisation}}. Added {{since_timemodified}} filter to the
{{hierarchy_position_positions}} and {{hierarchy_organisation_organisations}}
queries.
TL-43586 Added Custom script for migrating theme settings from Ventura to Inspire
TL-43616 Added mobile API support for selected offline activities
Added support for offline activity types in the mobile API, including:
* Labels
* Pages
* Files
* Certificates
These activity types are now accessible via mobile endpoints, improving support
for offline learning scenarios.
TL-43631 Updated default capabilities of API user archetype to include `totara/hierarchy:vieworganisationframeworks` and `totara/hierarchy:viewpositionframeworks`
Previously, the API user archetype (role) did not include the necessary
capabilities to view the organisation and position frameworks on the position
and organisation return types.
On fresh installs, these capabilities will be automatically added to the API
user archetype. On existing installs, the capabilities will need to be manually
assigned to the archetype. See
[https://totara.help/docs/edit-a-role|https://totara.help/docs/edit-a-role|smart-link]
for more information.
TL-43634 Added handling for OAuth 2.0 responses that contain an error parameter
TL-43709 Added system status check for ephemeral configuration flags
From time to time, Totara bug fixes will include settings that allow system
administrators to temporarily revert to previous behaviour until the next major
release. This check attempts to detect any use of those settings in config.php,
and report them on the system status report, or via the check CLI at `php
server/admin/cli/checks.php`.
TL-43820 Changed the behaviour for HR Import to add a confirmation prompt that displays when an import source contains fewer records than the site does and the 'Source contains all records' setting is set to 'Yes'
When a user provides a CSV or external database with fewer records than the site
has, and the ‘Source contains all records’ option is set to 'Yes', the
existing records in the site are deleted and replaced with the records defined
in the import source.
This change adds a message that displays the percentage difference between the
number of records in the import source versus the number of existing records in
the site. This message must be confirmed before the import runs to ensure the
user acknowledges the potential data loss impact of running the import.
TL-43886 Added Security overview report and Site performance overview report as new options to the Diagnostics for support tool
TL-43887 Added 'Require passing grade' completion option to external tool activity
It is now possible to configure completion of external tool activities to
require a passing grade.
This change can be opted out by adding $CFG->revert_TL_43887_until_t20 = true;
in your config.php file. However it will be enforced for Totara 20.
TL-43934 Added support for using a query builder in repository-only contexts
Introduced {{core\orm\query\query_builder_to_repository_adapter}}, an adapter
that allows a query builder to be used in situations where only a repository is
permitted - such as in data provider classes.
TL-44018 Added Totara 20.0.0's definition to the environment checks page
TL-44119 Changed the behaviour for HR Import to prevent importing an empty source when the 'Source contains all records' setting is set to 'Yes'
Previously, if a user provided an empty CSV or external database, and the
‘Source contains all records’ setting was set to ‘Yes’, importing would
result in all the records of that element type being deleted.
With this change, the new behaviour will be to log an exception and prevent that
element from importing. This does not prevent subsequent elements from running
if they have a valid file.
TL-44127 Wrapped update_certification_task operations in a try-catch and transaction block
Previously, the totara_certification\task\update_certification_task scheduled
task would stop processing if a failure occurred for one record. It would not
process the following records.
The next time the task ran, it would try to process the same record again and
possibly fail again. As the records are probably ordered, it means that the
records following the failing record would never be processed.
This patch wraps the operations which might fail in a transaction and catch any
exceptions and continues to the next record.
TL-44130 Added usage data for catalogue configuration
TL-44184 Updated Recommendation block cards to match catalogue card styling
TL-44277 Updated Latest badges block to center-align badges
TL-44279 Added rounded corners to the Featured links block and fixed width of the full-width no-margin link
This update improves the visual consistency of the Featured links block:
* Added rounded corners to block tiles to match the standard card style,
(excluding the full-width, no-margin tile, which retains its original shape)
* Fixed layout of the full-width, no-margin tile so it correctly displays
without margins at desktop width when using the Inspire theme
TL-44280 Added wider spacing to the Featured link tile content and aligned text typography styling to match the design system
TL-44296 Improved spacing on the upcoming Events block
TL-44303 Removed horizontal padding for Calendar block content when it has no border
TL-44430 Updated the scheduled reports task to identify which report is being processed
When the report builder scheduled report task is executed on the cron, the
system now outputs the scheduled report ID and report name prior to each report
being generated. This can assist with debugging performance issues.
TL-44686 Separated Trending content into its own block, distinct from the Recommended for you block
As of Totara 19.1, the Trending recommendation type has been split into a
dedicated block, separate from the Recommended for you block.
* The Trending recommendation type is still supported in 19.1 for backward
compatibility
* It is planned for removal in Totara 20
This change improves clarity and content targeting by distinguishing trending
items from personalised recommendations
TL-44727 Added "Did you mean" spellcheck suggestions to catalogue search
This feature can be enabled in the catalogue configuration settings.
It requires the PSpell PHP extension to be installed, as well as the user’s
selected language to be installed.
TL-44881 Updated the English help text for the 'Locked' field in the Edit Dashboard form to improve clarity
TL-44917 Fixed HR Import jobs run via the user interface from blocking other page activity
Previously, running an HR Import job through the user interface would lock the
user’s session, preventing them from performing other actions or loading pages
in additional tabs.
This update unlocks the session after the import job starts, allowing users to
continue working elsewhere in the system without encountering error messages.
TL-44923 Improved error message when session cannot be started
Previously, the error shown when a session couldn’t be obtained only suggested
a server issue. The updated message now also indicates that the error may be
caused by another parallel request still in progress, helping users better
understand the possible cause.
TL-44931 Improved the clarity of the heading for the dashboard edit page
The heading on the dashboard edit page now better reflects the action being
performed:
* When creating a dashboard, the heading is now 'Create dashboard'
* When editing a dashboard, the heading displays the dashboard’s name
This change improves clarity and aligns the page title with the user’s current
task.
TL-45088 Renamed the 'Experimental' category under Development in Site Administration to 'New and experimental'
TL-42589 Improved accessibility by adding aria-live attribute to announce results when filtering a report
TL-43973 Improved accessibility on the multiselect legacy adder
Users using the legacy adder can now remove selected items with keyboard only
and “x” icon is shown on all selected items at all times and not just on
hover.
Visual improvements:
TL-42883 Improved the creation of performance activities, the first section will now be set to edit mode by default
TL-44498 Improved label alignment in self-enrolment card layout
Bug fixes:
TL-33788 Fixed an error when trying to update the content of a learning plan containing hidden programs
TL-35659 Added the ability to purge user data for active applications in approval workflows
TL-36096 Added aria-expanded to all Tui Dropdown triggers that were missing it
TL-37948 Fixed an error in the 'Self-registration requests' report that occurred when the Tenant Member column was included
The issue was caused by a missing database join, leading to a DB error when
generating reports containing this column.
TL-38355 Ensured that guests can view activities on a pathway course
TL-38698 Fixed users being unsubscribed when subscription mode changes from 'Forced subscription' to 'Auto subscription'
TL-39006 Removed whitespace from the bootstrap breadcrumb separator
TL-39836 Removed site policy consent requirement for external API and legacy web services requests
Previously, site policy consent was required for service users making external
API and legacy web service requests. This caused issues where service users -
used for external calls to Totara APIs, which weren’t designed for user logins
- were forced to log in and consent to the site policy when the site policy was
enabled or updated.
This update removes the site policy consent requirement for requests originating
from GraphQL or legacy web services.
Note: Service users will still need to consent to the site policy if they are
used within the normal user interface.
TL-39906 Fixed some race conditions with localcache when the cache is purged on a busy site
Mustache, htmlpurifier and RequireJS will check if the cache directory is
writeable. If it is not, they will log a message to the debugging logs but will
still serve the content.
If you have directly edited the caching files for these libraries in localcache,
you may need to check that your customisations are still writing content as
expected.
TL-40189 Fixed forced delivery channels not overriding recipient 'Disable all notifications' setting
When using legacy notifications, it was possible to force delivery of
notifications, even when the recipient had turned on the ‘Disable all
notifications’ setting. In centralised notifications, it was intended that
forcing a delivery channel would have the same result. This has been fixed. This
change also re-enables notifications to be shown in the bell popup, allowing
recipients to see notifications they received in the past or new notifications
sent by forced delivery.
This change can be opted out by adding $CFG->revert_TL_40189_until_T20= true; in
your config.php file. However it will be enforced for Totara 20.
TL-40261 Fixed an issue where cohort role category context was not updating after deleting a category
TL-40320 Fixed error on My Goals page caused by duplicates created when 2 operations ran at same time
TL-40371 Fixed seminar custom fields not being saved when a job assignment is selected during signup
TL-40450 Fixed an issue in the user upload tool that was blocking uploads for users with unique profile fields
TL-40682 Added multi-language support for the Oauth2 plugin
TL-40775 Removed extra role assignments when changing assigned roles in enrolment methods for courses
This change can be opted in by adding $CFG->enable_TL_40775_until_T20 = true; in
your config.php file. However it will be enforced for Totara 20.
TL-40822 Fixed an issue where the seminar signups report was containing duplicate records for session attendance
TL-40827 Fixed learning plan not respecting the global ‘Default role’ or ‘Enrolment period’ settings for new instances
TL-40871 Fixed the language menu on the legacy login page to display only when the setting is enabled
TL-41033 Fixed error when showing custom profile fields that are both locked and required
TL-41065 Removed HTML tags from 'Element response' column of 'Performance activity response data' report when exporting as CSV or Excel
TL-41222 Fixed an accessibility issue where tabbing would move focus incorrectly on an un-contained dropdown
TL-41329 Improved performance of the 'delete_completion_logs' task
Limited delete_completion_logs task to 5 minutes
TL-41331 Fixed bug in audience sync enrolment method due to deleting context in role
TL-41642 Fixed wrong parameter in program due dates report
TL-41712 Fixed page layout in some situations with the Pathway course format
TL-41771 Resolved a dependency error when adding the block_totara_report_manager block to a dashboard's top region
TL-41793 Fixed Totara goal snapshots not showing up for deleted goals on closed performance activity sections
TL-41949 Disallowed 'Reset course completion' when the course is part of a program or certification
Previously, after releasing Totara 15.1, the site manager was able to reset
course completion (archived and reset the user course completions) even if a
course is part of a program and/or certification.
This change is reverting the functionality before Totara 15.1 was released. The
change introduces a new configuration
{{$CFG->allow_course_completion_reset_for_program_courses}} which will force a
course completion to archive and reset the user completion records with program
and/or certification assigned.
TL-42086 Fixed a division by zero error in the SCORM save_offline_attempts query for mobile API
TL-42160 Fixed a problem where some reports with null values were unable to be exported when using PHP 8.1 or greater
TL-42435 Moving activities between course sections is now done in a database transaction to avoid broken sequences if something goes wrong
TL-42497 Updated the border colour of the active pagination button to match its background colour through the use of a variable
TL-42581 Removed tab index wrapping content in a YUI modal
TL-42584 Improved screen reader text of icons when managing courses, programs and certifications
TL-42588 Updated notification roles from 'log' to 'status' for better screen reader accessibility
TL-42590 Improved accessibility when filtering seminar sessions
TL-42591 Fixed issue where editing a hierarchy item could incorrectly move it to a different framework
TL-42603 Fixed error when exporting report with tenant filter
TL-42686 Allowed decimal and integer custom fields to be optional
Decimal and integer custom fields can now be set as optional in forms. If a user
does not specify a value, the default value for the field will be used.
TL-42694 Fixed being able to add members to a workspace even if an exception was thrown
TL-42709 Fixed error message while searching for users in comments with mixed context
TL-42736 Improved learning plan and cohort alert user interface issues
TL-42800 Fixed application dashboard table column values overlap
Fixed the ‘applicant’ column values overlapping with the ‘submitted on’
column in workflow application dashboard table.
TL-42802 Removed double borders from competency scale action buttons
TL-42810 Updated the toggle switch to display the correct colour when in an active disabled state
TL-42828 Fixed incorrect ARIA attribute on competency assignment list rows
TL-42834 Fixed CSS styling for the title and help icon on the ‘Edit proficiency value by assignment' page
TL-42874 Fixed incorrect aria-labelledby attribute on the Engage contribution modal
TL-42887 Fixed approval workflow application header action buttons height
TL-42898 Removed empty link 'more help' from help icon popover
TL-42934 Fixed the reset button on Seminars 'Upcoming Events' filter not being translatable
TL-42981 Fixed the formatting of seminar descriptions created using Weka when included in iCalendar attachments
TL-43008 Fixed a situation where duplicates could be shown when viewing another user's Library
TL-43059 Fixed footnote display, including reviewed item count, for workspace library cards loaded using the Load more button.
TL-43244 Added exit activity button to SCORM activities
Added an "exit activity" button to SCORM activities so that when activities are
dependent on the SCORM being completed then it can be "exited" which will take
the user to the start page of the activity. This updates the activities and
unlocks any dependent activities that were previously restricted.
TL-43297 Prevented the autofill of username and password fields when creating a new user
TL-43313 Added missing variable in catalog filter results
Added missing {{native}} field to {{mobile_findlearning_filter_catalog}} query.
The lack of this field meant that if you ran a search on the mobile app, then
opened a course it would always assume it was not a mobile friendly course, and
open it via webview instead of natively.
TL-43357 Fixed string encoding for course activity completion report when export Excel-compatible option used
TL-43399 Fixed some incorrectly named graphql queries for mobile sub-plugins
Previously ‘mobile_currentlearning_my_items’ and
‘mobile_completedlearning_my_items’ were misnamed and defaulting to the core
versions ‘totara_mobile_current_learning’ and
‘totara_mobile_completed_learning’. These queries have been fixed for use in
the mobile app, the default queries remain operational for backwards
compatibility.
TL-43453 Hid 'Create playlist' option when user has no permission to create playlists
Additionally, the ‘Create new’ button in Your Library has been hidden
altogether if the user does not have permission to create any items.
TL-43481 Fixed a Tui build error that occurred when using the --vendor parameter
TL-43508 Fixed catalog URL incorrectly parsed when using multiple filters/ordering
TL-43519 Fixed console error when user lacks view capability for current learning block
Current learning block js would attempt to run even when the block was not
rendered
TL-43524 Added padding top and bottom to chromeless block content to improve readability
TL-43569 Excluded instance results where the user does not have access from being shown on the performance activity 'Select participants' page
TL-43589 Fixed missing entries in thirdpartylibs.xml
TL-43613 MDL-83941: Fixed issue where users could browse unsearchable tag collections (CVE-2025-26527)
TL-43716 Fixed email HTML header and footer customisations for the Inspire theme
Previously we hard-coded the 'category' setting for testing on the Inspire
settings page, we've removed the hard-coded value so that it falls back to the
default value 'brand' and correctly applies the HTML to emails.
TL-43795 Fixed an upgrade error with block_html instances missing data for custom classes
TL-43796 Fixed debug warnings in catalog when a playlist has limited visibility and not shared with any individuals
TL-43825 Fixed rendering of special characters in catalogue block title
TL-43932 Enabled multi-language support for drop-down options in approval workflows
TL-43963 Prevented updates to the timestart field when multiple API calls are made to the enrol_manual_enrol_user service
TL-43997 Fixed the encrypted key rollover job to skip non-encrypted configuration entries
TL-44020 Fixed an accessibility failure where the dismiss button on a notification toast was accessible via the keyboard even though its parent element had aria-hidden
TL-44147 Fixed an error when collapsing the Inspire sidebar while the user is logged out
TL-44183 Fixed error message in explore catalog when all filters are removed
TL-44188 Added title to the 'Create user' page
TL-44190 Fixed a PHP warning that can show when a cURL call is blocked by the IP address blacklist
TL-44289 Fixed an issue on some browsers where reloading the page would incorrectly show a form resubmission warning
TL-44295 Fixed Totara Goals not being locked down properly on non-Perform flavours
This change only affects existing sites without Perform flavour.
It makes sure goals features are disabled unless legacy goals were in use on the
site.
TL-44298 Disabled goals choice setting for flavours that do not include Perform features
As a consequence of this patch, sites without Perform features can still keep
legacy goals enabled if currently in use, but cannot re-enable once it’s
turned off in administration settings.
TL-44339 Fixed an accessibility issue with colour contrast in the current learning block
Implemented consistent white background for "Sets" with a faint grey border.
TL-44376 Fixed an accessibility issue by removing menu bar roles on the legacy primary navigation
TL-44377 Fixed a bug when SAML metadata was signed
In previous versions if you enabled the “Sign metadata” option, the
signature would be applied and then the metadata would be formatted. The act of
formatting the metadata though would change the signature and invalidate it.
With this fix when the metadata is signed we no longer format it for visibility,
leaving it as it was exactly when signed.
TL-44495 Fixed an issue with the positioning of the user tour on inspire theme navigation items
Also added a border radius to the tour popover.
TL-44501 Fixed an error when cache attempts to read a file that is empty
TL-44532 Fixed a bug where the uniform FormField component would have an empty aria-describedby attribute
TL-44597 Updated JMeter script
TL-44653 Fixed a LTI (external tool) authentication issue with JWT
Fixed JWT handling for LTI (Learning Tools Interoperability) authentication to
support strict encoding.
TL-44679 Added missing ARIA attributes on grid catalog details popover
TL-44698 Fixed require passing grade completion criteria not being checked in external tool
TL-44712 Fixed filestore cache so when a file cannot be unserialised it will log a debug message instead of crashing the entire site
TL-44742 Fixed a bug where users who login via SAML were unable to launch LTI activities
TL-44788 Added userdata classes for AI interactions
TL-45007 Fixed a problem when installing Totara without the openssl extension
TL-45036 Courses set to the Single Activity format are now available in the Recently Viewed block
TL-45047 Fixed a user interface issue where the short name would not wrap correctly in admin settings
TL-45125 Updated mobile language strings to match current app requirements
TL-45204 Added an incrementation to query complexity for unresolved GraphQL types
Previously, unresolved types in GraphQL queries or mutations were not factored
into query complexity calculations. This could lead to large responses that
bypass API limits, causing unexpected server load.
This update ensures that unresolved types now contribute to overall query
complexity - if the query or mutation supports it.
In version 19.1.0, this behavior can be temporarily disabled using the
configuration value: revert_TL_45204_until_T20.
TL-40292 Improved accessibility on assignment submission table
TL-44160 Fixed an accessibility issue on the TreeViewNode component where an aria-controls attribute was referencing an element that didn't exist
TL-44375 Fixed a bug where the user profile picture was unintentionally visible to screen readers
TL-44378 Changed the parent container role from 'log' to 'list' to properly contain message items with role 'listitem'
TL-44380 Updated ARIA attributes for message, notification, and admin menu popovers
Database upgrades:
TL-41350 Increased the Fullname column character limit to 1333 characters for the tool_recyclebin_category database table
Technical changes:
TL-41377 Fixed the get_certiftimebase calculation not using user's current window open date
When a certification was configured to use the expiry date for completion
calculations, when calculating if a user’s completion occurred within the
recertification window, it was incorrectly using the certifications current
window period, rather than the window open date used to open the user’s
recertification window. If a user completed a certification after their
recertification window opened but outside the certification’s
currently-calculated window period, this would cause the completion to be
ignored and the user would need to recertify immediately. This change causes the
user’s window open date to be used in the calculation.
This change includes a change to the function get_certiftimebase. This function
now accepts an additional parameter $timewindowopens. This parameter is optional
in Totara 19.1.0 and below and will default to the original behavior if not
provided, but is required in Totara 20 and above.
The new behavior can be opted out by adding {{$CFG->revert_TL_41377_until_t20 =
true;}} in your {{config.php}} file. However, it will be enforced for Totara 20.
TL-43993 New OAuth2 issuers will be encrypted when created
TL-44251 Added the ability to run independent performance tests in PHPUnit
TL-44529 Added a 'tui_props' hook so that plugins can inject or alter page props if necessary
TL-44777 Added a new result type for graphql mutations for richer responses
A new mutation resolver type, mutation_result, has been added. It accepts the
following properties:
* success (boolean) – Indicates whether the mutation was successful.
* return_url (optional string) – A URL the client can redirect to, if
applicable.
* code (optional string) – A machine-readable status or error code.
* message (optional string) – A human-readable message providing additional
context.
These properties allow the server to return richer contextual information that
the client can use to guide follow-up actions.
TL-44789 Refactored core_ai classes to improve developer experience
The AI framework has been upgraded to support the development of new types of
interactions, including generative prompts with file input and/or structured
output, and generative images. Example plugins will be released separately via
the Totara git repository.
TL-44831 Added Encrypt & TrustServerCertificate options for MSSQL PHPUnit tests
Tui front end framework:
TL-41192 Improved Tui Samples page with cleaner components and updated structure
Enhancements to the Tui Samples page include:
* Removal of all code samples for a cleaner and more focused user interface
* General cleanup of sample components for consistency and clarity
* New sections added for events and slots, where applicable, to improve
documentation and usability
These changes aim to streamline the page and make it more useful for developers
and users exploring Tui components.
TL-43181 Fixed race condition in useParamState
Fixed a race condition that could occur when calling .push() or .replace()
followed by immediately updating .value, which would cause the second update to
not be reflected in the URL.
TL-43329 Reorganised Tui Samples component structure to align with the design system
The Tui Samples component structure has been reorganised to better reflect the
structure and guidelines of the design system.
This update improves consistency, discoverability, and maintainability of
component samples, making it easier for developers and designers to navigate and
align with system-wide standards.
TL-43775 Added a chromeless layout to Tui Samples
The chromeless layout on the Tui Samples page removes the header, navigation,
and footer, providing a cleaner, distraction-free view for showcasing user
interface components.
TL-43843 Added mechanism to navigate to Tui Samples for testing
Recommendations engine:
TL-43595 Upgraded the nltk library to 3.9.1 (CVE-2024-39705)
TL-43601 Upgraded the Waitress library to 3.0.2 (CVE-2024-49769)
TL-43719 Fixed an error that can appear when not enough interactions are provided with a new connection
This only occurs when running the machine learning service with enough users and
items, but no interactions, which is rare. With this patch, we now provide an
error in the model and healthcheck indicating if the number of interactions is
too few to make recommendations.
Contributions:
* Catalyst IT - TL-44414
* Dan Marsden at Catalyst - TL-43795
* Petter Fogelqvist at Aleido - TL-43481
