Release notes copied from the original ejabberd 25.10 announcement post:
Release Highlights:
- Added more Ad-Hoc Commands from XEP-0133
- Updated support for XEP-0317 Hats
If you are upgrading from a previous version, there are no mandatory changes in SQL schemas, configuration, API commands or hooks.
Other contents:
- New option
archive_muc_as_mucsubinmod_mam - Removed support for Erlang/OTP older than 25.0
- Support for the new Erlang
maybeexpression - Rename
NewSQL schema toMultihost, andDefaulttoSinglehost - Improved GitHub Workflows
- Acknowledgments
- Improvements in ejabberd Business Edition
- ChangeLog
- ejabberd 25.10 download & feedback
Below is a detailed breakdown of the improvements and enhancements:
New option archive_muc_as_mucsub in mod_mam
When this option is enabled incoming groupchat messages for users that have MucSub subscription to a room from which message originated will have those messages archived after being converted to mucsub event messages.
Removed support for Erlang/OTP older than 25.0
The ejabberd 24.12 release announcement explained that support for Erlang/OTP older than 25.0 was discouraged, it would be deprecated in future releases, and completely removed sometime after ejabberd 25.01. That explanation was mentioned several times in the subsequent ejabberd releases.
The initial reason to require Erlang/OTP 25 was that this version is the lowest we can easily use nowadays for running the CI tests.
Other reasons to remove support for Erlang lower than 25 are: to support maybe expression, and to remove duplicate code.
In order to support both new and very old Erlang/OTP versions, ejabberd source code included many duplicate code. All that duplicate code that is nowadays useless will be removed in a future ejabberd release.
Support for the new Erlang 'maybe' expression
The new maybe expression is supported since Erlang/OTP 25 (requires being enabled), and it is enabled by default since 27.
Now that ejabberd requires Erlang/OTP 25, and it enables the maybe expression, this can be used freely in ejabberd source code and modules.
See:
- Erlang Documentation:
maybeExpression - EEP 49: Value-Based Error Handling Mechanisms
Rename 'New' SQL schema to 'Multihost', and 'Default' to 'Singlehost'
When ejabberd first got support for SQL storage, it only supported one vhost, so it made sense to not store the host in the SQL tables. Additionally, the SQL schema in ejabberd followed that of jabberd14, which didn't support multiple vhosts either.
When ejabberd got support for multiple vhosts, if several of them want to use SQL storage, the solution is to configure a different SQL database for each vhost using the host_config toplevel option.
However, when there are many vhosts configured in ejabberd, all of them using SQL storage, it is preferable to setup one single SQL database, and store the vhost in the tables. When that feature was added to ejabberd, it got the name of "new SQL schema". And the previous SQL schema was called "legacy", "old", and nowadays "default".
The problem with the terms "default" and "new" is that they are circumstantial, and do not really describe the schema features or purposes.
Now those terms have been renamed:
- "default SQL schema" ⟹ "singlehost SQL schema"
- "new SQL schema" ⟹ "multihost SQL schema"
Right now all names are supported, the previous (obsolete) and the renamed (preferred). No changes are needed in your existing configuration file or building instructions, but it is preferable if you can update your setup to the new terms:
When preparing configuration, the old and new arguments are:
./configure --enable-new-sql-schema
./configure --enable-multihost-sql-schema
When configuring ejabberd, the old and new toplevel options are:
new_sql_schema: true
sql_schema_multihost: true
When developing source code, the old and new functions are:
ejabberd_sql:use_new_schema()
ejabberd_sql:use_multihost_schema()
New API Commands
Several ejabberd modules implement new API Commands, most of them inspired by XEP-0133:
ejabberd_admin:- mod_admin_extra:
- mod_announce:
- mod_muc_admin:
Added more Ad-Hoc Commands from XEP-0133
XEP-0133 describes 31 administrative tasks that should be available as ad-hoc commands.
ejabberd already implemented many of those ad-hoc commands in mod_configure, but there were a few missing that nowadays are fairly easy to implement: this new ejabberd release supports all of them... except 5.
The five ad-hoc commands from XEP-0133 that are not supported are:
6. Get User Password, because it was already retracted in the XEP and should not be implemented12. Edit Whitelist, because the corresponding feature is not implemented in ejabberd27. Set Welcome Message, because in ejabberd this message is set in the configuration file, optionwelcome_messageof mod_register28. Delete Welcome Message, for similar reason29. Edit Admin List, because in ejabberd the administrative rights to accounts are granted in the configuration file, toplevel optionacl.
On the other hand, ejabberd implements more than 200 API commands in all over its source code, providing those and many other administrative tasks. And you can execute those API commands using the command line, ReST calls, XML-RPC, WebAdmin, ... and ad-hoc commands too!!! See the available API frontends.
Nowadays, all the ad-hoc commands described in XEP-0133 have a similar API command in ejabberd that you can execute using ad-hoc commands too:
| Ad-hoc command in XEP-0133 | Status in ejabberd 25.10 | Equivalent API command |
|---|---|---|
| Add User | 〽️ (no vCard arguments) | register |
| Delete User | ✅ | unregister |
| Disable User | ✅ | ban_account |
| Re-Enable User | ✅ | unban_account |
| End User Session | 〽️ (argument) | kick_session |
| Get User Password (retracted) | ▶️ (retracted) | check_password |
| Change User Password | ✅ | change_password |
| Get User Roster | 〽️ (result syntax) | get_roster |
| Get User Last Login Time | ✅ | get_last |
| Get User Statistics | ✅ | user_sessions_info |
| Edit Blacklist | ▶️ | add_blocked_domain |
| Edit Whitelist | ❌ | - |
| Get Number of Registered Users | ✅ | stats |
| Get Number of Disabled Users | ✅ | count_banned |
| Get Number of Online Users | ✅ | stats |
| Get Number of Active Users | ✅ | status_num |
| Get Number of Idle Users | ✅ | status_num |
| Get List of Registered Users | ✅ | registered_users |
| Get List of Disabled Users | ✅ | list_banned |
| Get List of Online Users | ✅ | connected_users |
| Get List of Active Users | ✅ | status_list |
| Get List of Idle Users | ✅ | status_list |
| Send Announcement to Online Users | ✅ | announce_send_online |
| Set Message of the Day | ✅ | announce_motd_set_online |
| Edit Message of the Day | ✅ | announce_motd_update |
| Delete Message of the Day | ✅ | announce_motd_delete |
| Set Welcome Message | ▶️ | (option welcome_message in mod_register)
|
| Delete Welcome Message | ▶️ | (option welcome_message in mod_register)
|
| Edit Admin List | ▶️ | (option acl)
|
| Restart Service | ✅ | restart_kindly |
| Shut Down Service | ✅ | stop_kindly |
Status legend:
- ✅ Implemented in ejabberd exactly as XEP-0133 describes it
- 〽️ Implemented with same command name, but different arguments or results
- ▶️ Not implemented as XEP-0133 says, but we have an alternative solution
- ❌ Not implemented in ejabberd in any way
Updated support for XEP-0317 Hats
Support for XEP-0317 Hats is improved from 0.2.0 to the latest 0.3.1.
Previously, the XEP lacked some use cases, and ejabberd implemented them as custom additional features, as documented in MUC Hats. Now that the XEP includes all those additions, ejabberd strictly follows XEP-0317 version 0.3.1.
Improved GitHub Workflows
The ejabberd git repository contains several GitHub Workflows to test automatically the source code with static and dynamic tools, build installers and containers.
Those workflows recently got several improvements:
- Run agnostic-database tests only once, not for every backend
- Add local composite actions to manage ejabberd and databases
- Reorganize steps in the CI workflow to run in parallel jobs
- Use ARM runners to build ARM installers and containers, no need for cross compiling
- Use ARM runners instead of x86 when possible, as they run faster
- Cache dependencies and download from CDNs when possible
With all those improvements, the workflows complete (or give some error report) in less than 10 minutes, instead of the 30 minutes that were common before.
For details about those changes, check PR 4460
Acknowledgments
We would like to thank the contributions to the source code provided for this release by:
- Guus der Kinderen for update XMPP-Interop-Testing
- Holger Weiß for mod_push cosmetic changes
- marc0s for the new
push_send_notificationhook - Pouriya Jahanbakhsh for pass HTTP headers from WS to C2S connection
- Yurt Page for updating the Russian translation
And also to all the people contributing in the ejabberd chatroom, issue tracker...
Improvements in ejabberd Business Edition
Customers of the ejabberd Business Edition, in addition to all those improvements and bugfixes, also get the following changes:
- The
bulk_roster_updateAPI command now accept a list of groups. - The
mod_dedupmodule has been improved to handle received markers. This module was added in 4.2508 to prevent both delivery and storage of duplicates in archive. - Fixed a case where a mobile client was not able to retrieve all the messages received while it was offline after a temporarily loses of its data connection.
ChangeLog
This is a more complete list of changes in this ejabberd release:
Ad-hoc Commands
mod_configure: New ad-hoc commands that were missing from XEP-0133mod_adhoc_api: Add support for asynchronous command callingmod_adhoc_api: If argument is a list of jids, type isjid-multimod_adhoc_api: If field has several values, type istext-multi
API Commands
- Add commands argument type
binary_or_list mod_http_api: Format sub elements for tuples from mapsmod_admin_extra: Improve roster API commands documentationmod_announce: New API commands, reusing existing ad-hoc functionsejabberd_admin: New API commandrestart_kindly, improvestop_kindlymod_admin_extra: New API commandslist_bannedandcount_bannedmod_admin_extra: Improve API commandstatus_list: support for status to be a listmod_muc_admin: New API commandsmuc_get_registered_nickand nicks (#4468)- Use
mod_private:del_datainunban_accountAPI command
Configuration
- Rename
NewSQL schema toMultihost, andDefaulttoSinglehost(#4456) - Add config transformer from
use_new_schema->sql_multihost_schema mod_sip: Fix problem parsingviainyconflibrary (#4444)
Erlang/OTP support
- Enable feature
maybe_exprin the compiler for Erlang/OTP 26 (#4459) - Enable feature
maybe_expralso in the runtime for Erlang/OTP 25 - Runtime: Remove Erlang 24 which won't work anymore with
maybe_expr - Remove
EX_RULEandEX_STACKmacros only used with ancient erlang
GitHub Workflows
- CI: Bump XMPP-Interop-Testing/xmpp-interop-tests-action (#4469)
- CI: Don't care to include commit details in the CT logs HTML page
- CI and Runtime: Reorganize steps to run in parallel, and ARM runner (#4460)
- Add local composite actions to manage ejabberd and databases
- Container: Build ARM in native runner instead of QEMU, merge and clean
- Installers: Generate ARM installers in native runner
- Tests: Run agnostic-database tests only once, not for every backend
- Tests: The odbc backend is not actually used in Commont Tests
- Weekly: New workflow that condenses CI, test all erlang without caching
Installers and Containers
- Bump Erlang/OTP version to 27.3.4.3 in installers and container
- Bump Expat 2.7.3, OpenSSL 3.5.4, unixODBC 2.3.14 in installers
MUC
mod_mam: New optionarchive_muc_as_mucsubmod_muc: Check if room is hibernated before calling mod_muc processmod_muc: Update implementation of XEP-0317 Hats to version 0.3.1 (#4380)mod_muc: Make mod_muc_sql properly handle new hats data (#4380)mod_muc_room: Don't require password if user is owner of roommod_muc_admin: Use in WebAdmin the new API commands that get nick registers
Core and Modules
ejabberd_http_ws: Pass HTTP headers from WS to C2S connection (#4471)ejabberd_listener: Properly passsend_timeoutoption to listener socketsejabberdctl: When ping returns pang, return also status code 1 (#4327)ext_mod: Print module status message after installationmisc: json_encode should always call json with our filtermod_admin_update_sql: Use same index name than when creating databasemod_block_strangers: Clarifyaccessandcaptchadocumentation (#4221)mod_http_upload: Encode URL before parsing, as done beforebba1a1e3c(#4450)mod_private: Adddel_data/3,get_users_with_data/2,count_users_with_data/2mod_pubsub: Don't catchexit:{aborted, _}inside mnesia transactionsmod_push: Run new hookpush_send_notification(#4383)- WebAdmin: Respect newline and whitespace characters in results
Full Changelog
ejabberd 25.10 download & feedback
As usual, the release is tagged in the Git source code repository on GitHub.
The source package and installers are available in ejabberd Downloads page. To check the *.asc signature files, see How to verify ProcessOne downloads integrity.
For convenience, there are alternative download locations like the ejabberd DEB/RPM Packages Repository and the GitHub Release / Tags.
The ecs container image is available in docker.io/ejabberd/ecs and ghcr.io/processone/ecs. The alternative ejabberd container image is available in ghcr.io/processone/ejabberd.
If you consider that you've found a bug, please search or fill a bug report on GitHub Issues.