ejabberd

ejabberd 24.10

🚀 ejabberd 24.10: The "Bidi" Stream Release

Jérôme Sautret
· 7 min read
Send by email

We’re excited to announce ejabberd 24.10, a major release packed with substantial improvements and support for important extensions specified by the XMPP Standard Foundation (XSF). This release represents three months of focused development, bringing around 100 commits to the core repository alongside key updates in dependencies. The improvements span enhanced security and streamlined connectivity—all designed to make ejabberd more powerful and easier to use than ever.

Release Highlights:

If you are upgrading from a previous version, please note minor changes in commands and two changes in hooks. There are no configuration or SQL schema changes in this release.

Below is a detailed breakdown of the new features, fixes, and enhancements:

Support for XEP-0288: Bidirectional Server-to-Server Connections

The new mod_s2s_bidi module introduces support for XEP-0288: Bidirectional Server-to-Server Connections. This update removes the requirement for two connections per server pair in XMPP federations, allowing for more streamlined inter-server communications. However, for full compatibility, ejabberd can still connect to servers that do not support bidirectional connections, using two connections when necessary. The module is enabled by default in the sample configuration.

Support for XEP-0480: SASL Upgrade Tasks

The new mod_scram_upgrade module implements XEP-0480: SASL Upgrade Tasks. Compatible clients can now automatically upgrade encrypted passwords to more secure formats, enhancing security with minimal user intervention.

PubSub Service Improvements

We’ve implemented six noteworthy fixes to improve PubSub functionality:

  • PEP notifications are sent only to owners when +notify (3469a51)
  • Non-delivery errors for locally generated notifications are now skipped (d4b3095)
  • Fix default node config parsing (b439929)
  • Fix merging of default node options (ca54f81)
  • Fix choice of node config defaults (a9583b4)
  • Fall back to default plugin options (36187e0)

IQ permission for privileged entities

The mod_privilege module now supports IQ permission based on version 0.4 of XEP-0356: Privileged Entity. See #3889 for details. This feature is especially useful for XMPP gateways using the Slidge library.

WebAdmin improvements

ejabberd 24.06 release laid the foundation for a more streamlined WebAdmin interface, reusing existing commands instead of using specific code, with a possibly different logic. This major change allows developers to add new pages very fast, just by calling existing commands. It also allows administrators to use the same commands than in ejabberdctl or any other command frontend.

As a result, many new pages and content were added. Building on that, the 24.10 update introduces MAM (Message Archive Management) support, allowing administrators to view message counts, remove all MAM messages, or only for a specific contact, and also view the MAM Archive directly from WebAdmin.

webadmin-mam-screen

Additionally, WebAdmin now hides pages related to modules that are disabled, preventing unnecessary options from displaying. This affects mod_last, mod_mam, mod_offline, mod_privacy, mod_private, mod_roster, mod_vcard.

Fixes in commands

  • set_presence: Now returns an error when the session is not found.

  • send_direct_invitation: Improved handling of malformed JIDs.

  • update: Fix command output. So far, ejabberd_update:update/0 returned the return value of release_handler_1:eval_script/1. That function returns the list of updated but unpurged modules, i.e., modules where one or more processes are still running an old version of the code. Since commit 5a34020d23f455f80a144bcb0d8ee94770c0dbb1, the ejabberd update command assumes that value to be the list of updated modules instead. As that seems more useful, modify ejabberd_update:update/0 accordingly. This fixes the update command output.

  • get_mam_count: New command to retrieve the number of archived messages for a specific account.

Changes in hooks

Two key changes in hooks:

  • New check_register_user hook in ejabberd_auth.erl to allow blocking account registration when a tombstone exists.

  • Modified room_destroyed hook in mod_muc_room.erl. Until now the hook passed as arguments: LServer, Room, Host. Now it passes: LServer, Room, Host, Persistent That new Persistent argument passes the room persistent option, required by mod_tombstones because only persistent rooms should generate a tombstone, temporary ones should not. And the persistent option should not be completely overwritten, as we must still known its real value even when room is being destroyed.

Log Erlang/OTP and Elixir versions

During server start, ejabberd now shows in the log not only its version number, but also the Erlang/OTP and Elixir versions being used. This will help the administrator to determine what software versions are being used, which is specially useful when investigating some problem, and explaining it to other people for help.

The ejabberd.log file now looks like this:

...
2024-10-22 13:47:05.424 [info] Creating Mnesia disc_only table 'oauth_token'
2024-10-22 13:47:05.427 [info] Creating Mnesia disc table 'oauth_client'
2024-10-22 13:47:05.455 [info] Waiting for Mnesia synchronization to complete
2024-10-22 13:47:05.591 [info] ejabberd 24.10 is started in the node :ejabberd@localhost in 1.93s
2024-10-22 13:47:05.606 [info] Elixir 1.16.3 (compiled with Erlang/OTP 26)
2024-10-22 13:47:05.606 [info] Erlang/OTP 26 [erts-14.2.5.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]

2024-10-22 13:47:05.608 [info] Start accepting TCP connections at 127.0.0.1:7777 for :mod_proxy65_stream
2024-10-22 13:47:05.608 [info] Start accepting UDP connections at [::]:3478 for :ejabberd_stun
2024-10-22 13:47:05.608 [info] Start accepting TCP connections at [::]:1883 for :mod_mqtt
2024-10-22 13:47:05.608 [info] Start accepting TCP connections at [::]:5280 for :ejabberd_http
...

