Changes Report

Last modified by Vincent Massol on 2026/09/10 13:54

Improved explanation when creating a translation page

When editing a wiki page in-place you might have seen a "Translate" button if the edited page was missing a translation for the current locale. It wasn't obvious what this button does and the small notification message shown at the bottom of the page was hardly noticeable so we replaced it with a popover that is shown first when you enter edit mode and then whenever you hover the button. We also replaced the notification shown after clicking on the "Translate" button (to create the translation) with a popover on the page title input to invite you to translate the page title.

Data Types

The list of data types (classes) of the XClass Application is now displayed using the Live Data Macro.

Support for native rendering of formulas in SVG

It is now possible to render formulas in SVG using the native formula renderer. This will provide more crisp results, which can easily be resized at will. See the Formula Macro documentation to learn more.

The formula macro exposes a new configuration key to define the default image type to be used when rendering a formula. See the Formula Macro documentation to learn more.

Class Sheet

The list of existing pages with objects described by a class that is provided by the XClass Application as part of the default class sheet is now displayed using the Live Data Macro.

Filters for Static List properties in Live Data

The suggestions in the Live Data Macro's column filters now display labels or translations (if there are any) of the values of Static List properties instead of the plain values. The search for suggestions considers both the displayed label and the underlying value.

SecurityEntryReaderExtra in extensions

It's now possible to contribute a org.xwiki.security.authorization.SecurityEntryReaderExtra component in an installed extension.

Bulletproofed NumberProperty

NumberProperty now accept any kind of Number in input and will automatically convert it to the right type instead of crash at save.

Less strict code verification in the reset password system

We allow to relax a bit the reset password email link security mechanism to avoid it being revoked at first access, in order to avoid issues with software that checks email links. This mechanism can be used by changing a property in xwiki.properties:

#-# [Since 13.10.1]
#-# [Since 14.0RC1]
#-# Define the lifetime of the token used for resetting passwords in minutes. Note that this value is only used after
#-# first access.
#-# Default value is 0 meaning that the token is immediately revoked when first accessed.
#-# Use a different value if the reset password email link might be accessed several times (e.g. in case of using an
#-# email link verification system): in such case the user will have the defined lifetime to use again the email link.
#-#
#-# The default is:
# security.authentication.resetPasswordTokenLifetime = 0

New URL resource scheme for Reset password

The reset password and retrieve username features have been refactored to stop using wiki pages to work. The rationale is that these pages needed to be viewable by the guest user to work, thus making it impossible to protect the full wiki to guests (among other problems related to rights on these pages). Thus they have been re-implemented using dedicated URL schemes and components, and thus have had their URLs changed:

  • Reset password:
    • New URL: /xwiki/authenticate/reset 
    • Old URL: /xwiki/bin/view/XWiki/ResetPassword
  • Retrieve username:
    • New URL: /xwiki/authenticate/forgot 
    • Old URL: /xwiki/bin/view/XWiki/ForgotUsername

The old XWiki.ResetPassword and XWiki.ForgotUsername wiki pages must not be used anymore, and any custom change perform in those pages won't be taken into account (you'll need to port your changes to Java since the new feature is coded in Java). However, the pages have been kept to ensure that using the old URLs will keep working for the time being: the pages now redirect to the new URLs.

Controlling Transformations

It's now possible to control exactly which Rendering Transformations to execute when viewing a page. For example to execute only the macro transformation: http://localhost:8080/xwiki/bin/view/Sandbox/WebHome?transformations=macro.

Raw Macro

When content is parsed, an XDOM tree is created. Sometimes you don't have any way to express the content you wish in that XDOM tree and you only wish that your content is output as is, when the XDOM is then rendered in a given syntax. You can use the raw macro for this need.

Example:

{{raw syntax="latex/1.0"}}
\loadglsentries{glossary}
\makeglossaries
{{/raw}}

Allow to log deprecation warning in scripts

It's possible to log automatically a deprecation warning in a script, to inform users that some scripts might be removed in the future. This method checks the deprecation warnings configuration to only display the message if it is enabled.
You can use it like this:

## First argument is the logger name, second is the message.
$services.logging.deprecate("MyScript", "The script [MyScript] should not be used anymore")

The output warning is displayed with a [DEPRECATED]  prefix.

Empty Content Placeholder in WYSIWYG Editor

The WYSIWYG Editor shows a placeholder text when the edited content is empty and the text area is not focused. See the CKEditor Integration documentation for more information.

Extension Manager UI improvements

The more advanced search features of the Extension Manager are now hidden under a More button by default and more explanation was added to the shown informations.

User Authentication Event

The classic Form and Basic Authentication mechanisms now trigger a UserAuthenticatedEvent event whenever a user is authenticated. As a new best practice, custom authenticator authors are advised to implement this new event.

Less files in WebJar can be compiled to css

Less code packaged in WebJars can now be compiled to CSS when requested. When Less files are compiled to CSS, the less variables defined in the current skin are available and will be resolved to their current values.

Usage examples:

// Returns the raw content of test.less
$services.webjars.url('org.xwiki.platform:xwiki-platform-example', 'test.less')
// Returns the content of test.less compiled to css.
$services.webjars.url('org.xwiki.platform:xwiki-platform-example', 'test.less', {'evaluate': true})

Localization REST API

The localization module is now providing a REST API. This API allows to request the raw source from a set of translation keys.

For instance:

# Request of a single translation, the locale is the default one.
curl -H 'Accept: application/json' http://localhost:8080/xwiki/rest/wikis/xwiki/localization/translations?key=administration.section.users.deleteUser.newAuthor.error
# {"translations":[{"key":"administration.section.users.deleteUser.newAuthor.error","rawSource":"The selected user doesn''t have {0} rights!"}]}

Empty string in Static List

It is now possible to specify empty string values in a Static list by repeating twice the same separator. For example, using the default separators (|, , and space), the Foo||Bar string will be parsed as containing three values (Foo, empty string, and Bar), while Foo, Bar will be parsed as only two values (Foo and Bar), even if two separators (, and space) are used.

Syntax Registry

There's now the concept of a Syntax Registry and new Syntaxes are expected to register themselves in that registry. 

You can list all registered syntaxes using:

@Inject
private SyntaxRegistry registry;
...
List<Syntax> syntaxes = registry.getSyntaxes();

You can also get a Syntax object from a Syntax id string using (for example):

@Inject
private SyntaxRegistry registry;
...
Optional<Syntax> syntax = registry.getSyntax("xwiki/2.1");

See available Syntaxes for more.

Get Connected