[ejabberd] [ANN] ejabberd 16.09

Jérôme Sautret jerome.sautret at process-one.net
Thu Sep 22 14:05:39 MSK 2016

Hello, we are happy to introduce our new ejabberd release, ejabberd
16.09. As usual it includes many bug fixes and improvements. But most
of all, it includes excellent student work done during the Google
Summer of Code program.

More specifically, this release adds the following major features:

* Support for Elixir configuration file. It means it is possible to
configure ejabberd using an Elixir script file instead of ejabberd
YAML format.
* Support XEP-0355 - Namespace Delegation
This allows to use an external entity to manage some of the server
features. This XEP is working with  Privileged Entity (XEP-0356).
* Support XEP-0356 - Privileged Entity
This allows a component or any entity to have a "privileged" status.
As a result, it can manage an entity roster on its behalf, send  or
receive  stanzas in the name of the server. The main goal of XEP-0356
is to create an external, server agnostic, PEP service.

Thanks to Anna Mukharram and Gabriel Gatu for their contributions.

## Namespace Delegation and Privileged Entity

Thanks to Anna Mukharram, it's now possible to delegate features to a
component with a privileged status, allowing components to get access
to some ejabberd's internal data and to perform some actions. This
allows developing advanced components that were previously not
possible to create with XEP-0114 - Jabber Component Protocol

On a typical setup, you'll use both XEP-0355 and XEP-0356. To do so,
you need to add `mod_delegation` to your modules section in ejabberd's
configuration, and delegate namespace to a component by adding a
component in your listener section. You may also grant some access to
this component. Here is an example of such configuration:

   port: 8888
   module: ejabberd_service
       password: "secret"
       filtering: ["node"]
       filtering: []

In the example above, a component serving `sat-pubsub.example.org`
will receive all pubsub requests and all MAM requests with the node
filtering attribute presented in a query packet. The component is also
allowed to get the roster of every user of the server and send
messages on behalf of the server.

Compliance with Salut à Toi (https://salut-a-toi.org) project
components have been tested: We can now run SàT components directly on
top of ejabberd.

Please, let us know if you write components for XMPP using this new feature!

## Ejabberd configuration in Elixir

Thanks to Gabriel Gatu, you now have choice when it comes to configure
ejabberd. While YAML configuration file is the default way to
configure ejabberd, it's now possible to write configuration as an
Elixir script which will be evaluated. The most notable benefit is the
ability to add some logic and get unlimited number of possibilities
for a dynamic configuration.

Here is an example of such configuration:

It also gives opportunity to apply a custom function for a given hook
to customize ejabberd behavior without need to write your own ejabberd
module. The following example adds an entry in the log when a user is

hook :register_user, [host: "localhost"], fn(user, server) ->
  info("User registered: #{user} on #{server}")

Elixir configuration files are expected to have `.exs` extensions.

Check `config/ejabberd.exs` for a complete default configuration, and
give it a try!

This is a work in progress, and you can expect more features soon. For
example, you cannot yet define different module or listener
configurations for different domains, but this is something we are
aware of and that is on our roadmap.

## Changes

This is a selection of the most important changes:

### New XMPP Extension support

- Support for XEP-0355 - Namespace Delegation
- Support for XEP-0356 - Privileged Entity

### Elixir support

- Support for Elixir-based configuration files

### MUC/Sub (https://docs.ejabberd.im/developer/proposed-extensions/muc-sub/)

- Add a new request to list MUC room subscribers
- Link MUC subscription to bare JID
- New commands `unsubscribe_room` and `unsubscribe_room` for MUC
subscriptions management through API
- Fix nick-to-jid mapping for MUC subscribers
- Fix subscribed rooms list retrieval
- Fix message routing from subscribers
- Do not update `muc_online_users` table on MUC/Sub operations

### MUC

- Support multiple JIDs in room invitations
- Create room on configuration request as per XEP-0045, 10.1.3

### PubSub

- Add SQL support for microblogging node plugin
- Fix publish with subscriber publish model and SQL backend
- node_mb: Call node_pep instead of node_hometree

### Stream Management

- New Stream Management option: ack_timeout
- Fix Stream Management feature for the websocket connections
- Cancel timer when waiting for resumption

### MAM and Offline

- Don't store messages of type "headline"
- Simplify "assume_mam_usage" option
- Honor hint for any non-"error" message
- Store announcements for offline users

### Database

- Session backend: fix clean Redis table
- `mod_shared_roster`: Support SQL backend

### ejabberdctcl admin tool

- ejabberdctl: do not force access rules check on register command
- ejabberdctl: do not force command line to pass a credential
- New commands `unsubscribe_room` and `unsubscribe_room` for MUC
subscriptions management
- New command `create_room_with_opts` to create room with custom config

### ejabberd API

- New commands `unsubscribe_room` and `unsubscribe_room` for MUC
subscriptions management
- New command `create_room_with_opts` to create room with custom config
- Add X-Admin and basic auth header to CORS allowed headers in http_api
- Properly process OPTIONS header in http_api for all paths
- Expand parsing of JSON input to be able to handle `update_roster` command
- Provide proper `args_desc` in `oauth_issue_token` command

### Developer features: ejabberd Hooks

- Add hooks `c2s_session_pending`, `c2s_session_resumed`,
`store_offline_message`, `store_mam_message`
- Add CSI user's JID argument to `csi_filter_stanza` and `csi_flush_queue` hooks
- Add functions to get/set some c2s #state elements from external modules
- `mod_client_state`: Let other modules filter stanzas
- rework c2s API to simplify push modules integration

### Installers

- Fix several issues on Windows installer

## Feedback

As usual, the release is tagged in the Git source code repository on
Github: https://github.com/processone/ejabberd.git

The source package and binary installers are available at ProcessOne:

If you suspect that you've found a bug, please search or fill a bug
report on Github:

Jérôme Sautret

More information about the ejabberd mailing list