Brand new ProcessOne and ejabberd web sites

We’re excited to unveil the redesigned ProcessOne website, crafted to better showcase our expertise in large-scale messaging across XMPP, MQTT, Matrix, and more. This update highlights our core mission of delivering scalable, reliable messaging solutions, with a fresh layout and streamlined structure that reflect our cutting-edge work in the field.

You now get a cleaner ejabberd page, offering quick access to important URLs for downloads, blog posts, and documentation.

Behind the scenes, we’ve transitioned from WordPress to Ghost, a move inspired by its efficient, user-friendly authoring tools and long-term maintainability. All previous blog content has been preserved, and with this new setup, we’re poised to deliver more frequent updates on messaging, XMPP, ejabberd, and related topics.

We welcome your feedback—join us on our new site to share your thoughts, or let us know about any issue or broken link!

Acknowledgments

We would like to thank the contributions to the source code, documentation, and translation provided for this release by:

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 MUC support in mod_unread.

ejabberd keeps a counter of unread messages per conversation using the mod_unread module. This now also works in MUC rooms: each user can retrieve the number of unread messages in each of their rooms.

ChangeLog

This is a more detailed list of changes in this ejabberd release:

Miscelanea

  • ejabberd_c2s: Optionally allow unencrypted SASL2
  • ejabberd_system_monitor: Handle call by gen_event:swap_handler (#4233)
  • ejabberd_http_ws: Remove support for old websocket connection protocol
  • ejabberd_stun: Omit auth_realm log message
  • ext_mod: Handle info message when contrib module transfers table ownership
  • mod_block_strangers: Add feature announcement to disco-info (#4039)
  • mod_mam: Advertise XEP-0424 feature in server disco-info (#3340)
  • mod_muc_admin: Better handling of malformed jids in send_direct_invitation command
  • mod_muc_rtbl: Fix call to gen_server:stop (#4260)
  • mod_privilege: Support "IQ permission" from XEP-0356 0.4.1 (#3889)
  • mod_pubsub: Don't blindly echo PEP notification
  • mod_pubsub: Skip non-delivery errors for local pubsub generated notifications
  • mod_pubsub: Fall back to default plugin options
  • mod_pubsub: Fix choice of node config defaults
  • mod_pubsub: Fix merging of default node options
  • mod_pubsub: Fix default node config parsing
  • mod_register: Support to block IPs in a vhost using append_host_config (#4038)
  • mod_s2s_bidi: Add support for S2S Bidirectional
  • mod_scram_upgrade: Add support for SCRAM upgrade tasks
  • mod_vcard: Return error stanza when storage doesn't support vcard update (#4266)
  • mod_vcard: Return explicit error stanza when user attempts to modify other's vcard
  • Minor improvements to support mod_tombstones (#2456)
  • Update fast_xml to use use_maps and remove obsolete elixir files
  • Update fast_tls and xmpp to improve s2s fallback for invalid direct tls connections
  • make-binaries: Bump dependency versions: Elixir 1.17.2, OpenSSL 3.3.2, ...

Administration

  • ejabberdctl: If ERLANG_NODE lacks host, add hostname (#4288)
  • ejabberd_app: At server start, log Erlang and Elixir versions
  • MySQL: Fix column type in the schema update of archive table in schema update

Commands API

  • get_mam_count: New command to get number of archived messages for an account
  • set_presence: Return error when session not found
  • update: Fix command output
  • Add mam and offline tags to the related purge commands

Code Quality

  • Fix warnings about unused macro definitions reported by Erlang LS
  • Fix Elvis report: Fix dollar space syntax
  • Fix Elvis report: Remove spaces in weird places
  • Fix Elvis report: Don't use ignored variables
  • Fix Elvis report: Remove trailing whitespace characters
  • Define the types of options that opt_type.sh cannot derive automatically
  • ejabberd_http_ws: Fix dialyzer warnings
  • mod_matrix_gw: Remove useless option persist
  • mod_privilege: Replace try...catch with a clean alternative

Development Help

  • elvis.config: Fix file syntax, set vim mode, disable many tests
  • erlang_ls.config: Let it find paths, update to Erlang 26, enable crossref
  • hooks_deps: Hide false-positive warnings about gen_mod
  • Makefile: Add support for make elvis when using rebar3
  • .vscode/launch.json: Experimental support for debugging with Neovim
  • CI: Add Elvis tests
  • CI: Add XMPP Interop tests
  • Runtime: Cache hex.pm archive from rebar3 and mix

Documentation

  • Add links in top-level options documentation to their Docs website sections
  • Document which SQL servers can really use update_sql_schema
  • Improve documentation of ldap_servers and ldap_backups options (#3977)
  • mod_register: Document behavior when access is set to none (#4078)

Elixir

  • Handle case when elixir support is enabled but not available
  • Start ExSync manually to ensure it's started if (and only if) Relive
  • mix.exs: Fix mix release error: logger being regular and included application (#4265)
  • mix.exs: Remove from extra_applications the apps already defined in deps (#4265)

WebAdmin

  • Add links in user page to offline and roster pages
  • Add new "MAM Archive" page to webadmin
  • Improve many pages to handle when modules are disabled
  • mod_admin_extra: Move some webadmin pages to their modules

Full Changelog

https://github.com/processone/ejabberd/compare/24.07...24.10

ejabberd 24.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.