Robust, Ubiquitous and Massively Scalable Messaging Platform (XMPP, MQTT, SIP Server)
Release notes copied from the original ejabberd 24.02 announcement post:
🚀 Introducing ejabberd 24.02: A Huge Release!
ejabberd 24.02 has just been release and well, this is a huge release with 200 commits and more in the libraries. We've packed this update with a plethora of new features, significant improvements, and essential bug fixes, all designed to supercharge your messaging infrastructure.
If you upgrade ejabberd from a previous release, please review those changes:
A more detailed explanation of those topics and other features:
ejabberd is now able to federate with Matrix servers. Detailed instructions to setup Matrix federation with ejabberd will be detailed in another post.
Here is a quick summary of the configuration steps:
First, s2s must be enabled on ejabberd. Then define a listener that uses mod_matrix_gw
:
listen:
-
port: 8448
module: ejabberd_http
tls: true
certfile: "/opt/ejabberd/conf/server.pem"
request_handlers:
"/_matrix": mod_matrix_gw
And add mod_matrix_gw
in your modules:
modules:
mod_matrix_gw:
matrix_domain: "domain.com"
key_name: "somename"
key: "yourkeyinbase64"
With the new support for XEP-0424: Message Retraction, users of MAM message archiving can control their message archiving, with the ability to ask for deletion.
If stream management is enabled, let mod_ping trigger XEP-0198 <r/>equests
rather than sending XEP-0199 pings. This avoids the overhead of the ping IQ stanzas, which, if stream management is enabled, are accompanied by XEP-0198 elements anyway.
The table archive
has a text column named origin_id
(see commit 975681). You have two methods to update the SQL schema of your existing database:
If using MySQL or PosgreSQL, you can enable the option update_sql_schema
and ejabberd will take care to update the SQL schema when needed: add in your ejabberd configuration file the line update_sql_schema: true
If you are using other database, or prefer to update manually the SQL schema:
ALTER TABLE archive ADD COLUMN origin_id text NOT NULL DEFAULT '';
ALTER TABLE archive ALTER COLUMN origin_id DROP DEFAULT;
CREATE INDEX i_archive_username_origin_id USING BTREE ON archive(username(191), origin_id(191));
ALTER TABLE archive ADD COLUMN origin_id text NOT NULL DEFAULT '';
ALTER TABLE archive ALTER COLUMN origin_id DROP DEFAULT;
CREATE INDEX i_archive_sh_username_origin_id USING BTREE ON archive(server_host(191), username(191), origin_id(191));
ALTER TABLE archive ADD COLUMN origin_id text NOT NULL DEFAULT '';
ALTER TABLE archive ALTER COLUMN origin_id DROP DEFAULT;
CREATE INDEX i_archive_username_origin_id ON archive USING btree (username, origin_id);
ALTER TABLE archive ADD COLUMN origin_id text NOT NULL DEFAULT '';
ALTER TABLE archive ALTER COLUMN origin_id DROP DEFAULT;
CREATE INDEX i_archive_sh_username_origin_id ON archive USING btree (server_host, username, origin_id);
ALTER TABLE [dbo].[archive] ADD [origin_id] VARCHAR (250) NOT NULL;
CREATE INDEX [archive_username_origin_id] ON [archive] (username, origin_id)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
ALTER TABLE [dbo].[archive] ADD [origin_id] VARCHAR (250) NOT NULL;
CREATE INDEX [archive_sh_username_origin_id] ON [archive] (server_host, username, origin_id)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
ALTER TABLE archive ADD COLUMN origin_id text NOT NULL DEFAULT '';
CREATE INDEX i_archive_username_origin_id ON archive (username, origin_id);
ALTER TABLE archive ADD COLUMN origin_id text NOT NULL DEFAULT '';
CREATE INDEX i_archive_sh_username_origin_id ON archive (server_host, username, origin_id);
This ejabberd release includes support for XEP-0474: SASL SCRAM Downgrade Protection, and some clients may not support it correctly yet.
If you are using Converse.js 10.1.6 or older, Movim 0.23 Kojima or older, or any other client based in Strophe.js v1.6.2 or older, you may notice that they cannot authenticate correctly to ejabberd.
To solve that problem, either update to newer versions of those programs (if they exist), or you can enable temporarily the option disable_sasl_scram_downgrade_protection
in the ejabberd configuration file ejabberd.yml
like this:
disable_sasl_scram_downgrade_protection: true
Until now, when a new ejabberd release changed some API command (an argument renamed, a result in a different format...), then you had to update your API client to the new API at the same time that you updated ejabberd.
Now the ejabberd API commands can have different versions, by default the most recent one is used, and the API client can specify the API version it supports.
In fact, this feature was implemented seven years ago, included in ejabberd 16.04, documented in ejabberd Docs: API Versioning... but it was never actually used!
This ejabberd release includes many fixes to get API versioning up to date, and it starts being used by several commands.
Let's say that ejabberd 23.10 implemented API version 0, and this ejabberd 24.02 adds API version 1. You may want to update your API client to use the new API version 1... or you can continue using API version 0 and delay API update a few weeks or months.
To continue using API version 0:
--version 0
. For example: ejabberdctl --version 0 get_roster admin localhost
v0
to the request_handlers
path. For example: /api/v0: mod_http_api
Check the details in ejabberd Docs: API Versioning.
When you want to update your API client to support ejabberd API version 1, those are the changes to take into account:
All those changes are described in the next sections.
Several commands now use list
argument instead of a string
with separators (different commands used different separators: ;
:
\\n
,
).
The commands improved in API version 1:
add_rosteritem
oauth_issue_token
send_direct_invitation
srg_create
subscribe_room
subscribe_room_many
For example, srg_create
in API version 0 took as arguments:
{"group": "group3",
"host": "myserver.com",
"label": "Group3",
"description": "Third group",
"display": "group1\\ngroup2"}
now in API version 1 the command expects as arguments:
{"group": "group3",
"host": "myserver.com",
"label": "Group3",
"description": "Third group",
"display": ["group1", "group2"]}
There was an incoherence in mod_http_api results when they were integer/string and when they were list/tuple/rescode...: the result contained the name, for example:
$ curl -k -X POST -H "Content-type: application/json" -d '{}' "http://localhost:5280/api/get_loglevel/v0"
{"levelatom":"info"}
Staring in API version 1, when result is an integer or a string, it will not contain the result name. This is now coherent with the other result formats (list, tuple, ...) which don't contain the result name either.
Some examples with API version 0 and API version 1:
$ curl -k -X POST -H "Content-type: application/json" -d '{}' "http://localhost:5280/api/get_loglevel/v0"
{"levelatom":"info"}
$ curl -k -X POST -H "Content-type: application/json" -d '{}' "http://localhost:5280/api/get_loglevel"
"info"
$ curl -k -X POST -H "Content-type: application/json" -d '{"name": "registeredusers"}' "http://localhost:5280/api/stats/v0"
{"stat":2}
$ curl -k -X POST -H "Content-type: application/json" -d '{"name": "registeredusers"}' "http://localhost:5280/api/stats"
2
$ curl -k -X POST -H "Content-type: application/json" -d '{"host": "localhost"}' "http://localhost:5280/api/registered_users/v0"
["admin","user1"]
$ curl -k -X POST -H "Content-type: application/json" -d '{"host": "localhost"}' "http://localhost:5280/api/registered_users"
["admin","user1"]
ejabberdctl now supports list and tuple arguments, like mod_http_api and ejabberd_xmlrpc. This allows ejabberdctl to execute all the existing commands, even some that were impossible until now like create_room_with_opts
and set_vcard2_multi
.
List elements are separated with ,
and tuple elements are separated with :
.
Relevant commands:
add_rosteritem
create_room_with_opts
oauth_issue_token
send_direct_invitation
set_vcard2_multi
srg_create
subscribe_room
subscribe_room_many
Some example uses:
ejabberdctl add_rosteritem user1 localhost testuser7 localhost NickUser77l gr1,gr2,gr3 both
ejabberdctl create_room_with_opts room1 conference.localhost localhost public:false,persistent:true
ejabberdctl subscribe_room_many user1@localhost:User1,admin@localhost:Admin [email protected] urn:xmpp:mucsub:nodes:messages,u
Until now, ejabberdctl returned list elements separated with ;
. Now in API version 1 list elements are separated with ,
.
For example, in ejabberd 23.10:
$ ejabberdctl get_roster admin localhost
jan@localhost jan none subscribe group1;group2
tom@localhost tom none subscribe group3
Since this ejabberd release, using API version 1:
$ ejabberdctl get_roster admin localhost
jan@localhost jan none subscribe group1,group2
tom@localhost tom none subscribe group3
it is still possible to get the results in the old syntax, using API version 0:
$ ejabberdctl --version 0 get_roster admin localhost
jan@localhost jan none subscribe group1;group2
tom@localhost tom none subscribe group3
ejabberd supports around 200 administrative commands, and probably you consult them in the ejabberd Docs -> API Reference page, where all the commands documentation is perfectly displayed...
The ejabberdctl
command-line script already allowed to consult the commands documentation, consulting in real-time your ejabberd server to show you exactly the commands that are available. But it lacked some details about the commands. That has been improved, and now ejabberdctl
shows all the information, including arguments description, examples and version notes.
For example, the connected_users_vhost
command documentation as seen in the ejabberd Docs site is equivalently visible using ejabberdctl
:
$ ejabberdctl help connected_users_vhost
Command Name: connected_users_vhost
Arguments: host::binary : Server name
Result: connected_users_vhost::[ sessions::string ]
Example: ejabberdctl connected_users_vhost "myexample.com"
[email protected]/tka
user2@localhost/tka
Tags: session
Module: mod_admin_extra
Description: Get the list of established sessions in a vhost
Erlang/OTP 27.0-rc1 was recently released, and ejabberd can be compiled with it. If you are developing or experimenting with ejabberd, it would be great if you can use Erlang/OTP 27 and report any problems you find. For production servers, it's recommended to stick with Erlang/OTP 26.2 or any previous version.
In this sense, the rebar
and rebar3
binaries included with ejabberd are also updated: now they support from Erlang 24 to Erlang 27. If you want to use older Erlang versions from 20 to 23, there are compatible binaries available in git: rebar from ejabberd 21.12 and rebar3 from ejabberd 21.12.
Of course, if you have rebar
or rebar3
already installed in your system, it's preferable if you use those ones, because probably they will be perfectly compatible with whatever erlang version you have installed.
ejabberd
container imageThe binary installers now include the recent and stable Erlang/OTP 26.2.2 and Elixir 1.16.1. Many other dependencies were updated in the installers, the most notable is OpenSSL that has jumped to version 3.2.1.
The ejabberd
container image and the ecs
container image have gotten all those version updates, and also Alpine is updated to 3.19.
By the way, this container image already had support to run commands when the container starts... And now you can setup the commands to allow them fail, by prepending the character !
.
When compiling ejabberd from source code, you may have noticed there are a lot of possibilities. Let's take an overview before digging in the new improvements:
Tools to manage the dependencies and compilation:
Installation methods:
make install
: copies the files to the systemmake prod
: prepares a self-contained OTP production release in _build/prod/
, and generates a tar.gz
file. This was previously named make rel
make dev
: prepares quickly an OTP development release in _build/dev/
make relive
: prepares the barely minimum in _build/relive/
to run ejabberd and starts itStart scripts and alternatives:
ejabberdctl
with erlang shell: start
/foreground
/live
ejabberdctl
with elixir shell: iexlive
ejabberd
console
/start
(this script is generated by rebar3 or mix, and does not support ejabberdctl configurable options)For example:
CI
dynamic tests use rebar3
, and Runtime
tries to test all the possible combinationsmix + make prod
mix + make prod
too, and started with ejabberdctl foreground
Several combinations didn't work correctly until now and have been fixed, for example:
mix + make relive
mix + make prod/dev + ejabberdctl iexlive
mix + make install + ejabberdctl start/foregorund/live
make uninstall
buggy has an experimental alternative: make uninstall-rel
rebar + make prod
with Erlang 26ejabberd uses Rebar to manage dependencies and compilation since ejabberd 13.10 4d8f770. However, that tool is obsolete and unmaintained since years ago, because there is a complete replacement:
Rebar3 is supported by ejabberd since 20.12 0fc1aea. Among other benefits, this allows to download dependencies from hex.pm and cache them in your system instead of downloading them from git every time, and allows to compile Elixir files and Elixir dependencies.
In fact, ejabberd can be compiled using mix
(a tool included with the Elixir programming language) since ejabberd 15.04 ea8db99 (with improvements in ejabberd 21.07 4c5641a)
For those reasons, the tool selection performed by ./configure
will now be:
--with-rebar=rebar3
but Rebar3 not found installed in the system, use the rebar3
binary included with ejabberd--with-rebar=/path/to/bin
mix
rebar3
rebar3
binary included with ejabberdSupport for Elixir 1.1 was added as a dependency in commit 01e1f67 to ejabberd 15.02. This allowed to compile Elixir files. But since Elixir 1.4.5 (released Jun 22, 2017) it isn't possible to get Elixir as a dependency... it's nowadays a standalone program. For that reason, support to download old Elixir 1.4.4 as a dependency has been removed.
When Elixir support is required, better simply install Elixir and use mix
as build tool:
./configure --with-rebar=mix
Or install Elixir and use the experimental Rebar3 support to compile Elixir files and dependencies:
./configure --with-rebar=rebar3 --enable-elixir
It is now possible to compile ejabberd using Rebar3 and support Elixir compilation. This compiles the Elixir files included in ejabberd's lib/
path. There's also support to get dependencies written in Elixir, and it's possible to build OTP releases including Elixir support.
It is necessary to have Elixir installed in the system, and configure the compilation using --enable-elixir
. For example:
apt-get install erlang erlang-dev elixir
git clone https://github.com/processone/ejabberd.git ejabberd
cd ejabberd
./autogen.sh
./configure --with-rebar=rebar3 --enable-elixir
make
make dev
_build/dev/rel/ejabberd/bin/ejabberdctl iexlive
Elixir 1.10.3 is the minimum supported, but:
make prod
or make dev
make relive
Runtime
For all those reasons, if you want to use Elixir, it is highly recommended to use Elixir 1.13.4 or higher with Erlang/OTP 23.0 or higher.
make rel
is renamed to make prod
When ejabberd started to use Rebar2 build tool, that tool could create an OTP release, and the target in Makefile.in
was conveniently named make rel
.
However, newer tools like Rebar3 and Elixir's Mix support creating different types of releases: production, development, ... In this sense, our make rel
target is nowadays more properly named make prod
.
For backwards compatibility, make rel
redirects to make prod
.
make install-rel
and make uninstall-rel
This is an alternative method to install ejabberd in the system, based in the OTP release process. It should produce exactly the same results than the existing make install
.
The benefits of make install-rel
over the existing method:
Makefile.in
make uninstall-rel
correctly deletes all the library filesThis is still experimental, and it would be great if you are able to test it and report any problem; eventually this method could replace the existing one.
Just for curiosity:
make uninstall
was added
make uninstall
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...
Customers of the ejabberd Business Edition, in addition to all those improvements and bugfixes, also get:
x:oob
data as source for image delivered in pushesTooManyProviderTokenUpdated
errorget_push_logs
command generate better error if mod_push_logger
not availableget_push_logs
that can be used to retrieve info about recent pushes and errors reported by push servicesmod_mam_http_access
API to also accept range of messagesmod_muc_state_query
to fix subject_author
room state fieldxdata
in mod_muc_state_query
This is a more detailed list of changes in this ejabberd release:
mod_matrix_gw
disable_sasl_scram_downgrade_protection
: New option to disable XEP-0474negotiation_timeout
: Increase default value from 30s to 2mEJABBERD_OPTS
and logger options""
, and use previous flags as exampleeldap tls_verify=soft
and false
fail_if_no_peer_cert
for eldap ssl client connectionsmax_items
node options on readsha256_password
auth pluginsql_flags
: right now only useful to enable mysql_alternative_upsert
CTL_ON_*
commandsprint_sql_schema
: New command available in ejabberdctl command-line scriptmuc_sub
tag to all the relevant commandsset_presence
: switch priority argument from string to integervX
--enable-group
option (#4135)--enable-tools
install-rel
and uninstall-rel
make rel
to make prod
make edoc
to use ExDoc, requires mixescript
to run rebar|rebar3|mix--with-rebar=rebar3
but rebar3 not system-installed, use local one--enable-elixir
iex
dev
profile/environment, enable tools automaticallyFORMATTER ERROR: bad return value
(#4087)Elixir Hex API
vars.config
not foundvars_config_path
to set path to vars.config
(#4128)https://github.com/processone/ejabberd/compare/23.10...24.02
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.
Release notes copied from the original ejabberd 23.10 announcement post:
A new ejabberd release, ejabberd 23.10, is now published with more than 150 commits since the previous 23.04. It includes many new features and improvements, and also many more bugfixes.
A more detailed explanation of improvements and features:
XEP-0402: PEP Native Bookmarks describes how to keep a list of chatroom bookmarks as PEP nodes on the PubSub service. That's an improvement over XEP-0048: Bookmark Storage which described how to store in a single Private XML Storage or a single PEP node.
mod_private
now supports the bookmark conversion described in XEP-0402:
ejabberd synchronizes XEP-0402 bookmarks, private storage bookmarks and XEP-0048 bookmarks.
In this sense, the bookmarks_to_pep
command performs an initial synchronization of bookmarks, getting bookmarks from Private XML Storage and stores them in PEP nodes as described both in XEP-0048 and XEP-0402.
mod_muc_occupantid
module with support for XEP-0421: Occupant IdXEP-0421: Anonymous unique occupant identifiers for MUCs is useful in anonymous MUC rooms, message correction and message retractions. Right now the only client found to support XEP-0421 is Dino, since version 0.4.
ejabberd now implements XEP-0421 0.1.0 in mod_muc_occupantid
. The module is quite simple and has no configurable options: just enabled it in the modules
section in your ejabberd.yml
configuration file and restart
ejabberd or reload_config
.
auth_external_user_exists_check
The new option auth_external_user_exists_check
makes user_check
hook work better with authentication methods that don't have a way to determine if user exists. This happens, for example, in the case of jwt and cert based authentication. As result, enabling this option improves mod_offline
and mod_mam
handling of offline messages to those users. This reuses information stored by mod_last
for this purpose.
Authentication methods that manage users list outside of ejabberd, like for example JWT token or tls certificate authentication, had issue with processing of offline messages. Those methods didn't have a way to tell if given user existed when user was not logged in, and that did block processing of offline messages, which were only performed for users that we know did exists. This release adds code that also consults data stored by mod_last
for that purpose, and it should fix offline messages for users that were logged at least once before.
get_roster
commandThere are some changes in the result output of the get_roster
command defined in mod_admin_extra
:
ask
is renamed to pending
group
is renamed to groups
groups
is a list with all the group namesFor example, let's say that admin@localhost
has two contacts: a contact is present in two groups (group1
and group2
), the other contact is only present in a group (group3
).
The old get_roster command in ejabberd 23.04 and previous versions was like:
$ ejabberdctl get_roster admin localhost
jan@localhost jan none subscribe group1
jan@localhost jan none subscribe group2
tom@localhost tom none subscribe group3
The new get_roster command in ejabberd 23.XX and newer versions returns as result:
$ ejabberdctl get_roster admin localhost
jan@localhost jan none subscribe group1;group2
tom@localhost tom none subscribe group3
Notice that the ejabberdctl
command-line tool since now will represent list elements in results separated with ;
halt
commandUntil now there were two API commands to stop ejabberd:
stop
stops ejabberd gracefully, calling to stop each of its components (client sessions, modules, listeners, ...)stop_kindly
first of all sends messages to all the online users and all the online MUC rooms, waits a few seconds, and then stops ejabberd gracefully.Those comands are useful when there's an ejabberd running for many time, with many users connected, and you want to stop it.
A new command is now added: halt
, which abruptly stops the ejabberd node, without taking care to close gracefully any of its components. It also returns error code 1
. This command is useful if some problem is detected while ejabberd is starting.
For example, it is now used in the ecs
and the ejabberd
container images when CTL_ON_CREATE
or CTL_ON_START
were provided and failed to execute correctly. See docker-ejabberd#97 for details.
MySQL driver will now use prepared statements whenever possible, this should improve database load. This feature can be disabled with sql_prepared_statement: false
.
We also added alternative implementation of upsert that doesn't use replace ..
or insert ... on conflict update
, as in some versions of MySQL this can lead to excessive deadlocks. We switch between implementations based on version but it's possible to override version check by having:
sql_flags:
- mysql_alternative_upsert
inside config file.
unix_socket
listener optionWhen defining a listener, the port
option can be a port number or a string in form "unix:/path/to/socket"
to create and listen on a unix domain socket /path/to/socket
.
The new unix_socket
listener option allows to customize some options of that unix socket file.
The configurable options are:
mode
: which should be an octalowner
: which should be an integergroup
: which should be an integerThose values have no default: only when they are set, they are changed.
Example configuration:
listen:
-
port: "unix://tmp/asd/socket"
unix_socket:
mode: '0775'
owner: 117
group: 135
install_contrib_modules
top-level optionThe new install_contrib_modules
top-level option lets you declare a list of modules from ejabberd-contrib that will be installed automatically by ejabberd when it is being started. This option is read during ejabberd start or configuration reload.
This option is equivalent to installing the module manually with the command ejabberdctl module_install whatever
. It is useful when deploying ejabberd automatically with a configuration file that mentions a contrib module.
For example, let's enable and configure some modules from ejabberd-contrib, and use the new option to ensure they get installed, all of this the very first time ejabberd runs. Extract from ejabberd.yml
:
...
install_contrib_modules:
- mod_statsdx
- mod_webadmin_config
modules:
mod_statsdx:
hooks: true
mod_webadmin_config: {}
...
The ejabberd.log file will show something like:
2023-09-25 15:32:40.282446+02:00 [info] Loading configuration from _build/relive/conf/ejabberd.yml
Module mod_statsdx has been installed and started.
The mod_statsdx configuration in your ejabberd.yml is used.
Module mod_webadmin_config has been installed and started.
The mod_webadmin_config configuration in your ejabberd.yml is used.
2023-09-25 15:32:42.201199+02:00 [info] Configuration loaded successfully
...
2023-09-25 15:32:43.163099+02:00 [info] ejabberd 23.04.115 is started in the node ejabberd@localhost in 3.15s
2023-09-25 15:32:47.069875+02:00 [info] Reloading configuration from _build/relive/conf/ejabberd.yml
2023-09-25 15:32:47.100917+02:00 [info] Configuration reloaded successfully
notify_on
option in mod_push
mod_push
has a new option: notify_on
, which possible values:
all
: generate a notification on any kind of XMPP stanzas. This is the default value.messages
: notifications are only triggered for actual chat messages with a body text (or some encrypted payload).A nick can be registered in the MUC service since ejabberd 13.06, this prevents anybody else to use that nick in any room of that MUC service.
Now ejabberd gets support to register a nick in a room, as described in XEP-0045 section 7.10 Registering with a Room
Registering a nick in the MUC service or in a room is mutually exclusive:
allow_private_messages
converted to allowpm
Until ejabberd 23.04, MUC rooms had a configurable option called allow_private_messages
with possible values true
or false
.
Since ejabberd 23.10, that option is converted into allowpm
, with possible values:
anyone
: equivalent to allow_private_messages=true
none
: equivalent to allow_private_messages=false
participants
moderators
gen_mod
API to simplify hooks and IQ handlers registrationIf you wrote some ejabberd module, you may want to update your module to the simplified gen_mod
API. This is not mandatory, because the old way to do this is supported.
Until now, erlang modules that implemented ejabberd's gen_mod
behaviour called ejabberd_hooks:add
and gen_iq_handler:add_iq_handler
in ther start
functions. Similarly, in their stop
function they called ejabberd_hooks:delete
and gen_iq_hanlder:remove_iq_handler
.
Since ejabberd 23.10, there is an alternative way to do this: let your start
function return {ok, List}
, where List
is a list of iq handlers and hooks that you want your module to register to. No need to unregister them in your stop
function!
How to change your module to the new API? See the changes done in mod_adhoc.erl
in commit 60002fc.
To use the Microsoft SQL Server database, the libtdsodbc
library is required, as explained in the corresponding section of the ejabberd Docs: Configuration > Databases > Microsoft SQL Server
Since this release, the ejabberd
container image includes this library.
Please notice if you install ejabberd using the binary installers and want to use MS SQL: you must install the libtdsodbc
libraries on your machine. It cannot be included in the ejabberd installer due to the nature of the odbc drivers being dynamic depending on the respective odbc backend in use.
This ejabberd release requires Erlang/OTP 20.0 or newer to compile and run, support for Erlang/OTP 19.3 is deprecated. If you are still using Erlang/OTP 19.3, please update to a more recent Erlang version. For example, the ejabberd binary installers and container images are using Erlang/OTP 26.1. That requirement increase was announced almost a year ago, check more details in the ejabberd 22.10 release announcement.
If you are still using Erlang/OTP 19.3 and cannot update it right now, there's still a possibility to compile ejabberd 23.10 with Erlang/OTP 19.3, but please notice: there is no guarantee or support that it will compile or run correctly. If interested, revert the changed line in the file configure.ac
done in commit d299b97 and recompile.
We would like to thank the contributions to the source code, documentation, and translation provided for this release by:
mod_push
new notify_on
optionAnd also to all the people contributing in the ejabberd chatroom, issue tracker...
Customers of the ejabberd Business Edition, in addition to all those improvements and bugfixes, also get:
mod_push_logger
module to log push related eventsmod_matrix_gw_s2s
max_concurrent_connections
option to webhookThis is a more detailed list of changes in this ejabberd release:
rebar.config
rebar.config
to organize its contentre:mp()
is not an exported type--app
ERLANG_NODE=ejabberd@localhost
ejabberdctl
: Pass ERLANG_OPTS
when calling erl
to parse the INET_DIST_INTERFACE
(#4066
create_room_with_opts
: Fix typo and move examples to args_example
(#4080)etop
: Let ejabberdctl etop
work in a release (if observer
application is available)get_roster
: Command now returns groups in a list instead of newlines (#4088)halt
: New command to halt ejabberd abruptly with an error status codeejabberdctl
: Fix calling ejabberdctl command with wrong number of arguments with Erlang 26ejabberdctl
: Improve printing lists in resultsejabberdctl
: Support policy=user
in the help and return proper argumentsejabberdctl
: Document how to stop a debug shell: control+gejabberdctl
: Support policy=user in the help and return proper argumentsejabberdctl
: Improve printing lists in resultsMETHOD=package
CTL_ON_
fails during ejabberd startupauth_external_user_exists_check
: New option (#3377)gen_mod
: Extend gen_mod
API to simplify hooks and IQ handlers registrationgen_mod
: Add shorter forms for gen_mod
hook/iq_handler
APIgen_mod
: Update modules to the new gen_mod
APIinstall_contrib_modules
: New option to define contrib modules to install automaticallyunix_socket
: New listener option, useful when setting unix socket files (#4059)ejabberd_systemd
: Add a few debug messagesejabberd_systemd
: Avoid using gen_server
timeout (#4054)(#4058)ejabberd_listener
: Increase default listen queue backlog value to 128, which is the default value on both Linux and FreeBSD (#4025)badpass
error messageuser_send_packet
(#3990)AddJID
textbox to top (#4067)policy=user
commands have host
instead of server
arg in docsmake-binaries
)mod_muc_log
: Add trailing backslash to URLs shown in disco infomod_muc_occupantid
: New module with support for XEP-0421 Occupant Id (#3397)mod_muc_rtbl
: Better error handling in (#4050)mod_private
: Add support for XEP-0402 PEP Native Bookmarksmod_privilege
: Don't fail to edit roster (#3942)mod_pubsub
: Fix usage of plugins
option, which produced default_node_config
ignore (#4070)mod_pubsub
: Add pubsub_delete_item
hookmod_pubsub
: Report support of config-node-max
in pepmod_pubsub
: Relay pubsub iq queries to muc members without using bare jid (#4093)mod_pubsub
: Allow pubsub node owner to overwrite items published by other personsmod_push_keepalive
: Delay wake_on_start
mod_push_keepalive
: Don't let hook crashmod_push
: Add notify_on
optionmod_push
: Set last-message-sender
to bare JIDmod_register_web
: Make redirect to page that end with /
(#3177)mod_shared_roster_ldap
: Don't crash in get_member_jid
on empty output (#3614)allow_private_message
MUC room option to allowpm
(#3736)roomconfig_changesubject
in disco#info (#4085)muc_filter_message
(#4083)muc_filter_message
(#3397)muc_filter_message
too (#3397)muc_filter_message
when sending subject (#3397)ejabberd_auth_sql
: Reset scram fields when setting plain passwordmod_privacy_sql
: Fix return values from calculate_diff
mod_privacy_sql
: Optimize set_list
mod_privacy_sql
: Use more efficient way to calculate changes in set_privacy_list
https://github.com/processone/ejabberd/compare/23.04...23.10
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.
Release notes copied from the original ejabberd 23.04 announcement post:
This new ejabberd 23.04 release includes many improvements and bug fixes, and also a few new features.
mod_mam
supports XEP-0425: Message Moderation
mod_muc_rtbl
, Real-Time Block List for MUC roomsA more detailed explanation of those topics and other features:
There are many improvements in the SQL databases field (see #3980 and #3982):
new
schema, and the corresponding schema migration, along other minor improvements and bugfixes.Please upgrade your existing SQL database, check the notes later in this document!
mod_mam
supports XEP-0425: Message ModerationXEP-0425: Message Moderation allows a Multi-User Chat (XEP-0045) moderator to moderate certain groupchat messages by, for example, retracting them from the groupchat history as part of an effort to address and remedy issues such as message spam, indecent language for the venue or exposing private third-party personal information. It also allows the moderators to correct a message on another user's behalf, or flag a message as inappropriate without requiring that it be retracted.
Clients that support this XEP right now are Gajim, Converse.js, Monocles, and have read-only support Poezio and XMPP Web.
mod_muc_rtbl
This new module implements Real-Time Block List for MUC rooms. It works by observing remote pubsub node conforming with specification described in xmppbl.org.
captcha_url
option now accepts auto
valueIn recent ejabberd releases, captcha_cmd got support for macros (in ejabberd 22.10) and support to use modules (in ejabberd 23.01).
Now captcha_url gets an improvement: if set to auto
, it tries to detect the URL automatically considering the ejabberd configuration. This is now the default value. This should be good enough in most cases; but manually setting the URL may be required when using port forwarding or very specific setups.
This is the last ejabberd release with support for Erlang/OTP 19.3. If not done already, please upgrade to Erlang/OTP 20.0 or newer before the next ejabberd release. Check more details in the ejabberd 22.10 release announcement.
Regarding the binary packages provided for ejabberd:
mix
, ecs
, and ejabberd
container images now use Alpine 3.17ejabberd
container image now supports an alternate build method, useful to bypass a problem in QEMU and Erlang 25 when building the image for arm64
architectureecs
container imageThe ecs
container image is built using the files from docker-ejabberd/ecs, and published in docker.io/ejabberd/ecs. This image in general gets only minimal fixes, no major or breaking changes, but in this release it got a change that will require the administrator intervention.
The Erlang node name is now by default fixed to ejabberd@localhost
, instead of being variably set by the container host name. If you previously allowed ejabberd to decide its node name (which was random), then it will now create a new mnesia database instead of using the previous one:
$ docker exec -it ejabberd ls /home/ejabberd/database/
ejabberd@1ca968a0301a
ejabberd@localhost
...
A simple solution is to create the container providing ERLANG_NODE_ARG
with the old erlang node name, for example:
docker run ... -e ERLANG_NODE_ARG=ejabberd@1ca968a0301a
or in docker-compose.yml
version: '3.7'
services:
main:
image: ejabberd/ecs
environment:
- ERLANG_NODE_ARG=ejabberd@1ca968a0301a
Another solution is to change the mnesia node name in the mnesia spool files.
ecs
container imageIn addition to the change in the default erlang node name mentioned previously, the ecs
container image got other improvements:
ecs
and mix
container images, those images are uploaded as artifacts, and available to download in the corresponding runs.ecs
README file: Clustering and Clustering Example.In addition to the normal improvements and fixes, two sections in the ejabberd Documentation are improved:
We would like to thank the contributions to the source code, documentation, and translation provided for this release by:
And also for all the people helping to solve doubts and problems in the ejabberd chatroom and issue tracker.
Those notes allow to apply the improvements in the SQL database schemas from this ejabberd release to your existing SQL database. Please take into account what database you use, and whether it is the default or the new schema.
Fix a long standing bug in new schema on PostgreSQL. The fix for any existing impacted installations is the same:
ALTER TABLE vcard_search DROP CONSTRAINT vcard_search_pkey;
ALTER TABLE vcard_search ADD PRIMARY KEY (server_host, lusername);
To convert columns to allow up to 2 billion rows in these tables. This conversion will require full table rebuilds, and will take a long time if tables already have lots of rows. Optional: this is not necessary if the tables are never likely to grow large.
ALTER TABLE archive ALTER COLUMN id TYPE BIGINT;
ALTER TABLE privacy_list ALTER COLUMN id TYPE BIGINT;
ALTER TABLE pubsub_node ALTER COLUMN nodeid TYPE BIGINT;
ALTER TABLE pubsub_state ALTER COLUMN stateid TYPE BIGINT;
ALTER TABLE spool ALTER COLUMN seq TYPE BIGINT;
DROP INDEX i_rosteru_username;
DROP INDEX i_sr_user_jid;
DROP INDEX i_privacy_list_username;
DROP INDEX i_private_storage_username;
DROP INDEX i_muc_online_users_us;
DROP INDEX i_route_domain;
DROP INDEX i_mix_participant_chan_serv;
DROP INDEX i_mix_subscription_chan_serv_ud;
DROP INDEX i_mix_subscription_chan_serv;
DROP INDEX i_mix_pam_us;
DROP INDEX i_rosteru_sh_username;
DROP INDEX i_sr_user_sh_jid;
DROP INDEX i_privacy_list_sh_username;
DROP INDEX i_private_storage_sh_username;
DROP INDEX i_muc_online_users_us;
DROP INDEX i_route_domain;
DROP INDEX i_mix_participant_chan_serv;
DROP INDEX i_mix_subscription_chan_serv_ud;
DROP INDEX i_mix_subscription_chan_serv;
DROP INDEX i_mix_pam_us;
And now add index that might be missing
In PostgreSQL:
CREATE INDEX i_push_session_sh_username_timestamp ON push_session USING btree (server_host, username, timestamp);
In SQLite:
CREATE INDEX i_push_session_sh_username_timestamp ON push_session (server_host, username, timestamp);
ALTER TABLE rosterusers DROP INDEX i_rosteru_username;
ALTER TABLE sr_user DROP INDEX i_sr_user_jid;
ALTER TABLE privacy_list DROP INDEX i_privacy_list_username;
ALTER TABLE private_storage DROP INDEX i_private_storage_username;
ALTER TABLE muc_online_users DROP INDEX i_muc_online_users_us;
ALTER TABLE route DROP INDEX i_route_domain;
ALTER TABLE mix_participant DROP INDEX i_mix_participant_chan_serv;
ALTER TABLE mix_participant DROP INDEX i_mix_subscription_chan_serv_ud;
ALTER TABLE mix_participant DROP INDEX i_mix_subscription_chan_serv;
ALTER TABLE mix_pam DROP INDEX i_mix_pam_u;
ALTER TABLE rosterusers DROP INDEX i_rosteru_sh_username;
ALTER TABLE sr_user DROP INDEX i_sr_user_sh_jid;
ALTER TABLE privacy_list DROP INDEX i_privacy_list_sh_username;
ALTER TABLE private_storage DROP INDEX i_private_storage_sh_username;
ALTER TABLE muc_online_users DROP INDEX i_muc_online_users_us;
ALTER TABLE route DROP INDEX i_route_domain;
ALTER TABLE mix_participant DROP INDEX i_mix_participant_chan_serv;
ALTER TABLE mix_participant DROP INDEX i_mix_subscription_chan_serv_ud;
ALTER TABLE mix_participant DROP INDEX i_mix_subscription_chan_serv;
ALTER TABLE mix_pam DROP INDEX i_mix_pam_us;
Add index that might be missing:
CREATE INDEX i_push_session_sh_username_timestamp ON push_session (server_host, username(191), timestamp);
DROP INDEX [rosterusers_username] ON [rosterusers];
DROP INDEX [sr_user_jid] ON [sr_user];
DROP INDEX [privacy_list_username] ON [privacy_list];
DROP INDEX [private_storage_username] ON [private_storage];
DROP INDEX [muc_online_users_us] ON [muc_online_users];
DROP INDEX [route_domain] ON [route];
go
MS SQL schema was missing some tables added in earlier versions of ejabberd:
CREATE TABLE [dbo].[mix_channel] (
[channel] [varchar] (250) NOT NULL,
[service] [varchar] (250) NOT NULL,
[username] [varchar] (250) NOT NULL,
[domain] [varchar] (250) NOT NULL,
[jid] [varchar] (250) NOT NULL,
[hidden] [smallint] NOT NULL,
[hmac_key] [text] NOT NULL,
[created_at] [datetime] NOT NULL DEFAULT GETDATE()
) TEXTIMAGE_ON [PRIMARY];
CREATE UNIQUE CLUSTERED INDEX [mix_channel] ON [mix_channel] (channel, service)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
CREATE INDEX [mix_channel_serv] ON [mix_channel] (service)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
CREATE TABLE [dbo].[mix_participant] (
[channel] [varchar] (250) NOT NULL,
[service] [varchar] (250) NOT NULL,
[username] [varchar] (250) NOT NULL,
[domain] [varchar] (250) NOT NULL,
[jid] [varchar] (250) NOT NULL,
[id] [text] NOT NULL,
[nick] [text] NOT NULL,
[created_at] [datetime] NOT NULL DEFAULT GETDATE()
) TEXTIMAGE_ON [PRIMARY];
CREATE UNIQUE INDEX [mix_participant] ON [mix_participant] (channel, service, username, domain)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
CREATE INDEX [mix_participant_chan_serv] ON [mix_participant] (channel, service)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
CREATE TABLE [dbo].[mix_subscription] (
[channel] [varchar] (250) NOT NULL,
[service] [varchar] (250) NOT NULL,
[username] [varchar] (250) NOT NULL,
[domain] [varchar] (250) NOT NULL,
[node] [varchar] (250) NOT NULL,
[jid] [varchar] (250) NOT NULL
);
CREATE UNIQUE INDEX [mix_subscription] ON [mix_subscription] (channel, service, username, domain, node)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
CREATE INDEX [mix_subscription_chan_serv_ud] ON [mix_subscription] (channel, service, username, domain)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
CREATE INDEX [mix_subscription_chan_serv_node] ON [mix_subscription] (channel, service, node)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
CREATE INDEX [mix_subscription_chan_serv] ON [mix_subscription] (channel, service)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
CREATE TABLE [dbo].[mix_pam] (
[username] [varchar] (250) NOT NULL,
[channel] [varchar] (250) NOT NULL,
[service] [varchar] (250) NOT NULL,
[id] [text] NOT NULL,
[created_at] [datetime] NOT NULL DEFAULT GETDATE()
) TEXTIMAGE_ON [PRIMARY];
CREATE UNIQUE CLUSTERED INDEX [mix_pam] ON [mix_pam] (username, channel, service)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
go
MS SQL also had some incompatible column types:
ALTER TABLE [dbo].[muc_online_room] ALTER COLUMN [node] VARCHAR (250);
ALTER TABLE [dbo].[muc_online_room] ALTER COLUMN [pid] VARCHAR (100);
ALTER TABLE [dbo].[muc_online_users] ALTER COLUMN [node] VARCHAR (250);
ALTER TABLE [dbo].[pubsub_node_option] ALTER COLUMN [name] VARCHAR (250);
ALTER TABLE [dbo].[pubsub_node_option] ALTER COLUMN [val] VARCHAR (250);
ALTER TABLE [dbo].[pubsub_node] ALTER COLUMN [plugin] VARCHAR (32);
go
... and mqtt_pub
table was incorrectly defined in old schema:
ALTER TABLE [dbo].[mqtt_pub] DROP CONSTRAINT [i_mqtt_topic_server];
ALTER TABLE [dbo].[mqtt_pub] DROP COLUMN [server_host];
ALTER TABLE [dbo].[mqtt_pub] ALTER COLUMN [resource] VARCHAR (250);
ALTER TABLE [dbo].[mqtt_pub] ALTER COLUMN [topic] VARCHAR (250);
ALTER TABLE [dbo].[mqtt_pub] ALTER COLUMN [username] VARCHAR (250);
CREATE UNIQUE CLUSTERED INDEX [dbo].[mqtt_topic] ON [mqtt_pub] (topic)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
go
... and sr_group
index/PK was inconsistent with other DBs:
ALTER TABLE [dbo].[sr_group] DROP CONSTRAINT [sr_group_PRIMARY];
CREATE UNIQUE CLUSTERED INDEX [sr_group_name] ON [sr_group] ([name])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
go
s2s_out_bounce_packet
hookejabberd_system_monitor
before stopping nodecaptcha_url
option now accepts auto
value, and it's the defaultmod_mam
: Add support for XEP-0425: Message Moderationmod_mam_sql
: Fix problem with results of mam queries using rsm with max and beforemod_muc_rtbl
: New module for Real-Time Block List for MUC rooms (#4017)mod_roster
: Set roster name from XEP-0172, or the stored one (#1611)mod_roster
: Preliminary support to store extra elements in subscription request (#840)mod_pubsub
: Pubsub xdata fields max_item/item_expira/children_max
use max
not infinity
mod_vcard_xupdate
: Invalidate vcard_xupdate
cache on all nodes when vcard is updatedext_mod
: Improve support for loading *.so
files from ext_mod
dependenciesgen_html_doc_for_commands
commandget_room_history
none
role for outcastsmod_muc_room:set_opts
process persistent flag firstcreate_room_with_opts
commandmod_muc:create_room()
update_sql
command: Many improvements in new schema migrationupdate_sql
command: Add support to migrate MySQL toonew
schema for MS SQLORDER BY
in subqueryejabberd_config:set_option/2
extauth.py
for testsextauth.py
ecs
container imagetini
as runtime initERLANG_NODE
fixed to ejabberd@localhost
ejabberd
container imageMETHOD
to build container using packages (#3983)tini
as runtime init/opt/ejabberd-*/lib
like the installersHOME
volume, it contains all the required subdirs.../releases/COOKIE
, it's no longer includedhttps://github.com/processone/ejabberd/compare/23.01...23.04
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.
Release notes copied from the original ejabberd 23.01 announcement post:
Almost three months after the previous release, ejabberd 23.01 includes many bug fixes, several improvements and some new features.
A new module, mod_mqtt_bridge
, can be used to replicate changes to MQTT topics between local and remote servers.
A more detailed explanation of those topics and other features:
Remember that support for Erlang/OTP 19.3 is discouraged, and will be removed in a future release. Please upgrade to Erlang/OTP 20.0 or newer. Check more details in the ejabberd 22.10 release announcement.
This new module allows to synchronize topic changes between local and remote servers. It can be configured to replicate local changes to remote server, or can subscribe to topics on remote server and update local copies when they change.
When connecting to a remote server you can use native or websocket encapsulated protocol, and you can connect using both v4 and v5 protocol. It can authenticate using username/password pair or with client TLS certificates.
Regarding MQTT support, there are several new hooks:
mqtt_publish
: New hook for MQTT publish eventmqtt_subscribe
and mqtt_unsubscribe
: New hooks for MQTT subscribe & unsubscribe eventslog_modules_fully
The loglevel
top-level option specifies the verbosity of log files generated by ejabberd.
If you want some specific modules to log everything, independently from whatever value you have configured in loglevel
, now you can use the new log_modules_fully
option.
For example, if you are investigating some problem in ejabberd_sm
and mod_client_state
:
loglevel: warning
log_modules_fully: [ejabberd_sm, mod_client_state]
(This option works only on systems with erlang 22 or newer).
outgoing_s2s_families
The outgoing_s2s_families
top-level option specifies which address families to try, in what order.
The default value has now been changed to try IPv6 first, as servers are within datacenters where IPv6 is more commonly enabled (contrary to clients). And if it's not present, then it'll just fall back to IPv4.
By the way, this option is obsolete and irrelevant when using ejabberd 23.01 and Erlang/OTP 22, or newer versions of them.
captcha_cmd
The captcha_cmd
top-level option specifies the full path to a script that can generate a CAPTCHA image. Now this option may specify an erlang module name, which should implement a function to generate a CAPTCHA image.
ejabberd does not include any such module, but there are two available in the ejabberd-contrib repository that you can install and try: mod_ecaptcha
and mod_captcha_rust
.
The protocols implemented or supported by ejabberd are defined in the corresponding source code modules since ejabberd 15.06. Until now, only the XEP number and supported version were tracked. Since now, it's possible to document what ejabberd version first implemented it, the implementation status and an arbitrary comment.
That information until now was only used by the script tools/check_xep_versions.sh
. A new script is added, tools/generate-doap.sh
, to generate a DOAP file with that information. A new target is added to Makefile: make doap
.
And that DOAP file is now published as ejabberd.doap
in the git repository. That file is read by the XMPP.org website to show ejabberd's protocols, see XMPP Servers: ejabberd.
Support for Visual Studio Code and variants is vastly improved. Thanks to the Erlang LS VSCode extension, the ejabberd git repository includes support for developing, compiling and debugging ejabberd with Visual Studio Code, VSCodium, Coder's code-server and Github Codespaces.
See more details in the ejabberd Docs: VSCode page.
misc:uri_parse/2
to allow declaring default ports for protocolsmnesia_system_event mnesia_up
when other node joins this (#3842)mod_conversejs
to CDN when there is no local copiespriv
hibernation_time
is not an option worth storing in room state (#3946)multicastc
was cached (#3950)ssl
options to mysql driverstandard_conforming_strings
to off
(#3944)jid
as a HTTP URL query argumentpubsub#type
field in disco#info
query to the node (#3914)api_permissions
: Fix option crash when doesn't have who:
sectionlog_modules_fully
: New option to list modules that will log everythingoutgoing_s2s_families
: Changed option's default to IPv6, and fall back to IPv4members_only
roomssplit/2
function that works with Erlang/OTP as old as 19.3cacerts
in SQL connections-protocol
erlang attributetools/generate-doap.sh
: New script to generate DOAP file, add make doap
(#3915)ejabberd.doap
: New DOAP file describing ejabberd supported protocolsmqtt_publish
: New hook for MQTT publish eventmqtt_(un)subscribe
: New hooks for MQTT subscribe & unsubscribe events.devcontainer
to use use devcontainer image and .vscode
.vscode
files to instruct VSCode how to run ejabberdhttps://github.com/processone/ejabberd/compare/22.10...23.01
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 Docker image is in Docker Hub, and there's an alternative Container image in GitHub Packages.
If you suspect that you've found a bug, please search or fill a bug report on GitHub Issues.
Release notes copied from the original ejabberd 22.10 announcement post:
This ejabberd 22.10 release includes six months of work, over 140 commits, including relevant improvements in MIX, MUC, SQL, and installers, and bug fixes as usual.
This version brings support for latest MIX protocol version, and significantly improves detection and recovery of SQL connection issues.
There are no breaking changes in SQL schemas, configuration, or commands API. If you develop an ejabberd module, notice two hooks have changed: muc_subscribed
and muc_unsubscribed
.
A more detailed explanation of those topics and other features:
You may remember than in the previous ejabberd release, ejabberd 22.05, support for Erlang/OTP 25 was introduced, even if 24.3 is still recommended for stable deployments.
It is expected that around April 2023, GitHub Actions will remove Ubuntu 18 and it will not be possible to run automatic tests for ejabberd using Erlang 19.3, the lowest possible will be Erlang 20.0.
For that reason, the planned schedule is:
log_burst_limit_*
optionsTwo options were added in #3865 to configure logging limits in case of high traffic:
log_burst_limit_window_time
defines the time period to rate-limit log messages by.
log_burst_limit_count
defines the number of messages to accept in that time period before starting to drop them.
ERL_DIST_PORT
option to work without epmdThe option ERL_DIST_PORT
is added to ejabberdctl.cfg
, disabled by default.
When this option is set to a port number, the Erlang node will not start epmd
and will not listen in a range of ports for erlang connections (typically used for ejabberdctl
and for clustering). Instead, the erlang node will simply listen in the configured port number.
Please note:
ERL_DIST_PORT
make relive
doesn't support ERL_DIST_PORT
, neither rebar3 nor elixircaptcha_cmd
optionSupport for the @VERSION@
and @SEMVER@
macros was added to the captcha_cmd
option in #3835.
Those macros are useful because the example captcha scripts are copied in a path like ejabberd-VERSION/priv/bin
that depends on the ejabberd version number and changes for each release. Also, depending on the install method (rebar3 or Elixir's mix), that VERSION
may be in XX.YY
or in SEMVER
format (respectively).
Now, it's possible to configure like this:
captcha_cmd: /opt/ejabberd-@VERSION@/lib/ejabberd-@SEMVER@/priv/bin/captcha.sh
Two hooks have changed: muc_subscribed
and muc_unsubscribed
. Now they get the packet and room state, and can modify the sent packets. If you write source code that adds functions to those hooks, please notice that previously they were ran like:
ejabberd_hooks:run(muc_subscribed, ServerHost, [ServerHost, Room, Host, BareJID]);
and now they are ran like this:
{Packet2a, Packet2b} = ejabberd_hooks:run_fold(muc_subscribed, ServerHost, {Packet1a, Packet1b},
[ServerHost, Room, Host, BareJID, StateData]),
being Packet1b a copy of Packet1a without the jid
attribute in the muc_subscribe
element.
Several translations were improved: Ukrainian, Chinese (Simplified), French, German, Russian, Portuguese (Brazil), Spanish and Catalan. Thanks to all this people that contribute in ejabberd at Weblate!
A new page is added in ejabberd's WebAdmin to view available external modules, update their source code, install, upgrade and remove them. All this is equivalent to what was already available using API commands from the modules tag.
Many modules in the ejabberd-contrib git repository have been improved, and their documentation updated. Additionally, those modules are now automatically tested, at least compilation, installation and static code analysis.
In addition to the normal improvements and fixes, two sections in the ejabberd Documentation are greatly improved:
log_burst_limit_*
options (#3865)ERL_DIST_PORT
option to work without epmdjose_jwt:verify
and log debugging details (#3890)@VERSION@
and @SEMVER@
in captcha_cmd
option (#3835)X-Forwarded-For
header more gracefulymod_admin_extra
: Handle empty roster group namesmod_conversejs
: Fix crash when mod_register not enabled (#3824)mod_host_meta
: Complain at start if listener is not encryptedmod_ping
: Fix regression on stop_ping
in clustering context (#3817)mod_pubsub
: Don't crash on command failuresmod_shared_roster
: Fix cache invalidationmod_shared_roster_ldap
: Update roster_get hook to use #roster_item{}
prosody2ejabberd
: Fix parsing of scram password from prosodymod_mix_pam
: Add new MIX namespaces to disco featuresmod_mix_pam
: Add handling of IQs with newer MIX namespacesmod_mix_pam
: Do roster pushes on join/leavemod_mix_pam
: Parse sub elements of the mix join remote resultmod_mix_pam
: Provide MIX channels as roster entries via hookmod_mix_pam
: Display joined channels on webadmin pagemod_mix_pam
: Adapt to renaming of participant-id
from mix_roster_channel recordmod_roster
: Change hook type from #roster{}
to #roster_item{}
mod_roster
: Respect MIX `` settingmod_roster
: Adapt to change of mix_annotate type to boolean in roster_querymod_shared_roster
: Fix wrong hook type #roster{}
(now #roster_item{}
)none
role (#3330)none
if it's already none
in mod_muc_room:process_item_change/3
mod_muc_admin:get_room_pid/2
INSERT ... ON DUPLICATE KEY UPDATE
for upsert on mysqlmake all
: Generate start scripts here, not in make install
(#3821)make clean
: Improve this and "distclean"make deps
: Ensure deps configuration is ran when getting deps (#3823)make help
: Update with recent changesmake install
: Don't leak DESTDIR in files copied by 'make install'make options
: Fix error reporting on OTP24+make update
: configure also in this case, similarly to make deps
.ejabberd-modules
directory if availablemake deps
, which performs additional steps (#3823)ERL_DIST_PORT
option to work without epmdejabberd-docker-install.bat
from docker-ejabberd git and rename ithttps://github.com/processone/ejabberd/compare/22.05...22.10
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 Docker image is in Docker Hub, and there's an alternative Container image in GitHub Packages.
If you suspect that you've found a bug, please search or fill a bug report on GitHub Issues.
A new ejabberd release is finally here! ejabberd 22.05 includes five months of work, 200 commits, including many improvements (MQTT, MUC, PubSub, ...) and bug fixes.
When upgrading from the previous version please notice: there are minor changes in SQL schemas, the included rebar and rebar3 binaries require Erlang/OTP 22 or higher, and make rel
uses different paths. There are no breaking changes in configuration, and only one change in commands API.
A more detailed explanation of those topics and other features:
Two new indexes were added to optimize MUC. Those indexes can be added in the database before upgrading to 22.05, that will not affect older versions.
To update an existing database, depending on the schema used to create it:
mysql.sql
or mysql.new.sql
):CREATE INDEX i_muc_room_host_created_at ON muc_room(host(75), created_at);
CREATE INDEX i_muc_room_subscribers_jid USING BTREE ON muc_room_subscribers(jid);
pg.sql
or pg.new.sql
):CREATE INDEX i_muc_room_host_created_at ON muc_room USING btree (host, created_at);
CREATE INDEX i_muc_room_subscribers_jid ON muc_room_subscribers USING btree (jid);
lite.sql
or lite.new.sql
):CREATE INDEX i_muc_room_host_created_at ON muc_room (host, created_at);
CREATE INDEX i_muc_room_subscribers_jid ON muc_room_subscribers(jid);
mssql.sql
):CREATE INDEX [muc_room_host_created_at] ON [muc_registered] (host, nick)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON);
CREATE INDEX [muc_room_subscribers_jid] ON [muc_room_subscribers] (jid);
If you moved your PostgreSQL database from old to new schema using mod_admin_update_sql or the update_sql API command, be aware that those methods forgot to perform some updates.
To fix an existing PostgreSQL database schema, apply those changes manually:
ALTER TABLE archive DROP CONSTRAINT i_archive_sh_peer;
ALTER TABLE archive DROP CONSTRAINT i_archive_sh_bare_peer;
CREATE INDEX i_archive_sh_username_peer ON archive USING btree (server_host, username, peer);
CREATE INDEX i_archive_sh_username_bare_peer ON archive USING btree (server_host, username, bare_peer);
DROP TABLE carboncopy;
ALTER TABLE push_session DROP CONSTRAINT i_push_session_susn;
CREATE UNIQUE INDEX i_push_session_susn ON push_session USING btree (server_host, username, service, node);
ALTER TABLE mix_pam DROP CONSTRAINT i_mix_pam;
ALTER TABLE mix_pam DROP CONSTRAINT i_mix_pam_us;
CREATE UNIQUE INDEX i_mix_pam ON mix_pam (username, server_host, channel, service);
CREATE INDEX i_mix_pam_us ON mix_pam (username, server_host);
ALTER TABLE route DROP CONSTRAINT i_route;
CREATE UNIQUE INDEX i_route ON route USING btree (domain, server_host, node, pid);
ALTER TABLE mqtt_pub DROP CONSTRAINT i_mqtt_topic;
CREATE UNIQUE INDEX i_mqtt_topic_server ON mqtt_pub (topic, server_host);
The oauth_revoke_token
API command has changed its returned result. Check oauth_revoke_token documentation.
If you use the command delete_old_messages periodically and noticed it can bring your system to an undesirable state with high CPU and memory consumption...
Now you can use delete_old_messages_batch, which performs the operation in batches, by setting the number of messages to delete per batch and the desired rate of messages to delete per minute.
Two companion commands are added: delete_old_messages_status to check the status of the batch operation, and abort_delete_old_messages to abort the batch process.
There are also new equivalent commands to delete old MAM messages.
From now, Erlang/OTP 25 is supported. As that's a brand new version, for stable deployments you may prefer to use 24.3 or other lower version.
Notice that ejabberd can be compiled with Erlang as old as 19.3, but the rebar and rebar3 binaries included with ejabberd 22.05 require at least Erlang 22. This means that, to compile ejabberd 22.05 with those tools using an Erlang version between 19.3 and 21.3, you should get yourself a compatible rebar/rebar3 binary. If your operating system doesn't provide a suitable one, you can download the old ones: rebar from ejabberd 21.12 and rebar3 from ejabberd 21.12.
Regarding Elixir supported versions:
make rel
and make dev
)make relive
mod_conversejs
was introduced in ejabberd 21.12 to serve a simple page for the Converse.js XMPP web browser client.
Several improvements in mod_conversejs
now allow a simpler configuration, and more customization at the same time:
@HOST@
keywordauto
, which uses local or remote Converse filesauth
and register
options are set based on ejabberd's configurationdefault_domain
option now has @HOST@
as default value, not the first defined vhostconversejs_options
: New option to setup additional options for Converseconversejs_resources
: New option to serve converse.js files (no need to setup an additional web server)For example, if you downloaded Converse, now you can setup WebSocket, mod_conversejs
, and serve Converse without additional web server, in an encrypted port, as simple as:
listen:
-
port: 443
module: ejabberd_http
tls: true
request_handlers:
/websocket: ejabberd_http_ws
/conversejs: mod_conversejs
modules:
mod_conversejs:
conversejs_resources: "/home/ejabberd/conversejs-9.0.0/package/dist"
With that configuration, Converse is available in https://localhost/conversejs
More details in the mod_conversejs documentation.
For many years, the release of a new ejabberd source code package was accompanied with binary installers, built using InstallBuilder and CEAN, and available in the ProcessOne Downloads page.
Since this ejabberd 22.05, there are new installers that use a completely different build method:
linux/amd64
and linux/arm64
architecturesmaster
branch, and available for download in the results of Installers Workflow
/opt/ejabberd*
and setups systemd serviceHowever, compared to the old installers, those new installers:
ejabberd.yml
and set the hosts
optionPlease give those new installers a try, and comment any problem, improvement or ideas.
In addition to the ejabberd/ecs
Docker container image published in Docker Hub, there is a new container image published in ejabberd GitHub Packages.
Its usage is similar to the ejabberd/ecs
image, with some benefits and changes worth noting:
linux/amd64
and linux/arm64
architecturesmaster
branch, in addition to the stable ejabberd releasesejabberd/ecs
/opt/ejabberd/
instead of /home/ejabberd/
See its documentation in CONTAINER.
If you used previous images from that GitHub Packages registry please note: until now they were identical to the ones in Docker Hub, but the new 22.05 image is slightly different: it stores data in /opt/ejabberd/
instead of /home/ejabberd/
. You can update the paths to the container volumes in this new image, or switch to Docker Hub to continue using the old same images.
Until now, the source code package available in the ProcessOne Downloads page was prepared manually together with the binary installers. Now all this is automated in GitHub, and the new source code package is simply the same one available in GitHub Tags.
The differences are:
tgz
it's now named tar.gz
.gitignore
fileconfigure
and aclocal.m4
filesThe compilation instructions are slightly improved and moved to a separate file: COMPILE.md
make relive
This new make relive
is similar to ejabberdctl live
, but without requiring to install or build an OTP release: compile and start ejabberd immediately!
Quickly put:
./autogen.sh && ./configure --with-rebar=./rebar3 && make
./autogen.sh && ./configure --with-rebar=mix && make
make relive
_build/relive/
_build/relive/ejabberdctl
ejabberd_admin:update().
Please note, when make relive
uses Elixir's Mix instead of Rebar3, it requires Elixir 1.11.0 or higher.
As you may notice while reading these release notes, there are new github workflows to build and publish the new installers and the container images, in addition to the Common Tests suite.
The last added workflow is Runtime. The Runtime workflow ensures that ejabberd compiles with Erlang/OTP 19.3 up to 25, using rebar, rebar3 and several Elixir versions. It also checks an OTP release can be built, started, register an account, and stop ejabberd.
See its source code runtime.yml and its results.
If you have troubles compiling ejabberd, check if those results reproduce your problem, and also see the steps used to compile and start ejabberd using Ubuntu.
The German, Portuguese, Portuguese (Brazil), Spanish and Catalan translations are updated and completed. The French translation was greatly improved and updated too.
Some sections in the ejabberd Documentation are improved:
c2s_terminated
hookerlang:system_info(logical_processors)
not always returning a numberdomain_balancing
: Allow for specifying type
only, without specifying component_number
mqtt_codec
(fixes login using MQTT 5)default_room_options
: Update options configurablesubscribe_room_many_max_users
: New option in mod_muc_admin
mod_conversejs
@HOST@
and auto
valuesauth
and register
options based on ejabberd configurationconversejs_options
: New optionconversejs_resources
: New optionmod_pubsub
: Allow for limiting item_expire
valuemod_pubsub
: Unsubscribe JID on whitelist removalnode_pep
: Add config-node and multi-items features (#3714)auth_jwt
: Checking if an user is active in SM for a JWT authenticated user (#3795)mod_configure
: Implement Get List of Registered/Online Users from XEP-0133mod_host_meta
: New module to serve host-meta files, see XEP-0156mod_mam
: Store all mucsub notifications not only message notificationsmod_ping
: Delete ping timer if resource is gone after the ping has been sentmod_ping
: Don't send ping if resource is gonemod_push
: Fix notifications for pending sessions (XEP-0198)mod_push
: Keep push session ID on session resumemod_shared_roster
: Adjust special group cache sizemod_shared_roster
: Normalize JID on unset_presence (#3752)mod_stun_disco
: Fix parsing of IPv6 listenersmake update
: Fix when used with rebar 3.18mix release
: Copy include/
files for ejabberd, deps and otp, in mix.exs
rebar3 release
: Fix ERTS path in ejabberdctl
configure.ac
: Set default ejabberd version number when not using gitmix.exs
: Move some dependencies as optionalmix.exs
: No need to use Distillery, Elixir has built-in support for OTP releases (#3788)tools/make-binaries
: New script for building Linux binariestools/make-installers
: New script for building command line installersmake relive
similar to ejabberdctl live
without installingejabberdctl
: Fix some warnings detected by ShellCheckejabberdctl
: Mention in the help: etop
, ping
and started
/stopped
make rel
: Switch to paths: conf/
, database/
, logs/
mix.exs
: Add -boot
and -boot_var
in ejabberdctl
instead of adding vm.args
tools/captcha.sh
: Fix some warnings detected by ShellCheckdelete_old_mam_messages_batch
: New command with rate limitdelete_old_messages_batch
: New command with rate limitget_room_occupants_number
: Don't request the whole MUC room state (#3684, #1964)get_vcard
: Add support for MUC room vCardoauth_revoke_token
: Add support to work with all backendsroom_unused_*
: Optimize commands in SQL by reusing created_at
rooms_unused_...
: Let get_all_rooms
handle global
argument (#3726)stop|restart
: Terminate ejabberd_sm before everything else to ensure sessions closing (#3641)subscribe_room_many
: New commandhttps://github.com/processone/ejabberd/compare/21.12...22.05
As usual, the release is tagged in the Git source code repository on GitHub.
The source package, installers (Linux, Mac...), Docker containers are now available in ejabberd's download page. To check the *.asc
signature files, see How to verify ProcessOne downloads integrity.
The Docker image is in Docker Hub, and a new Container image at GitHub Packages.
If you suspect that you've found a bug, please search or fill a bug report on GitHub Issues.
New versions, with -2
in the name, of the installers are available with some fixes. See details in the recent commits in https://github.com/processone/ejabberd/commits/master/tools