24
1
mirror of https://github.com/processone/ejabberd.git synced 2024-06-10 21:47:01 +02:00

Compare commits

...

22 Commits

Author SHA1 Message Date
Badlop
5c6a399f5b Update links to some moved content in docs.ejabberd.im 2024-04-25 02:55:02 +02:00
Badlop
e744665171 Fix links in mix.exs 2024-04-24 13:20:48 +02:00
Badlop
0b16cbddde Remove vcard example config in mod_proxy65, it breaks PDF Docs generation 2024-04-24 13:20:47 +02:00
Badlop
7ea2c6eabf Improve markdown of md files 2024-04-24 13:20:46 +02:00
Badlop
45ca11ecd0 Improve markdown of generated documentation 2024-04-24 13:20:44 +02:00
Badlop
d8cdd82bf8 Rewrite vcard example configuration to not require extended format 2024-04-24 13:20:43 +02:00
Badlop
345af5a535 Remove ... in example configuration: it is assumed and reduces verbosity 2024-04-24 13:20:42 +02:00
Badlop
6e5895ce45 Update some modules doc to use the note field 2024-04-24 13:20:41 +02:00
Badlop
b70a2fe4cf Support for version note in modules too 2024-04-24 13:20:40 +02:00
Badlop
da01d932ea Add some text to examples, so docs Makefile can find and update its syntax 2024-04-24 13:20:39 +02:00
Badlop
7cd5808766 Mark toplevel options, commands and modules that changed in latest version 2024-04-24 13:20:37 +02:00
Badlop
c98302b3c0 Now modules themselves can have version annotations in 'note'
This was already supported in module options, toplevel options
and ejabberd_commands.
2024-04-24 13:20:36 +02:00
Badlop
cd7eedf589 Update API to mkdocs 2024-04-24 13:20:35 +02:00
Badlop
27bd8852a1 Update name of API section 2024-04-24 13:20:34 +02:00
Badlop
effcf0b7cf Update markdown text for version notes, to work with mkdocs 2024-04-24 13:20:33 +02:00
Badlop
71b9db688a Fix markdown indentation of JSON examples 2024-04-24 13:20:32 +02:00
Badlop
8be6dc7758 Use new shorthand to provide URLs relative to ejabberd Docs 2024-04-24 13:20:30 +02:00
Badlop
569f0b303b Use same module shorthand in API documentation than in module docs 2024-04-24 13:20:29 +02:00
Badlop
15e3add909 CHANGELOG.md: Fix markdown syntax to work with MkDocs 2024-04-24 13:20:28 +02:00
Badlop
68c0c4d94f Update doc headers to MkDocs and mention ejabberd version used 2024-04-24 13:20:27 +02:00
Badlop
a550a1c55c Fix documentation links to new URLs generated by MkDocs 2024-04-24 13:20:26 +02:00
Badlop
832588f861 mix.lock: Update to get p1_acme fix in ACME IPv6 2024-04-24 13:20:24 +02:00
50 changed files with 377 additions and 355 deletions

View File

@ -1,6 +1,7 @@
## Version 24.02 ## Version 24.02
Core: #### Core:
- Added Matrix gateway in `mod_matrix_gw` - Added Matrix gateway in `mod_matrix_gw`
- Support SASL2 and Bind2 - Support SASL2 and Bind2
- Support tls-server-end-point channel binding and sasl2 codec - Support tls-server-end-point channel binding and sasl2 codec
@ -11,7 +12,8 @@ Core:
- [`negotiation_timeout`](https://docs.ejabberd.im/admin/configuration/toplevel/#negotiation-timeout): Increase default value from 30s to 2m - [`negotiation_timeout`](https://docs.ejabberd.im/admin/configuration/toplevel/#negotiation-timeout): Increase default value from 30s to 2m
- mod_carboncopy: Teach how to interact with bind2 inline requests - mod_carboncopy: Teach how to interact with bind2 inline requests
Other: #### Other:
- ejabberdctl: Fix startup problem when having set `EJABBERD_OPTS` and logger options - ejabberdctl: Fix startup problem when having set `EJABBERD_OPTS` and logger options
- ejabberdctl: Set EJABBERD_OPTS back to `""`, and use previous flags as example - ejabberdctl: Set EJABBERD_OPTS back to `""`, and use previous flags as example
- eldap: Change logic for `eldap tls_verify=soft` and `false` - eldap: Change logic for `eldap tls_verify=soft` and `false`
@ -24,20 +26,23 @@ Other:
- mod_pubsub: PEP nodetree: Fix reversed logic in node fixup function - mod_pubsub: PEP nodetree: Fix reversed logic in node fixup function
- mod_pubsub: Only care about PEP bookmarks options when creating node from scratch - mod_pubsub: Only care about PEP bookmarks options when creating node from scratch
SQL: #### SQL:
- MySQL: Support `sha256_password` auth plugin - MySQL: Support `sha256_password` auth plugin
- ejabberd_sql_schema: Use the first unique index as a primary key - ejabberd_sql_schema: Use the first unique index as a primary key
- Update SQL schema files for MAM's XEP-0424 - Update SQL schema files for MAM's XEP-0424
- New option [`sql_flags`](https://docs.ejabberd.im/admin/configuration/toplevel/#sql-flags): right now only useful to enable `mysql_alternative_upsert` - New option [`sql_flags`](https://docs.ejabberd.im/admin/configuration/toplevel/#sql-flags): right now only useful to enable `mysql_alternative_upsert`
Installers and Container: #### Installers and Container:
- Container: Add ability to ignore failures in execution of `CTL_ON_*` commands - Container: Add ability to ignore failures in execution of `CTL_ON_*` commands
- Container: Update to Erlang/OTP 26.2, Elixir 1.16.1 and Alpine 3.19 - Container: Update to Erlang/OTP 26.2, Elixir 1.16.1 and Alpine 3.19
- Container: Update this custom ejabberdctl to match the main one - Container: Update this custom ejabberdctl to match the main one
- make-binaries: Bump OpenSSL 3.2.1, Erlang/OTP 26.2.2, Elixir 1.16.1 - make-binaries: Bump OpenSSL 3.2.1, Erlang/OTP 26.2.2, Elixir 1.16.1
- make-binaries: Bump many dependency versions - make-binaries: Bump many dependency versions
Commands API: #### Commands API:
- `print_sql_schema`: New command available in ejabberdctl command-line script - `print_sql_schema`: New command available in ejabberdctl command-line script
- ejabberdctl: Rework temporary node name generation - ejabberdctl: Rework temporary node name generation
- ejabberdctl: Print argument description, examples and note in help - ejabberdctl: Print argument description, examples and note in help
@ -51,7 +56,7 @@ Commands API:
- ejabberd_xmlrpc: Fix support for restuple error response - ejabberd_xmlrpc: Fix support for restuple error response
- mod_http_api: When no specific API version is requested, use the latest - mod_http_api: When no specific API version is requested, use the latest
Compilation with Rebar3/Elixir/Mix: #### Compilation with Rebar3/Elixir/Mix:
- Fix compilation with Erlang/OTP 27: don't use the reserved word 'maybe' - Fix compilation with Erlang/OTP 27: don't use the reserved word 'maybe'
- configure: Fix explanation of `--enable-group` option ([#4135](https://github.com/processone/ejabberd/issues/4135)) - configure: Fix explanation of `--enable-group` option ([#4135](https://github.com/processone/ejabberd/issues/4135))
- Add observer and runtime_tools in releases when `--enable-tools` - Add observer and runtime_tools in releases when `--enable-tools`
@ -82,7 +87,8 @@ Compilation with Rebar3/Elixir/Mix:
## Version 23.10 ## Version 23.10
Compilation: #### Compilation:
- Erlang/OTP: Raise the requirement to Erlang/OTP 20.0 as a minimum - Erlang/OTP: Raise the requirement to Erlang/OTP 20.0 as a minimum
- CI: Update tests to Erlang/OTP 26 and recent Elixir - CI: Update tests to Erlang/OTP 26 and recent Elixir
- Move Xref and Dialyzer options from workflows to `rebar.config` - Move Xref and Dialyzer options from workflows to `rebar.config`
@ -95,7 +101,8 @@ Compilation:
- Elixir: When building OTP release with mix, keep `ERLANG_NODE=ejabberd@localhost` - Elixir: When building OTP release with mix, keep `ERLANG_NODE=ejabberd@localhost`
- `ejabberdctl`: Pass `ERLANG_OPTS` when calling `erl` to parse the `INET_DIST_INTERFACE` ([#4066](https://github.com/processone/ejabberd/issues/#4066) - `ejabberdctl`: Pass `ERLANG_OPTS` when calling `erl` to parse the `INET_DIST_INTERFACE` ([#4066](https://github.com/processone/ejabberd/issues/#4066)
Commands: #### Commands:
- `create_room_with_opts`: Fix typo and move examples to `args_example` ([#4080](https://github.com/processone/ejabberd/issues/#4080)) - `create_room_with_opts`: Fix typo and move examples to `args_example` ([#4080](https://github.com/processone/ejabberd/issues/#4080))
- `etop`: Let `ejabberdctl etop` work in a release (if `observer` application is available) - `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](https://github.com/processone/ejabberd/issues/#4088)) - `get_roster`: Command now returns groups in a list instead of newlines ([#4088](https://github.com/processone/ejabberd/issues/#4088))
@ -105,7 +112,8 @@ Commands:
- `ejabberdctl`: Support `policy=user` in the help and return proper arguments - `ejabberdctl`: Support `policy=user` in the help and return proper arguments
- `ejabberdctl`: Document how to stop a debug shell: control+g - `ejabberdctl`: Document how to stop a debug shell: control+g
Container: #### Container:
- Dockerfile: Add missing dependency for mssql databases - Dockerfile: Add missing dependency for mssql databases
- Dockerfile: Reorder stages and steps for consistency - Dockerfile: Reorder stages and steps for consistency
- Dockerfile: Use Alpine as base for `METHOD=package` - Dockerfile: Use Alpine as base for `METHOD=package`
@ -113,7 +121,8 @@ Container:
- Dockerfile: Provide specific OTP and elixir vsn for direct compilation - Dockerfile: Provide specific OTP and elixir vsn for direct compilation
- Halt ejabberd if a command in `CTL_ON_` fails during ejabberd startup - Halt ejabberd if a command in `CTL_ON_` fails during ejabberd startup
Core: #### Core:
- `auth_external_user_exists_check`: New option ([#3377](https://github.com/processone/ejabberd/issues/#3377)) - `auth_external_user_exists_check`: New option ([#3377](https://github.com/processone/ejabberd/issues/#3377))
- `gen_mod`: Extend `gen_mod` API to simplify hooks and IQ handlers registration - `gen_mod`: Extend `gen_mod` API to simplify hooks and IQ handlers registration
- `gen_mod`: Add shorter forms for `gen_mod` hook/`iq_handler` API - `gen_mod`: Add shorter forms for `gen_mod` hook/`iq_handler` API
@ -128,14 +137,15 @@ Core:
- Web Admin: In roster page move the `AddJID` textbox to top ([#4067](https://github.com/processone/ejabberd/issues/#4067)) - Web Admin: In roster page move the `AddJID` textbox to top ([#4067](https://github.com/processone/ejabberd/issues/#4067))
- Web Admin: Show a warning when visiting webadmin with non-privileged account ([#4089](https://github.com/processone/ejabberd/issues/#4089)) - Web Admin: Show a warning when visiting webadmin with non-privileged account ([#4089](https://github.com/processone/ejabberd/issues/#4089))
Docs: #### Docs:
- Example configuration: clarify 5223 tls options; specify s2s shaper - Example configuration: clarify 5223 tls options; specify s2s shaper
- Make sure that `policy=user` commands have `host` instead of `server` arg in docs - Make sure that `policy=user` commands have `host` instead of `server` arg in docs
- Improve syntax of many command descriptions for the Docs site - Improve syntax of many command descriptions for the Docs site
- Move example Perl extauth script from ejabberd git to Docs site - Move example Perl extauth script from ejabberd git to Docs site
- Remove obsolete example files, and add link in Docs to the archived copies - Remove obsolete example files, and add link in Docs to the archived copies
Installers (`make-binaries`): #### Installers (`make-binaries`):
- Bump Erlang/OTP version to 26.1.1, and other dependencies - Bump Erlang/OTP version to 26.1.1, and other dependencies
- Remove outdated workaround - Remove outdated workaround
- Don't build Linux-PAM examples - Don't build Linux-PAM examples
@ -147,7 +157,8 @@ Installers (`make-binaries`):
- Set kernel version for all builds - Set kernel version for all builds
- Let curl fail on HTTP errors - Let curl fail on HTTP errors
Modules: #### Modules:
- `mod_muc_log`: Add trailing backslash to URLs shown in disco info - `mod_muc_log`: Add trailing backslash to URLs shown in disco info
- `mod_muc_occupantid`: New module with support for XEP-0421 Occupant Id ([#3397](https://github.com/processone/ejabberd/issues/#3397)) - `mod_muc_occupantid`: New module with support for XEP-0421 Occupant Id ([#3397](https://github.com/processone/ejabberd/issues/#3397))
- `mod_muc_rtbl`: Better error handling in ([#4050](https://github.com/processone/ejabberd/issues/#4050)) - `mod_muc_rtbl`: Better error handling in ([#4050](https://github.com/processone/ejabberd/issues/#4050))
@ -165,7 +176,8 @@ Modules:
- `mod_register_web`: Make redirect to page that end with `/` ([#3177](https://github.com/processone/ejabberd/issues/#3177)) - `mod_register_web`: Make redirect to page that end with `/` ([#3177](https://github.com/processone/ejabberd/issues/#3177))
- `mod_shared_roster_ldap`: Don't crash in `get_member_jid` on empty output ([#3614](https://github.com/processone/ejabberd/issues/#3614)) - `mod_shared_roster_ldap`: Don't crash in `get_member_jid` on empty output ([#3614](https://github.com/processone/ejabberd/issues/#3614))
MUC: #### MUC:
- Add support to register nick in a room ([#3455](https://github.com/processone/ejabberd/issues/#3455)) - Add support to register nick in a room ([#3455](https://github.com/processone/ejabberd/issues/#3455))
- Convert `allow_private_message` MUC room option to `allowpm` ([#3736](https://github.com/processone/ejabberd/issues/#3736)) - Convert `allow_private_message` MUC room option to `allowpm` ([#3736](https://github.com/processone/ejabberd/issues/#3736))
- Update xmpp version to send `roomconfig_changesubject` in disco#info ([#4085](https://github.com/processone/ejabberd/issues/#4085)) - Update xmpp version to send `roomconfig_changesubject` in disco#info ([#4085](https://github.com/processone/ejabberd/issues/#4085))
@ -178,7 +190,8 @@ MUC:
- Remove existing role information for users that are kicked from room ([#4035](https://github.com/processone/ejabberd/issues/#4035)) - Remove existing role information for users that are kicked from room ([#4035](https://github.com/processone/ejabberd/issues/#4035))
- Expand rule "mucsub subscribers are members in members only rooms" to more places - Expand rule "mucsub subscribers are members in members only rooms" to more places
SQL: #### SQL:
- Add ability to force alternative upsert implementation in mysql - Add ability to force alternative upsert implementation in mysql
- Properly parse mysql version even if it doesn't have type tag - Properly parse mysql version even if it doesn't have type tag
- Use prepared statement with mysql - Use prepared statement with mysql
@ -190,7 +203,8 @@ SQL:
## Version 23.04 ## Version 23.04
General: #### General:
- New `s2s_out_bounce_packet` hook - New `s2s_out_bounce_packet` hook
- Re-allow anonymous connection for connection without client certificates ([#3985](https://github.com/processone/ejabberd/issues/3985)) - Re-allow anonymous connection for connection without client certificates ([#3985](https://github.com/processone/ejabberd/issues/3985))
- Stop `ejabberd_system_monitor` before stopping node - Stop `ejabberd_system_monitor` before stopping node
@ -203,13 +217,15 @@ General:
- `mod_pubsub`: Pubsub xdata fields `max_item/item_expira/children_max` use `max` not `infinity` - `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 updated - `mod_vcard_xupdate`: Invalidate `vcard_xupdate` cache on all nodes when vcard is updated
Admin: #### Admin:
- `ext_mod`: Improve support for loading `*.so` files from `ext_mod` dependencies - `ext_mod`: Improve support for loading `*.so` files from `ext_mod` dependencies
- Improve output in `gen_html_doc_for_commands` command - Improve output in `gen_html_doc_for_commands` command
- Fix ejabberdctl output formatting ([#3979](https://github.com/processone/ejabberd/issues/3979)) - Fix ejabberdctl output formatting ([#3979](https://github.com/processone/ejabberd/issues/3979))
- Log HTTP handler exceptions - Log HTTP handler exceptions
MUC: #### MUC:
- New command `get_room_history` - New command `get_room_history`
- Persist `none` role for outcasts - Persist `none` role for outcasts
- Try to populate room history from mam when unhibernating - Try to populate room history from mam when unhibernating
@ -218,7 +234,8 @@ MUC:
- Store state in db in `mod_muc:create_room()` - Store state in db in `mod_muc:create_room()`
- Make subscribers members by default - Make subscribers members by default
SQL schemas: #### SQL schemas:
- Fix a long standing bug in new schema migration - Fix a long standing bug in new schema migration
- `update_sql` command: Many improvements in new schema migration - `update_sql` command: Many improvements in new schema migration
- `update_sql` command: Add support to migrate MySQL too - `update_sql` command: Add support to migrate MySQL too
@ -227,14 +244,16 @@ SQL schemas:
- Remove unnecessary indexes - Remove unnecessary indexes
- New SQL schema migrate fix - New SQL schema migrate fix
MS SQL: #### MS SQL:
- MS SQL schema fixes - MS SQL schema fixes
- Add `new` schema for MS SQL - Add `new` schema for MS SQL
- Add MS SQL support for new schema migration - Add MS SQL support for new schema migration
- Minor MS SQL improvements - Minor MS SQL improvements
- Fix MS SQL error caused by `ORDER BY` in subquery - Fix MS SQL error caused by `ORDER BY` in subquery
SQL Tests: #### SQL Tests:
- Add support for running tests on MS SQL - Add support for running tests on MS SQL
- Add ability to run tests on upgraded DB - Add ability to run tests on upgraded DB
- Un-deprecate `ejabberd_config:set_option/2` - Un-deprecate `ejabberd_config:set_option/2`
@ -242,7 +261,8 @@ SQL Tests:
- Correct README for creating test docker MS SQL DB - Correct README for creating test docker MS SQL DB
- Fix TSQLlint warnings in MSSQL test script - Fix TSQLlint warnings in MSSQL test script
Testing: #### Testing:
- Fix Shellcheck warnings in shell scripts - Fix Shellcheck warnings in shell scripts
- Fix Remark-lint warnings - Fix Remark-lint warnings
- Fix Prospector and Pylint warnings in test `extauth.py` - Fix Prospector and Pylint warnings in test `extauth.py`
@ -250,14 +270,14 @@ Testing:
- Test only with oldest OTP supported (20.0), newest stable (25.3) and bleeding edge (26.0-rc2) - Test only with oldest OTP supported (20.0), newest stable (25.3) and bleeding edge (26.0-rc2)
- Upload Common Test logs as artifact in case of failure - Upload Common Test logs as artifact in case of failure
`ecs` container image: #### `ecs` container image:
- Update Alpine to 3.17 to get Erlang/OTP 25 and Elixir 1.14 - Update Alpine to 3.17 to get Erlang/OTP 25 and Elixir 1.14
- Add `tini` as runtime init - Add `tini` as runtime init
- Set `ERLANG_NODE` fixed to `ejabberd@localhost` - Set `ERLANG_NODE` fixed to `ejabberd@localhost`
- Upload images as artifacts to Github Actions - Upload images as artifacts to Github Actions
- Publish tag images automatically to ghcr.io - Publish tag images automatically to ghcr.io
`ejabberd` container image: #### `ejabberd` container image:
- Update Alpine to 3.17 to get Erlang/OTP 25 and Elixir 1.14 - Update Alpine to 3.17 to get Erlang/OTP 25 and Elixir 1.14
- Add `METHOD` to build container using packages ([#3983](https://github.com/processone/ejabberd/issues/3983)) - Add `METHOD` to build container using packages ([#3983](https://github.com/processone/ejabberd/issues/3983))
- Add `tini` as runtime init - Add `tini` as runtime init
@ -267,14 +287,16 @@ Testing:
- Expose only `HOME` volume, it contains all the required subdirs - Expose only `HOME` volume, it contains all the required subdirs
- ejabberdctl: Don't use `.../releases/COOKIE`, it's no longer included - ejabberdctl: Don't use `.../releases/COOKIE`, it's no longer included
Installers: #### Installers:
- make-binaries: Bump versions, e.g. erlang/otp to 25.3 - make-binaries: Bump versions, e.g. erlang/otp to 25.3
- make-binaries: Fix building with erlang/otp v25.x - make-binaries: Fix building with erlang/otp v25.x
- make-packages: Fix for installers workflow, which didn't find lynx - make-packages: Fix for installers workflow, which didn't find lynx
## Version 23.01 ## Version 23.01
General: #### General:
- Add `misc:uri_parse/2` to allow declaring default ports for protocols - Add `misc:uri_parse/2` to allow declaring default ports for protocols
- CAPTCHA: Add support to define module instead of path to script - CAPTCHA: Add support to define module instead of path to script
- Clustering: Handle `mnesia_system_event mnesia_up` when other node joins this ([#3842](https://github.com/processone/ejabberd/issues/3842)) - Clustering: Handle `mnesia_system_event mnesia_up` when other node joins this ([#3842](https://github.com/processone/ejabberd/issues/3842))
@ -294,7 +316,8 @@ General:
- PubSub: Expose the `pubsub#type` field in `disco#info` query to the node ([#3914](https://github.com/processone/ejabberd/issues/3914)) - PubSub: Expose the `pubsub#type` field in `disco#info` query to the node ([#3914](https://github.com/processone/ejabberd/issues/3914))
- Translations: Update German translation - Translations: Update German translation
Admin: #### Admin:
- `api_permissions`: Fix option crash when doesn't have `who:` section - `api_permissions`: Fix option crash when doesn't have `who:` section
- `log_modules_fully`: New option to list modules that will log everything - `log_modules_fully`: New option to list modules that will log everything
- `outgoing_s2s_families`: Changed option's default to IPv6, and fall back to IPv4 - `outgoing_s2s_families`: Changed option's default to IPv6, and fall back to IPv4
@ -305,13 +328,15 @@ Admin:
- Silent warning in OTP24 about not specified `cacerts` in SQL connections - Silent warning in OTP24 about not specified `cacerts` in SQL connections
- Fix compilation warnings with Elixir 1.14 - Fix compilation warnings with Elixir 1.14
DOAP: #### DOAP:
- Support extended `-protocol` erlang attribute - Support extended `-protocol` erlang attribute
- Add extended RFCs and XEP details to some protocol attributes - Add extended RFCs and XEP details to some protocol attributes
- `tools/generate-doap.sh`: New script to generate DOAP file, add `make doap` ([#3915](https://github.com/processone/ejabberd/issues/3915)) - `tools/generate-doap.sh`: New script to generate DOAP file, add `make doap` ([#3915](https://github.com/processone/ejabberd/issues/3915))
- `ejabberd.doap`: New DOAP file describing ejabberd supported protocols - `ejabberd.doap`: New DOAP file describing ejabberd supported protocols
MQTT: #### MQTT:
- Add MQTT bridge module - Add MQTT bridge module
- Add support for certificate authentication in MQTT bridge - Add support for certificate authentication in MQTT bridge
- Implement reload in MQTT bridge - Implement reload in MQTT bridge
@ -320,7 +345,8 @@ MQTT:
- `mqtt_publish`: New hook for MQTT publish event - `mqtt_publish`: New hook for MQTT publish event
- `mqtt_(un)subscribe`: New hooks for MQTT subscribe & unsubscribe events - `mqtt_(un)subscribe`: New hooks for MQTT subscribe & unsubscribe events
VSCode: #### VSCode:
- Improve `.devcontainer` to use use devcontainer image and `.vscode` - Improve `.devcontainer` to use use devcontainer image and `.vscode`
- Add `.vscode` files to instruct VSCode how to run ejabberd - Add `.vscode` files to instruct VSCode how to run ejabberd
- Add Erlang LS default configuration - Add Erlang LS default configuration
@ -328,7 +354,8 @@ VSCode:
## Version 22.10 ## Version 22.10
Core: #### Core:
- Add `log_burst_limit_*` options ([#3865](https://github.com/processone/ejabberd/issues/3865)) - Add `log_burst_limit_*` options ([#3865](https://github.com/processone/ejabberd/issues/3865))
- Support `ERL_DIST_PORT` option to work without epmd - Support `ERL_DIST_PORT` option to work without epmd
- Auth JWT: Catch all errors from `jose_jwt:verify` and log debugging details ([#3890](https://github.com/processone/ejabberd/issues/3890)) - Auth JWT: Catch all errors from `jose_jwt:verify` and log debugging details ([#3890](https://github.com/processone/ejabberd/issues/3890))
@ -346,7 +373,8 @@ Core:
- `mod_shared_roster_ldap`: Update roster_get hook to use `#roster_item{}` - `mod_shared_roster_ldap`: Update roster_get hook to use `#roster_item{}`
- `prosody2ejabberd`: Fix parsing of scram password from prosody - `prosody2ejabberd`: Fix parsing of scram password from prosody
MIX: #### MIX:
- Fix MIX's filter_nodes - Fix MIX's filter_nodes
- Return user jid on join - Return user jid on join
- `mod_mix_pam`: Add new MIX namespaces to disco features - `mod_mix_pam`: Add new MIX namespaces to disco features
@ -361,7 +389,8 @@ MIX:
- `mod_roster`: Adapt to change of mix_annotate type to boolean in roster_query - `mod_roster`: Adapt to change of mix_annotate type to boolean in roster_query
- `mod_shared_roster`: Fix wrong hook type `#roster{}` (now `#roster_item{}`) - `mod_shared_roster`: Fix wrong hook type `#roster{}` (now `#roster_item{}`)
MUC: #### MUC:
- Store role, and use it when joining a moderated room ([#3330](https://github.com/processone/ejabberd/issues/3330)) - Store role, and use it when joining a moderated room ([#3330](https://github.com/processone/ejabberd/issues/3330))
- Don't persist `none` role ([#3330](https://github.com/processone/ejabberd/issues/3330)) - Don't persist `none` role ([#3330](https://github.com/processone/ejabberd/issues/3330))
- Allow MUC service admins to bypass max_user_conferences limitation - Allow MUC service admins to bypass max_user_conferences limitation
@ -374,7 +403,8 @@ MUC:
- Export `mod_muc_admin:get_room_pid/2` - Export `mod_muc_admin:get_room_pid/2`
- Export function for getting room diagnostics - Export function for getting room diagnostics
SQL: #### SQL:
- Handle errors reported from begin/commit inside transaction - Handle errors reported from begin/commit inside transaction
- Make connection close errors bubble up from inside sql transaction - Make connection close errors bubble up from inside sql transaction
- Make first sql reconnect wait shorter time - Make first sql reconnect wait shorter time
@ -386,7 +416,8 @@ SQL:
- Update mysql library - Update mysql library
- Catch mysql connection being close earlier - Catch mysql connection being close earlier
Build: #### Build:
- `make all`: Generate start scripts here, not in `make install` ([#3821](https://github.com/processone/ejabberd/issues/3821)) - `make all`: Generate start scripts here, not in `make install` ([#3821](https://github.com/processone/ejabberd/issues/3821))
- `make clean`: Improve this and "distclean" - `make clean`: Improve this and "distclean"
- `make deps`: Ensure deps configuration is ran when getting deps ([#3823](https://github.com/processone/ejabberd/issues/3823)) - `make deps`: Ensure deps configuration is ran when getting deps ([#3823](https://github.com/processone/ejabberd/issues/3823))
@ -399,7 +430,8 @@ Build:
- Remove unused macro definitions detected by rebar3_hank - Remove unused macro definitions detected by rebar3_hank
- Remove unused header files which content is already in xmpp library - Remove unused header files which content is already in xmpp library
Container: #### Container:
- Get ejabberd-contrib sources to include them - Get ejabberd-contrib sources to include them
- Copy `.ejabberd-modules` directory if available - Copy `.ejabberd-modules` directory if available
- Do not clone repo inside container build - Do not clone repo inside container build
@ -409,7 +441,8 @@ Container:
- Set a less frequent healthcheck to reduce CPU usage ([#3826](https://github.com/processone/ejabberd/issues/3826)) - Set a less frequent healthcheck to reduce CPU usage ([#3826](https://github.com/processone/ejabberd/issues/3826))
- Fix build instructions, add more podman examples - Fix build instructions, add more podman examples
Installers: #### Installers:
- make-binaries: Include CAPTCHA script with release - make-binaries: Include CAPTCHA script with release
- make-binaries: Edit rebar.config more carefully - make-binaries: Edit rebar.config more carefully
- make-binaries: Fix linking of EIMP dependencies - make-binaries: Fix linking of EIMP dependencies
@ -423,14 +456,16 @@ Installers:
- make-installers: Override code on upgrade - make-installers: Override code on upgrade
- make-installers: Apply cosmetic changes - make-installers: Apply cosmetic changes
External modules: #### External modules:
- ext_mod: Support managing remote nodes in the cluster - ext_mod: Support managing remote nodes in the cluster
- ext_mod: Handle correctly when COMMIT.json not found - ext_mod: Handle correctly when COMMIT.json not found
- Don't bother with COMMIT.json user-friendly feature in automated user case - Don't bother with COMMIT.json user-friendly feature in automated user case
- Handle not found COMMIT.json, for example in GH Actions - Handle not found COMMIT.json, for example in GH Actions
- Add WebAdmin page for managing external modules - Add WebAdmin page for managing external modules
Workflows Actions: #### Workflows Actions:
- Update workflows to Erlang 25 - Update workflows to Erlang 25
- Update workflows: Ubuntu 18 is deprecated and 22 is added - Update workflows: Ubuntu 18 is deprecated and 22 is added
- CI: Remove syntax_tools from applications, as fast_xml fails Dialyzer - CI: Remove syntax_tools from applications, as fast_xml fails Dialyzer
@ -438,42 +473,42 @@ Workflows Actions:
## Version 22.05 ## Version 22.05
Core #### Core
- C2S: Don't expect that socket will be available in `c2s_terminated` hook - C2S: Don't expect that socket will be available in `c2s_terminated` hook
- Event handling process hook tracing - Event handling process hook tracing
- Guard against `erlang:system_info(logical_processors)` not always returning a number - Guard against `erlang:system_info(logical_processors)` not always returning a number
- `domain_balancing`: Allow for specifying `type` only, without specifying `component_number` - `domain_balancing`: Allow for specifying `type` only, without specifying `component_number`
MQTT #### MQTT
- Add TLS certificate authentication for MQTT connections - Add TLS certificate authentication for MQTT connections
- Fix login when generating client id, keep connection record (#3593) - Fix login when generating client id, keep connection record (#3593)
- Pass property name as expected in mqtt_codec (fixes login using MQTT 5) - Pass property name as expected in mqtt_codec (fixes login using MQTT 5)
- Support MQTT subscriptions spread over the cluster (#3750) - Support MQTT subscriptions spread over the cluster (#3750)
MUC #### MUC
- Attach meta field with real jid to mucsub subscription events - Attach meta field with real jid to mucsub subscription events
- Handle user removal - Handle user removal
- Stop empty MUC rooms 30 seconds after creation - Stop empty MUC rooms 30 seconds after creation
- `default_room_options`: Update options configurable - `default_room_options`: Update options configurable
- `subscribe_room_many_max_users`: New option in `mod_muc_admin` - `subscribe_room_many_max_users`: New option in `mod_muc_admin`
mod_conversejs #### mod_conversejs
- Improved options to support `@HOST@` and `auto` values - Improved options to support `@HOST@` and `auto` values
- Set `auth` and `register` options based on ejabberd configuration - Set `auth` and `register` options based on ejabberd configuration
- `conversejs_options`: New option - `conversejs_options`: New option
- `conversejs_resources`: New option - `conversejs_resources`: New option
PubSub #### PubSub
- `mod_pubsub`: Allow for limiting `item_expire` value - `mod_pubsub`: Allow for limiting `item_expire` value
- `mod_pubsub`: Unsubscribe JID on whitelist removal - `mod_pubsub`: Unsubscribe JID on whitelist removal
- `node_pep`: Add config-node and multi-items features (#3714) - `node_pep`: Add config-node and multi-items features (#3714)
SQL #### SQL
- Improve compatibility with various db engine versions - Improve compatibility with various db engine versions
- Sync old-to-new schema script with reality (#3790) - Sync old-to-new schema script with reality (#3790)
- Slight improvement in MSSQL testing support, but not yet complete - Slight improvement in MSSQL testing support, but not yet complete
Other Modules #### Other Modules
- `auth_jwt`: Checking if an user is active in SM for a JWT authenticated user (#3795) - `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-0133 - `mod_configure`: Implement Get List of Registered/Online Users from XEP-0133
- `mod_host_meta`: New module to serve host-meta files, see XEP-0156 - `mod_host_meta`: New module to serve host-meta files, see XEP-0156
@ -486,7 +521,7 @@ Other Modules
- `mod_shared_roster`: Normalize JID on unset_presence (#3752) - `mod_shared_roster`: Normalize JID on unset_presence (#3752)
- `mod_stun_disco`: Fix parsing of IPv6 listeners - `mod_stun_disco`: Fix parsing of IPv6 listeners
Dependencies #### Dependencies
- autoconf: Supported from 2.59 to the new 2.71 - autoconf: Supported from 2.59 to the new 2.71
- fast_tls: Update to 1.1.14 to support OpenSSL 3 - fast_tls: Update to 1.1.14 to support OpenSSL 3
- jiffy: Update to 1.1.1 to support Erlang/OTP 25.0-rc1 - jiffy: Update to 1.1.1 to support Erlang/OTP 25.0-rc1
@ -496,7 +531,7 @@ Dependencies
- rebar3: Updated binary to work from Erlang/OTP 22 to 25 - rebar3: Updated binary to work from Erlang/OTP 22 to 25
- `make update`: Fix when used with rebar 3.18 - `make update`: Fix when used with rebar 3.18
Compile #### Compile
- `mix release`: Copy `include/` files for ejabberd, deps and otp, in `mix.exs` - `mix release`: Copy `include/` files for ejabberd, deps and otp, in `mix.exs`
- `rebar3 release`: Fix ERTS path in `ejabberdctl` - `rebar3 release`: Fix ERTS path in `ejabberdctl`
- `configure.ac`: Set default ejabberd version number when not using git - `configure.ac`: Set default ejabberd version number when not using git
@ -505,7 +540,7 @@ Compile
- `tools/make-binaries`: New script for building Linux binaries - `tools/make-binaries`: New script for building Linux binaries
- `tools/make-installers`: New script for building command line installers - `tools/make-installers`: New script for building command line installers
Start #### Start
- New `make relive` similar to `ejabberdctl live` without installing - New `make relive` similar to `ejabberdctl live` without installing
- `ejabberdctl`: Fix some warnings detected by ShellCheck - `ejabberdctl`: Fix some warnings detected by ShellCheck
- `ejabberdctl`: Mention in the help: `etop`, `ping` and `started`/`stopped` - `ejabberdctl`: Mention in the help: `etop`, `ping` and `started`/`stopped`
@ -513,7 +548,7 @@ Start
- `mix.exs`: Add `-boot` and `-boot_var` in `ejabberdctl` instead of adding `vm.args` - `mix.exs`: Add `-boot` and `-boot_var` in `ejabberdctl` instead of adding `vm.args`
- `tools/captcha.sh`: Fix some warnings detected by ShellCheck - `tools/captcha.sh`: Fix some warnings detected by ShellCheck
Commands #### Commands
- Accept more types of ejabberdctl commands arguments as JSON-encoded - Accept more types of ejabberdctl commands arguments as JSON-encoded
- `delete_old_mam_messages_batch`: New command with rate limit - `delete_old_mam_messages_batch`: New command with rate limit
- `delete_old_messages_batch`: New command with rate limit - `delete_old_messages_batch`: New command with rate limit
@ -525,7 +560,7 @@ Commands
- `stop|restart`: Terminate ejabberd_sm before everything else to ensure sessions closing (#3641) - `stop|restart`: Terminate ejabberd_sm before everything else to ensure sessions closing (#3641)
- `subscribe_room_many`: New command - `subscribe_room_many`: New command
Translations #### Translations
- Updated Catalan - Updated Catalan
- Updated French - Updated French
- Updated German - Updated German
@ -533,7 +568,7 @@ Translations
- Updated Portuguese (Brazil) - Updated Portuguese (Brazil)
- Updated Spanish - Updated Spanish
Workflows #### Workflows
- CI: Publish CT logs and Cover on failure to an external GH Pages repo - CI: Publish CT logs and Cover on failure to an external GH Pages repo
- CI: Test shell scripts using ShellCheck (#3738) - CI: Test shell scripts using ShellCheck (#3738)
- Container: New workflow to build and publish containers - Container: New workflow to build and publish containers
@ -543,12 +578,12 @@ Workflows
## Version 21.12 ## Version 21.12
Commands #### Commands
- `create_room_with_opts`: Fixed when using SQL storage - `create_room_with_opts`: Fixed when using SQL storage
- `change_room_option`: Add missing fields from config inside `mod_muc_admin:change_options` - `change_room_option`: Add missing fields from config inside `mod_muc_admin:change_options`
- piefxis: Fixed arguments of all commands - piefxis: Fixed arguments of all commands
Modules #### Modules
- mod_caps: Don't forget caps on XEP-0198 resumption - mod_caps: Don't forget caps on XEP-0198 resumption
- mod_conversejs: New module to serve a simple page for Converse.js - mod_conversejs: New module to serve a simple page for Converse.js
- mod_http_upload_quota: Avoid `max_days` race - mod_http_upload_quota: Avoid `max_days` race
@ -563,7 +598,7 @@ Modules
- mod_register_web: Handle unknown host gracefully - mod_register_web: Handle unknown host gracefully
- mod_register_web: Use mod_register configured restrictions - mod_register_web: Use mod_register configured restrictions
PubSub #### PubSub
- Add `delete_expired_pubsub_items` command - Add `delete_expired_pubsub_items` command
- Add `delete_old_pubsub_items` command - Add `delete_old_pubsub_items` command
- Optimize publishing on large nodes (SQL) - Optimize publishing on large nodes (SQL)
@ -574,7 +609,7 @@ PubSub
- node_flat: Avoid catch-all clauses for RSM - node_flat: Avoid catch-all clauses for RSM
- node_flat_sql: Avoid catch-all clauses for RSM - node_flat_sql: Avoid catch-all clauses for RSM
SQL #### SQL
- Use `INSERT ... ON CONFLICT` in SQL_UPSERT for PostgreSQL >= 9.5 - Use `INSERT ... ON CONFLICT` in SQL_UPSERT for PostgreSQL >= 9.5
- mod_mam export: assign MUC entries to the MUC service - mod_mam export: assign MUC entries to the MUC service
- MySQL: Fix typo when creating index - MySQL: Fix typo when creating index
@ -582,7 +617,7 @@ SQL
- PgSQL: Add missing SQL migration for table `push_session` - PgSQL: Add missing SQL migration for table `push_session`
- PgSQL: Fix `vcard_search` definition in pgsql new schema - PgSQL: Fix `vcard_search` definition in pgsql new schema
Other #### Other
- `captcha-ng.sh`: "sort -R" command not POSIX, added "shuf" and "cat" as fallback - `captcha-ng.sh`: "sort -R" command not POSIX, added "shuf" and "cat" as fallback
- Make s2s connection table cleanup more robust - Make s2s connection table cleanup more robust
- Update export/import of scram password to XEP-0227 1.1 - Update export/import of scram password to XEP-0227 1.1
@ -590,7 +625,7 @@ Other
## Version 21.07 ## Version 21.07
Compilation #### Compilation
- Add rebar3 3.15.2 binary - Add rebar3 3.15.2 binary
- Add support for mix to: `./configure --enable-rebar=mix` - Add support for mix to: `./configure --enable-rebar=mix`
- Improved `make rel` to work with rebar3 and mix - Improved `make rel` to work with rebar3 and mix
@ -602,14 +637,16 @@ Compilation
- Added experimental support for GitHub Codespaces - Added experimental support for GitHub Codespaces
- Switch test service from TravisCI to GitHub Actions - Switch test service from TravisCI to GitHub Actions
Commands: #### Commands:
- Display extended error message in ejabberdctl - Display extended error message in ejabberdctl
- Remove SMP option from ejabberdctl.cfg, `-smp` was removed in OTP 21 - Remove SMP option from ejabberdctl.cfg, `-smp` was removed in OTP 21
- `create_room`: After creating room, store in DB if it's persistent - `create_room`: After creating room, store in DB if it's persistent
- `help`: Major changes in its usage and output - `help`: Major changes in its usage and output
- `srg_create`: Update to use `label` parameter instead of `name` - `srg_create`: Update to use `label` parameter instead of `name`
Modules: #### Modules:
- ejabberd_listener: New `send_timeout` option - ejabberd_listener: New `send_timeout` option
- mod_mix: Improvements to update to 0.14.1 - mod_mix: Improvements to update to 0.14.1
- mod_muc_room: Don't leak owner JIDs - mod_muc_room: Don't leak owner JIDs
@ -626,7 +663,8 @@ Modules:
- WebAdmin: New simple pages to view mnesia tables information and content - WebAdmin: New simple pages to view mnesia tables information and content
- WebSocket: Fix typos - WebSocket: Fix typos
SQL: #### SQL:
- MySQL Backend Patch for scram-sha512 - MySQL Backend Patch for scram-sha512
- SQLite: When exporting for SQLite, use its specific escape options - SQLite: When exporting for SQLite, use its specific escape options
- SQLite: Minor fixes for new_sql_schema support - SQLite: Minor fixes for new_sql_schema support
@ -636,14 +674,16 @@ SQL:
## Version 21.04 ## Version 21.04
API Commands: #### API Commands:
- `add_rosteritem/...`: Add argument guards to roster commands - `add_rosteritem/...`: Add argument guards to roster commands
- `get_user_subscriptions`: New command for MUC/Sub - `get_user_subscriptions`: New command for MUC/Sub
- `remove_mam_for_user_with_peer`: Fix when removing room archive - `remove_mam_for_user_with_peer`: Fix when removing room archive
- `send_message`: Fix bug introduced in ejabberd 21.01 - `send_message`: Fix bug introduced in ejabberd 21.01
- `set_vcard`: Return modules errors - `set_vcard`: Return modules errors
Build and setup: #### Build and setup:
- Allow ejabberd to be compatible as a dependency for an Erlang project using rebar3 - Allow ejabberd to be compatible as a dependency for an Erlang project using rebar3
- CAPTCHA: New question/answer-based CAPTCHA script - CAPTCHA: New question/answer-based CAPTCHA script
- `--enable-lua`: new configure option for luerl instead of --enable-tools - `--enable-lua`: new configure option for luerl instead of --enable-tools
@ -651,14 +691,16 @@ Build and setup:
- Update `sql_query` record to handle the Erlang/OTP 24 compiler reports - Update `sql_query` record to handle the Erlang/OTP 24 compiler reports
- Updated dependencies to fix Dialyzer warnings - Updated dependencies to fix Dialyzer warnings
Miscellaneous: #### Miscellaneous:
- CAPTCHA: Update `FORM_TYPE` from captcha to register - CAPTCHA: Update `FORM_TYPE` from captcha to register
- LDAP: fix eldap certificate verification - LDAP: fix eldap certificate verification
- MySQL: Fix for "specified key was too long" - MySQL: Fix for "specified key was too long"
- Translations: updated the Esperanto, Greek, and Japanese translations - Translations: updated the Esperanto, Greek, and Japanese translations
- Websocket: Fix PONG responses - Websocket: Fix PONG responses
Modules: #### Modules:
- `mod_block_strangers`: If stanza is type error, allow it passing - `mod_block_strangers`: If stanza is type error, allow it passing
- `mod_caps`: Don't request roster when not needed - `mod_caps`: Don't request roster when not needed
- `mod_caps`: Skip reading roster in one more case - `mod_caps`: Skip reading roster in one more case
@ -674,7 +716,8 @@ Modules:
## Version 21.01 ## Version 21.01
Miscellaneous changes: #### Miscellaneous changes:
- `log_rotate_size` option: Fix handling of infinity value - `log_rotate_size` option: Fix handling of infinity value
- `mod_time`: Fix invalid timezone - `mod_time`: Fix invalid timezone
- Auth JWT: New `check_decoded_jwt` hook runs the default JWT verifier - Auth JWT: New `check_decoded_jwt` hook runs the default JWT verifier
@ -689,7 +732,8 @@ Miscellaneous changes:
- Stun: Block loopback addresses by default - Stun: Block loopback addresses by default
- Several documentation fixes and clarifications - Several documentation fixes and clarifications
Commands: #### Commands:
- `decide_room`: Use better fallback value for room activity time when skipping room - `decide_room`: Use better fallback value for room activity time when skipping room
- `delete_old_message`: Fix when using sqlite spool table - `delete_old_message`: Fix when using sqlite spool table
- `module_install`: Make ext_mod compile module with debug_info flags - `module_install`: Make ext_mod compile module with debug_info flags
@ -697,13 +741,15 @@ Commands:
- `send_message`: Dont include empty in messages - `send_message`: Dont include empty in messages
- `set_room_affiliation`: Validate affiliations - `set_room_affiliation`: Validate affiliations
Running: #### Running:
- Docker: New `Dockerfile` and `devcontainer.json` - Docker: New `Dockerfile` and `devcontainer.json`
- New `ejabberdctl foreground-quiet` - New `ejabberdctl foreground-quiet`
- Systemd: Allow for listening on privileged ports - Systemd: Allow for listening on privileged ports
- Systemd: Integrate nicely with systemd - Systemd: Integrate nicely with systemd
Translations: #### Translations:
- Moved gettext PO files to a new `ejabberd-po` repository - Moved gettext PO files to a new `ejabberd-po` repository
- Improved several translations: Catalan, Chinese, German, Greek, Indonesian, Norwegian, Portuguese (Brazil), Spanish. - Improved several translations: Catalan, Chinese, German, Greek, Indonesian, Norwegian, Portuguese (Brazil), Spanish.
@ -716,13 +762,13 @@ Translations:
- start_room: new hook runs when a room process is started - start_room: new hook runs when a room process is started
- check_decoded_jwt: new hook to check decoded JWT after success authentication - check_decoded_jwt: new hook to check decoded JWT after success authentication
* Admin #### Admin
- Docker: Fix DB initialization - Docker: Fix DB initialization
- New sql_odbc_driver option: choose the mssql ODBC driver - New sql_odbc_driver option: choose the mssql ODBC driver
- Rebar3: Fully supported. Enable with `./configure --with-rebar=/path/to/rebar3` - Rebar3: Fully supported. Enable with `./configure --with-rebar=/path/to/rebar3`
- systemd: start ejabberd in foreground - systemd: start ejabberd in foreground
* Modules: #### Modules:
- MAM: Make sure that jid used as base in mam xml_compress is bare - MAM: Make sure that jid used as base in mam xml_compress is bare
- MAM: Support for MAM Flipped Pages - MAM: Support for MAM Flipped Pages
- MUC: Always show MucSub subscribers nicks - MUC: Always show MucSub subscribers nicks
@ -744,7 +790,7 @@ Translations:
## Version 20.07 ## Version 20.07
* Changes in this version #### Changes in this version
- Add support for using unix sockets in listeners. - Add support for using unix sockets in listeners.
- Make this version compatible with erlang R23 - Make this version compatible with erlang R23
- Make room permissions checks more strict for subscribers - Make room permissions checks more strict for subscribers
@ -771,7 +817,7 @@ Translations:
## Version 20.03 ## Version 20.03
* Changes in this version #### Changes in this version
- Add support of ssl connection when connection to mysql - Add support of ssl connection when connection to mysql
database (configured with `sql_ssl: true` option) database (configured with `sql_ssl: true` option)
- Experimental support for cockroachdb when configured - Experimental support for cockroachdb when configured
@ -791,7 +837,7 @@ Translations:
## Version 20.02 ## Version 20.02
* Changes in this version #### Changes in this version
- Fix problems when trying to use string format with unicode - Fix problems when trying to use string format with unicode
values directly in xmpp nodes values directly in xmpp nodes
- Add missing oauth_client table declaration in lite.new.sql - Add missing oauth_client table declaration in lite.new.sql
@ -809,7 +855,7 @@ Translations:
## Version 20.01 ## Version 20.01
* New features #### New features
- Implement OAUTH authentication in mqtt - Implement OAUTH authentication in mqtt
- Make logging infrastructure use new logger introduced - Make logging infrastructure use new logger introduced
in Erlang (requires OTP22) in Erlang (requires OTP22)
@ -824,7 +870,7 @@ Translations:
- Generate man page automatically - Generate man page automatically
- Implement copy feature in mod_carboncopy - Implement copy feature in mod_carboncopy
* Fixes #### Fixes
- Make webadmin work with configurable paths - Make webadmin work with configurable paths
- Fix handling of result in xmlrpc module - Fix handling of result in xmlrpc module
- Make webadmin work even when accessed through not declared domain - Make webadmin work even when accessed through not declared domain
@ -842,18 +888,18 @@ Translations:
## Version 19.09 ## Version 19.09
* Admin #### Admin
- The minimum required Erlang/OTP version is now 19.3 - The minimum required Erlang/OTP version is now 19.3
- Fix API call using OAuth (#2982) - Fix API call using OAuth (#2982)
- Rename MUC command arguments from Host to Service (#2976) - Rename MUC command arguments from Host to Service (#2976)
* Webadmin #### Webadmin
- Don't treat 'Host' header as a virtual XMPP host (#2989) - Don't treat 'Host' header as a virtual XMPP host (#2989)
- Fix some links to Guide in WebAdmin and add new ones (#3003) - Fix some links to Guide in WebAdmin and add new ones (#3003)
- Use select fields to input host in WebAdmin Backup (#3000) - Use select fields to input host in WebAdmin Backup (#3000)
- Check account auth provided in WebAdmin is a local host (#3000) - Check account auth provided in WebAdmin is a local host (#3000)
* ACME #### ACME
- Improve ACME implementation - Improve ACME implementation
- Fix IDA support in ACME requests - Fix IDA support in ACME requests
- Fix unicode formatting in ACME module - Fix unicode formatting in ACME module
@ -864,10 +910,10 @@ Translations:
- Don't auto request certificate for localhost and IP-like domains - Don't auto request certificate for localhost and IP-like domains
- Add listener for ACME challenge in example config - Add listener for ACME challenge in example config
* Authentication #### Authentication
- JWT-only authentication for some users (#3012) - JWT-only authentication for some users (#3012)
* MUC #### MUC
- Apply default role after revoking admin affiliation (#3023) - Apply default role after revoking admin affiliation (#3023)
- Custom exit message is not broadcast (#3004) - Custom exit message is not broadcast (#3004)
- Revert "Affiliations other than admin and owner cannot invite to members_only rooms" (#2987) - Revert "Affiliations other than admin and owner cannot invite to members_only rooms" (#2987)
@ -875,11 +921,11 @@ Translations:
- Improve rooms_* commands to accept 'global' as MUC service argument (#2976) - Improve rooms_* commands to accept 'global' as MUC service argument (#2976)
- Rename MUC command arguments from Host to Service (#2976) - Rename MUC command arguments from Host to Service (#2976)
* SQL #### SQL
- Fix transactions for Microsoft SQL Server (#2978) - Fix transactions for Microsoft SQL Server (#2978)
- Spawn SQL connections on demand only - Spawn SQL connections on demand only
* Misc #### Misc
- Add support for XEP-0328: JID Prep - Add support for XEP-0328: JID Prep
- Added gsfonts for captcha - Added gsfonts for captcha
- Log Mnesia table type on creation - Log Mnesia table type on creation
@ -895,12 +941,12 @@ Translations:
## Version 19.08 ## Version 19.08
* Administration #### Administration
- Improve ejabberd halting procedure - Improve ejabberd halting procedure
- Process unexpected erlang messages uniformly: logging a warning - Process unexpected erlang messages uniformly: logging a warning
- mod_configure: Remove modules management - mod_configure: Remove modules management
* Configuration #### Configuration
- Use new configuration validator - Use new configuration validator
- ejabberd_http: Use correct virtual host when consulting trusted_proxies - ejabberd_http: Use correct virtual host when consulting trusted_proxies
- Fix Elixir modules detection in the configuration file - Fix Elixir modules detection in the configuration file
@ -910,7 +956,7 @@ Translations:
- mod_stream_mgmt: Allow flexible timeout format - mod_stream_mgmt: Allow flexible timeout format
- mod_mqtt: Allow flexible timeout format in session_expiry option - mod_mqtt: Allow flexible timeout format in session_expiry option
* Misc #### Misc
- Fix SQL connections leakage - Fix SQL connections leakage
- New authentication method using JWT tokens - New authentication method using JWT tokens
- extauth: Add 'certauth' command - extauth: Add 'certauth' command
@ -925,14 +971,14 @@ Translations:
- mod_privacy: Don't attempt to query 'undefined' active list - mod_privacy: Don't attempt to query 'undefined' active list
- mod_privacy: Fix race condition - mod_privacy: Fix race condition
* MUC #### MUC
- Add code for hibernating inactive muc_room processes - Add code for hibernating inactive muc_room processes
- Improve handling of unexpected iq in mod_muc_room - Improve handling of unexpected iq in mod_muc_room
- Attach mod_muc_room processes to a supervisor - Attach mod_muc_room processes to a supervisor
- Restore room when receiving message or generic iq for not started room - Restore room when receiving message or generic iq for not started room
- Distribute routing of MUC messages across all CPU cores - Distribute routing of MUC messages across all CPU cores
* PubSub #### PubSub
- Fix pending nodes retrieval for SQL backend - Fix pending nodes retrieval for SQL backend
- Check access_model when publishing PEP - Check access_model when publishing PEP
- Remove deprecated pubsub plugins - Remove deprecated pubsub plugins
@ -940,7 +986,7 @@ Translations:
## Version 19.05 ## Version 19.05
* Admin #### Admin
- The minimum required Erlang/OTP version is now 19.1 - The minimum required Erlang/OTP version is now 19.1
- Provide a suggestion when unknown command, module, option or request handler is detected - Provide a suggestion when unknown command, module, option or request handler is detected
- Deprecate some listening options: captcha, register, web_admin, http_bind and xmlrpc - Deprecate some listening options: captcha, register, web_admin, http_bind and xmlrpc
@ -951,19 +997,19 @@ Translations:
- Improve request_handlers validator - Improve request_handlers validator
- Fix syntax in example Elixir config file - Fix syntax in example Elixir config file
* Auth #### Auth
- Correctly support cache tags in ejabberd_auth - Correctly support cache tags in ejabberd_auth
- Don't process failed EXTERNAL authentication by mod_fail2ban - Don't process failed EXTERNAL authentication by mod_fail2ban
- Don't call to mod_register when it's not loaded - Don't call to mod_register when it's not loaded
- Make anonymous auth don't {de}register user when there are other resources - Make anonymous auth don't {de}register user when there are other resources
* Developer #### Developer
- Rename listening callback from start/2 to start/3 - Rename listening callback from start/2 to start/3
- New hook called when room gets destroyed: room_destroyed - New hook called when room gets destroyed: room_destroyed
- New hooks for tracking mucsub subscriptions changes: muc_subscribed, muc_unsubscribed - New hooks for tracking mucsub subscriptions changes: muc_subscribed, muc_unsubscribed
- Make static hooks analyzer working again - Make static hooks analyzer working again
* MUC #### MUC
- Service admins are allowed to recreate room even if archive is nonempty - Service admins are allowed to recreate room even if archive is nonempty
- New option user_mucsub_from_muc_archive - New option user_mucsub_from_muc_archive
- Avoid late arrival of get_disco_item response - Avoid late arrival of get_disco_item response
@ -972,7 +1018,7 @@ Translations:
- Make get_subscribed_rooms work even for non-persistant rooms - Make get_subscribed_rooms work even for non-persistant rooms
- Allow non-moderator subscribers to get list of room subscribers - Allow non-moderator subscribers to get list of room subscribers
* Offline #### Offline
- New option bounce_groupchat: make it not bounce mucsub/groupchat messages - New option bounce_groupchat: make it not bounce mucsub/groupchat messages
- New option use_mam_for_storage: fetch data from mam instead of spool table - New option use_mam_for_storage: fetch data from mam instead of spool table
- When applying limit of max msgs in spool check only spool size - When applying limit of max msgs in spool check only spool size
@ -984,27 +1030,27 @@ Translations:
- Return correct value from count_offline_messages with mam storage option - Return correct value from count_offline_messages with mam storage option
- Make mod_offline put msg ignored by mam in spool when mam storage is on - Make mod_offline put msg ignored by mam in spool when mam storage is on
* SQL: #### SQL:
- Add SQL schemas for MQTT tables - Add SQL schemas for MQTT tables
- Report better errors on SQL terms decode failure - Report better errors on SQL terms decode failure
- Fix PostgreSQL compatibility in mod_offline_sql:remove_old_messages - Fix PostgreSQL compatibility in mod_offline_sql:remove_old_messages
- Fix handling of list arguments on pgsql - Fix handling of list arguments on pgsql
- Preliminary support for SQL in process_rosteritems command - Preliminary support for SQL in process_rosteritems command
* Tests #### Tests
- Add tests for user mucsub mam from muc mam - Add tests for user mucsub mam from muc mam
- Add tests for offline with mam storage - Add tests for offline with mam storage
- Add tests for offline use_mam_for_storage - Add tests for offline use_mam_for_storage
- Initial Docker environment to run ejabberd test suite - Initial Docker environment to run ejabberd test suite
- Test offline:use_mam_for_storage, mam:user_mucsub_from_muc_archive used together - Test offline:use_mam_for_storage, mam:user_mucsub_from_muc_archive used together
* Websocket #### Websocket
- Add WebSockets support to mod_mqtt - Add WebSockets support to mod_mqtt
- Return "Bad request" error when origin in websocket connection doesn't match - Return "Bad request" error when origin in websocket connection doesn't match
- Fix RFC6454 violation on websocket connection when validating Origin header - Fix RFC6454 violation on websocket connection when validating Origin header
- Origin header validation on websocket connection - Origin header validation on websocket connection
* Other modules #### Other modules
- mod_adhoc: Use xml:lang from stanza when it's missing in <command/> element - mod_adhoc: Use xml:lang from stanza when it's missing in <command/> element
- mod_announce: Add 'sessionid' attribute when required - mod_announce: Add 'sessionid' attribute when required
- mod_bosh: Don't put duplicate polling attribute in bosh payload - mod_bosh: Don't put duplicate polling attribute in bosh payload
@ -1017,14 +1063,14 @@ Translations:
## Version 19.02 ## Version 19.02
* Admin #### Admin
- Fix in configure.ac the Erlang/OTP version: from 17.5 to 19.0 - Fix in configure.ac the Erlang/OTP version: from 17.5 to 19.0
- reload_config command: Fix crash when sql_pool_size option is used - reload_config command: Fix crash when sql_pool_size option is used
- reload_config command: Fix crash when SQL is not configured - reload_config command: Fix crash when SQL is not configured
- rooms_empty_destroy command: Several fixes to behave more conservative - rooms_empty_destroy command: Several fixes to behave more conservative
- Fix serverhost->host parameter name for muc_(un)register_nick API - Fix serverhost->host parameter name for muc_(un)register_nick API
* Configuration #### Configuration
- Allow specifying tag for listener for api_permission purposes - Allow specifying tag for listener for api_permission purposes
- Change default ciphers to intermediate - Change default ciphers to intermediate
- Define default ciphers/protocol_option in example config - Define default ciphers/protocol_option in example config
@ -1034,29 +1080,29 @@ Translations:
- mod_muc: New option access_mam to restrict who can modify that room option - mod_muc: New option access_mam to restrict who can modify that room option
- mod_offline: New option store_groupchat to allow storing group chat messages - mod_offline: New option store_groupchat to allow storing group chat messages
* Core #### Core
- Add MQTT protocol support - Add MQTT protocol support
- Fix (un)setting of priority - Fix (un)setting of priority
- Use OTP application startup infrastructure for starting dependencies - Use OTP application startup infrastructure for starting dependencies
- Improve starting order of several dependencies - Improve starting order of several dependencies
* MAM #### MAM
- mod_mam_mnesia/sql: Improve check for empty archive - mod_mam_mnesia/sql: Improve check for empty archive
- disallow room creation if archive not empty and clear_archive_on_room_destroy is false - disallow room creation if archive not empty and clear_archive_on_room_destroy is false
- allow check if archive is empty for or user or room - allow check if archive is empty for or user or room
- Additional checks for database failures - Additional checks for database failures
* MUC #### MUC
- Make sure that room_destroyed is called even when some code throws in terminate - Make sure that room_destroyed is called even when some code throws in terminate
- Update muc room state after adding extra access field to it - Update muc room state after adding extra access field to it
- MUC/Sub: Send mucsub subscriber notification events with from set to room jid - MUC/Sub: Send mucsub subscriber notification events with from set to room jid
* Shared Roster #### Shared Roster
- Don't perform roster push for non-local contacts - Don't perform roster push for non-local contacts
- Handle versioning result when shared roster group has remote account - Handle versioning result when shared roster group has remote account
- Fix SQL queries - Fix SQL queries
* Miscelanea #### Miscelanea
- CAPTCHA: Add no-store hint to CAPTCHA challenge stanzas - CAPTCHA: Add no-store hint to CAPTCHA challenge stanzas
- HTTP: Reject http_api request with malformed Authentication header - HTTP: Reject http_api request with malformed Authentication header
- mod_carboncopy: Don't lose carbons on presence change or session resumption - mod_carboncopy: Don't lose carbons on presence change or session resumption
@ -1071,7 +1117,7 @@ Translations:
## Version 18.12 ## Version 18.12
* MAM data store compression - MAM data store compression
* Proxy protocol support - Proxy protocol support
* MUC Self-Ping optimization (XEP-0410) - MUC Self-Ping optimization (XEP-0410)
* Bookmarks conversion (XEP-0411) - Bookmarks conversion (XEP-0411)

View File

@ -7,7 +7,7 @@ from source code.
For a more detailed explanation, please check the For a more detailed explanation, please check the
ejabberd Docs: [Source Code Installation][docs-source]. ejabberd Docs: [Source Code Installation][docs-source].
[docs-source]: https://docs.ejabberd.im/admin/installation/#source-code [docs-source]: https://docs.ejabberd.im/admin/install/source/
Requirements Requirements

View File

@ -29,7 +29,7 @@ repository.
Check the [differences between `ejabberd` and `ecs` images](https://github.com/processone/docker-ejabberd/blob/master/ecs/HUB-README.md#alternative-image-in-github). Check the [differences between `ejabberd` and `ecs` images](https://github.com/processone/docker-ejabberd/blob/master/ecs/HUB-README.md#alternative-image-in-github).
If you are using a Windows operating system, check the tutorials mentioned in If you are using a Windows operating system, check the tutorials mentioned in
[ejabberd Docs > Docker Image](https://docs.ejabberd.im/admin/installation/#docker-image). [ejabberd Docs > Docker Image](https://docs.ejabberd.im/admin/install/container/#ejabberd-container-image).
Start ejabberd Start ejabberd
@ -108,7 +108,7 @@ docker exec -it ejabberd ejabberdctl register admin localhost passw0rd
``` ```
Then edit conf/ejabberd.yml and add the ACL as explained in Then edit conf/ejabberd.yml and add the ACL as explained in
[ejabberd Docs: Administration Account](https://docs.ejabberd.im/admin/installation/#administration-account) [ejabberd Docs: Administration Account](https://docs.ejabberd.im/admin/install/next-steps/#administration-account)
### Check ejabberd log files ### Check ejabberd log files
@ -249,7 +249,7 @@ For this you can either:
Example to connect a local `ejabberdctl` to a containerized ejabberd: Example to connect a local `ejabberdctl` to a containerized ejabberd:
1. When creating the container, export port 5210, and set `ERLANG_COOKIE`: 1. When creating the container, export port 5210, and set `ERLANG_COOKIE`:
``` ```sh
docker run --name ejabberd -it \ docker run --name ejabberd -it \
-e ERLANG_COOKIE=`cat $HOME/.erlang.cookie` \ -e ERLANG_COOKIE=`cat $HOME/.erlang.cookie` \
-p 5210:5210 -p 5222:5222 \ -p 5210:5210 -p 5222:5222 \
@ -260,7 +260,7 @@ docker run --name ejabberd -it \
4. Now use `ejabberdctl` in your local ejabberd deployment 4. Now use `ejabberdctl` in your local ejabberd deployment
To connect using a local `ejabberd` script: To connect using a local `ejabberd` script:
``` ```sh
ERL_DIST_PORT=5210 _build/dev/rel/ejabberd/bin/ejabberd ping ERL_DIST_PORT=5210 _build/dev/rel/ejabberd/bin/ejabberd ping
``` ```

View File

@ -258,7 +258,7 @@ _build/edoc/docs.md: edoc_compile
> _build/edoc/docs.md > _build/edoc/docs.md
_build/edoc/logo.png: edoc_compile _build/edoc/logo.png: edoc_compile
wget https://docs.ejabberd.im/static/shared/images/footer_logo_e.png -O _build/edoc/logo.png wget https://docs.ejabberd.im/assets/img/footer_logo_e.png -O _build/edoc/logo.png
#. #.
#' copy-files #' copy-files

View File

@ -109,14 +109,14 @@ and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MI
[erlang]: https://www.erlang.org/ [erlang]: https://www.erlang.org/
[features]: https://docs.ejabberd.im/admin/introduction/ [features]: https://docs.ejabberd.im/admin/introduction/
[fluux]: https://fluux.io/ [fluux]: https://fluux.io/
[homebrew]: https://docs.ejabberd.im/admin/installation/#homebrew [homebrew]: https://docs.ejabberd.im/admin/install/homebrew/
[hubecs]: https://hub.docker.com/r/ejabberd/ecs/ [hubecs]: https://hub.docker.com/r/ejabberd/ecs/
[im]: https://ejabberd.im/ [im]: https://ejabberd.im/
[issues]: https://github.com/processone/ejabberd/issues [issues]: https://github.com/processone/ejabberd/issues
[localization]: https://docs.ejabberd.im/developer/extending-ejabberd/localization/ [localization]: https://docs.ejabberd.im/developer/extending-ejabberd/localization/
[mqtt]: https://mqtt.org/ [mqtt]: https://mqtt.org/
[muc]: xmpp:ejabberd@conference.process-one.net [muc]: xmpp:ejabberd@conference.process-one.net
[osp]: https://docs.ejabberd.im/admin/installation/#operating-system-packages [osp]: https://docs.ejabberd.im/admin/install/os-package/
[p1contact]: https://www.process-one.net/en/company/contact/ [p1contact]: https://www.process-one.net/en/company/contact/
[p1download]: https://www.process-one.net/en/ejabberd/downloads/ [p1download]: https://www.process-one.net/en/ejabberd/downloads/
[p1home]: https://www.process-one.net/en/ejabberd/ [p1home]: https://www.process-one.net/en/ejabberd/

View File

@ -206,9 +206,9 @@ defmodule Ejabberd.MixProject do
"mix.exs", "rebar.config", "rebar.config.script", "vars.config"], "mix.exs", "rebar.config", "rebar.config.script", "vars.config"],
maintainers: ["ProcessOne"], maintainers: ["ProcessOne"],
licenses: ["GPL-2.0-or-later"], licenses: ["GPL-2.0-or-later"],
links: %{"Site" => "https://www.ejabberd.im", links: %{"ejabberd.im" => "https://www.ejabberd.im",
"Documentation" => "http://docs.ejabberd.im", "ejabberd Docs" => "http://docs.ejabberd.im",
"Source" => "https://github.com/processone/ejabberd", "GitHub" => "https://github.com/processone/ejabberd",
"ProcessOne" => "http://www.process-one.net/"}] "ProcessOne" => "http://www.process-one.net/"}]
end end

View File

@ -22,7 +22,7 @@
"makeup_erlang": {:hex, :makeup_erlang, "0.1.5", "e0ff5a7c708dda34311f7522a8758e23bfcd7d8d8068dc312b5eb41c6fd76eba", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "94d2e986428585a21516d7d7149781480013c56e30c6a233534bedf38867a59a"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.5", "e0ff5a7c708dda34311f7522a8758e23bfcd7d8d8068dc312b5eb41c6fd76eba", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "94d2e986428585a21516d7d7149781480013c56e30c6a233534bedf38867a59a"},
"mqtree": {:hex, :mqtree, "1.0.16", "f8f8b4971e4ca94313ba9bcaaa1aa1077daaba5e3fd3468ffb491420a4cc3593", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "c87d1c95575db65af29b795c9daa3bed43f5c1bf84072a74469659bcf53594eb"}, "mqtree": {:hex, :mqtree, "1.0.16", "f8f8b4971e4ca94313ba9bcaaa1aa1077daaba5e3fd3468ffb491420a4cc3593", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "c87d1c95575db65af29b795c9daa3bed43f5c1bf84072a74469659bcf53594eb"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
"p1_acme": {:git, "https://github.com/processone/p1_acme", "2d049fa25d66f97a08b58ba8e07a751ed60ff9c4", [branch: "master"]}, "p1_acme": {:git, "https://github.com/processone/p1_acme", "b4d0900eabb208c493ae3958bc545151bb19b90e", [branch: "master"]},
"p1_mysql": {:hex, :p1_mysql, "1.0.23", "9b4e98f1f01e2cc4a759f611f0f015365e65c5f61ea453aa4bdfe950d20a5f11", [:rebar3], [], "hexpm", "9cef98265fb287374e7b64bf4022c4df5ec66196ca31cf4bed73c67c45bf824e"}, "p1_mysql": {:hex, :p1_mysql, "1.0.23", "9b4e98f1f01e2cc4a759f611f0f015365e65c5f61ea453aa4bdfe950d20a5f11", [:rebar3], [], "hexpm", "9cef98265fb287374e7b64bf4022c4df5ec66196ca31cf4bed73c67c45bf824e"},
"p1_oauth2": {:hex, :p1_oauth2, "0.6.14", "1c5f82535574de87e2059695ac4b91f8f9aebacbc1c80287dae6f02552d47aea", [:rebar3], [], "hexpm", "1fd3ac474e43722d9d5a87c6df8d36f698ed87af7bb81cbbb66361451d99ae8f"}, "p1_oauth2": {:hex, :p1_oauth2, "0.6.14", "1c5f82535574de87e2059695ac4b91f8f9aebacbc1c80287dae6f02552d47aea", [:rebar3], [], "hexpm", "1fd3ac474e43722d9d5a87c6df8d36f698ed87af7bb81cbbb66361451d99ae8f"},
"p1_pgsql": {:hex, :p1_pgsql, "1.1.25", "f59b7faa457fadf0c2713ac335202f41ca1b06b7c4926925b3cb0bc6f0578601", [:rebar3], [{:xmpp, "1.8.1", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "b654c1e07d3e775b626b407e7696cacfd88d17be83e7168b9d89c3832d913de7"}, "p1_pgsql": {:hex, :p1_pgsql, "1.1.25", "f59b7faa457fadf0c2713ac335202f41ca1b06b7c4926925b3cb0bc6f0578601", [:rebar3], [{:xmpp, "1.8.1", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "b654c1e07d3e775b626b407e7696cacfd88d17be83e7168b9d89c3832d913de7"},

View File

@ -131,7 +131,7 @@ get_commands_spec() ->
"only on log files generated by some modules.\n" "only on log files generated by some modules.\n"
"This can be useful when an external tool is " "This can be useful when an external tool is "
"used for log rotation. See " "used for log rotation. See "
"[Log Files](https://docs.ejabberd.im/admin/guide/troubleshooting/#log-files).", "_`../../admin/guide/troubleshooting.md#log-files|Log Files`_.",
policy = admin, policy = admin,
module = ?MODULE, function = reopen_log, module = ?MODULE, function = reopen_log,
args = [], result = {res, rescode}}, args = [], result = {res, rescode}},

View File

@ -87,7 +87,7 @@ md_tag(h2, V) ->
md_tag(strong, V) -> md_tag(strong, V) ->
[<<"*">>, V, <<"*">>]; [<<"*">>, V, <<"*">>];
md_tag('div', V) -> md_tag('div', V) ->
[<<"<div class='note-down'>">>, V, <<"</div>">>]; [<<"*Note* about this command: ">>, V, <<".">>];
md_tag(_, V) -> md_tag(_, V) ->
V. V.
@ -237,7 +237,7 @@ json_gen({_Name, {list, ElDesc}}, List, Indent, HTMLOutput) ->
[?OP_L("["), ?BR, Indent2, list_join_with(Res, [?OP_L(","), ?BR, Indent2]), ?BR, Indent, ?OP_L("]")]. [?OP_L("["), ?BR, Indent2, list_join_with(Res, [?OP_L(","), ?BR, Indent2]), ?BR, Indent, ?OP_L("]")].
json_call(Name, ArgsDesc, Values, ResultDesc, Result, HTMLOutput) -> json_call(Name, ArgsDesc, Values, ResultDesc, Result, HTMLOutput) ->
{Indent, Preamble} = if HTMLOutput -> {<<"">>, []}; true -> {<<" ">>, <<"~~~ json\n">>} end, {Indent, Preamble} = if HTMLOutput -> {<<"">>, []}; true -> {<<"">>, <<"~~~ json\n">>} end,
{Code, ResultStr} = case {ResultDesc, Result} of {Code, ResultStr} = case {ResultDesc, Result} of
{{_, rescode}, V} when V == true; V == ok -> {{_, rescode}, V} when V == true; V == ok ->
{200, [?STR_L("")]}; {200, [?STR_L("")]};
@ -364,7 +364,7 @@ make_tags(HTMLOutput) ->
-dialyzer({no_match, gen_tags/2}). -dialyzer({no_match, gen_tags/2}).
gen_tags({TagName, Commands}, HTMLOutput) -> gen_tags({TagName, Commands}, HTMLOutput) ->
[?TAG(h1, TagName) | [?TAG(p, ?RAW("* *`"++C++"`*")) || C <- Commands]]. [?TAG(h1, TagName) | [?TAG(p, ?RAW("* _`"++C++"`_")) || C <- Commands]].
gen_doc(#ejabberd_commands{name=Name, tags=Tags, desc=Desc, longdesc=LongDesc, gen_doc(#ejabberd_commands{name=Name, tags=Tags, desc=Desc, longdesc=LongDesc,
args=Args, args_desc=ArgsDesc, note=Note, definer=Definer, args=Args, args_desc=ArgsDesc, note=Note, definer=Definer,
@ -395,14 +395,14 @@ gen_doc(#ejabberd_commands{name=Name, tags=Tags, desc=Desc, longdesc=LongDesc,
[?TAG(dl, [gen_param(RName, Type, ResultDesc, HTMLOutput)])] [?TAG(dl, [gen_param(RName, Type, ResultDesc, HTMLOutput)])]
end end
end, end,
TagsText = ?RAW(string:join(["*`"++atom_to_list(Tag)++"`*" || Tag <- Tags], ", ")), TagsText = ?RAW(string:join(["_`"++atom_to_list(Tag)++"`_" || Tag <- Tags], ", ")),
IsDefinerMod = case Definer of IsDefinerMod = case Definer of
unknown -> false; unknown -> false;
_ -> lists:member(gen_mod, proplists:get_value(behaviour, Definer:module_info(attributes))) _ -> lists:member(gen_mod, proplists:get_value(behaviour, Definer:module_info(attributes)))
end, end,
ModuleText = case IsDefinerMod of ModuleText = case IsDefinerMod of
true -> true ->
[?TAG(h2, <<"Module:">>), ?TAG(p, ?RAW("*`"++atom_to_list(Definer)++"`*"))]; [?TAG(h2, <<"Module:">>), ?TAG(p, ?RAW("_`"++atom_to_list(Definer)++"`_"))];
false -> false ->
[] []
end, end,
@ -415,8 +415,8 @@ gen_doc(#ejabberd_commands{name=Name, tags=Tags, desc=Desc, longdesc=LongDesc,
true -> {NoteEl, []} true -> {NoteEl, []}
end, end,
[NotePre, [?TAG(h1, make_command_name(Name, Note)),
?TAG(h1, atom_to_list(Name)), NotePre,
?TAG(p, ?RAW(Desc)), ?TAG(p, ?RAW(Desc)),
case LongDesc of case LongDesc of
"" -> []; "" -> [];
@ -435,6 +435,19 @@ gen_doc(#ejabberd_commands{name=Name, tags=Tags, desc=Desc, longdesc=LongDesc,
[Name, Ex]))) [Name, Ex])))
end. end.
get_version_mark("") ->
"";
get_version_mark(Note) ->
[XX, YY | _] = string:tokens(binary_to_list(ejabberd_option:version()), "."),
XXYY = string:join([XX, YY], "."),
case string:find(Note, XXYY) of
nomatch -> "";
_ -> " 🟤"
end.
make_command_name(Name, Note) ->
atom_to_list(Name) ++ get_version_mark(Note).
find_commands_definitions() -> find_commands_definitions() ->
lists:flatmap( lists:flatmap(
fun(Mod) -> fun(Mod) ->
@ -492,21 +505,22 @@ generate_md_output(File, RegExp, Languages, Cmds) ->
end, Cmds2), end, Cmds2),
Cmds4 = [maybe_add_policy_arguments(Cmd) || Cmd <- Cmds3], Cmds4 = [maybe_add_policy_arguments(Cmd) || Cmd <- Cmds3],
Langs = binary:split(Languages, <<",">>, [global]), Langs = binary:split(Languages, <<",">>, [global]),
Header = <<"---\ntitle: Administration API reference\ntoc: true\nmenu: API Reference\norder: 1\n" Version = binary_to_list(ejabberd_config:version()),
"// Autogenerated with 'ejabberdctl gen_markdown_doc_for_commands'\n---\n\n" Header = ["# API Reference\n\n"
"This section describes API of ejabberd.\n">>, "This section describes API commands of ejabberd ", Version, ". "
"The commands that changed in this version are marked with 🟤.\n\n"],
Out = lists:map(fun(C) -> gen_doc(C, false, Langs) end, Cmds4), Out = lists:map(fun(C) -> gen_doc(C, false, Langs) end, Cmds4),
{ok, Fh} = file:open(File, [write]), {ok, Fh} = file:open(File, [write, {encoding, utf8}]),
io:format(Fh, "~ts~ts", [Header, Out]), io:format(Fh, "~ts~ts", [Header, Out]),
file:close(Fh), file:close(Fh),
ok. ok.
generate_tags_md(File) -> generate_tags_md(File) ->
Header = <<"---\ntitle: API Tags\ntoc: true\nmenu: API Tags\norder: 2\n" Version = binary_to_list(ejabberd_config:version()),
"// Autogenerated with 'ejabberdctl gen_markdown_doc_for_tags'\n---\n\n" Header = ["# API Tags\n\n"
"This section enumerates the tags and their associated API.\n">>, "This section enumerates the API tags of ejabberd ", Version, ". \n\n"],
Tags = make_tags(false), Tags = make_tags(false),
{ok, Fh} = file:open(File, [write]), {ok, Fh} = file:open(File, [write, {encoding, utf8}]),
io:format(Fh, "~ts~ts", [Header, Tags]), io:format(Fh, "~ts~ts", [Header, Tags]),
file:close(Fh), file:close(Fh),
ok. ok.

View File

@ -45,7 +45,8 @@ man(Lang) ->
#{desc := Descr} = Map -> #{desc := Descr} = Map ->
DocOpts = maps:get(opts, Map, []), DocOpts = maps:get(opts, Map, []),
Example = maps:get(example, Map, []), Example = maps:get(example, Map, []),
{[{M, Descr, DocOpts, #{example => Example}}|Mods], SubMods}; Note = maps:get(note, Map, []),
{[{M, Descr, DocOpts, #{example => Example, note => Note}}|Mods], SubMods};
#{opts := DocOpts} -> #{opts := DocOpts} ->
{ParentMod, Backend} = strip_backend_suffix(M), {ParentMod, Backend} = strip_backend_suffix(M),
{Mods, dict:append(ParentMod, {M, Backend, DocOpts}, SubMods)}; {Mods, dict:append(ParentMod, {M, Backend, DocOpts}, SubMods)};
@ -72,10 +73,12 @@ man(Lang) ->
catch _:undef -> [] catch _:undef -> []
end end
end, ejabberd_config:callback_modules(all)), end, ejabberd_config:callback_modules(all)),
Version = binary_to_list(ejabberd_config:version()),
Options = Options =
["TOP LEVEL OPTIONS", ["TOP LEVEL OPTIONS",
"-----------------", "-----------------",
tr(Lang, ?T("This section describes top level options of ejabberd.")), "This section describes top level options of ejabberd " ++ Version ++ ".",
"The options that changed in this version are marked with 🟤.",
io_lib:nl()] ++ io_lib:nl()] ++
lists:flatmap( lists:flatmap(
fun(Opt) -> fun(Opt) ->
@ -95,16 +98,19 @@ man(Lang) ->
"MODULES", "MODULES",
"-------", "-------",
"[[modules]]", "[[modules]]",
tr(Lang, ?T("This section describes options of all ejabberd modules.")), "This section describes modules options of ejabberd " ++ Version ++ ".",
"The modules that changed in this version are marked with 🟤.",
io_lib:nl()] ++ io_lib:nl()] ++
lists:flatmap( lists:flatmap(
fun({M, Descr, DocOpts, Backends, Example}) -> fun({M, Descr, DocOpts, Backends, Example}) ->
ModName = atom_to_list(M), ModName = atom_to_list(M),
VersionMark = get_version_mark(Example),
[io_lib:nl(), [io_lib:nl(),
ModName, lists:flatten([ModName, VersionMark]),
lists:duplicate(length(atom_to_list(M)), $~), lists:duplicate(length(atom_to_list(M)), $~),
"[[" ++ ModName ++ "]]", "[[" ++ ModName ++ "]]",
io_lib:nl()] ++ io_lib:nl()] ++
format_versions(Lang, Example) ++ [io_lib:nl()] ++
tr_multi(Lang, Descr) ++ [io_lib:nl()] ++ tr_multi(Lang, Descr) ++ [io_lib:nl()] ++
opts_to_man(Lang, [{M, '', DocOpts}|Backends]) ++ opts_to_man(Lang, [{M, '', DocOpts}|Backends]) ++
format_example(0, Lang, Example) format_example(0, Lang, Example)
@ -114,7 +120,7 @@ man(Lang) ->
"LISTENERS", "LISTENERS",
"-------", "-------",
"[[listeners]]", "[[listeners]]",
tr(Lang, ?T("This section describes options of all ejabberd listeners.")), "This section describes listeners options of ejabberd " ++ Version ++ ".",
io_lib:nl(), io_lib:nl(),
"TODO"], "TODO"],
AsciiData = AsciiData =
@ -151,7 +157,7 @@ opts_to_man(Lang, Backends) ->
end, Backends). end, Backends).
opt_to_man(Lang, {Option, Options}, Level) -> opt_to_man(Lang, {Option, Options}, Level) ->
[format_option(Lang, Option, Options)|format_desc(Lang, Options)] ++ [format_option(Lang, Option, Options)|format_versions(Lang, Options)++format_desc(Lang, Options)] ++
format_example(Level, Lang, Options); format_example(Level, Lang, Options);
opt_to_man(Lang, {Option, Options, Children}, Level) -> opt_to_man(Lang, {Option, Options, Children}, Level) ->
[format_option(Lang, Option, Options)|format_desc(Lang, Options)] ++ [format_option(Lang, Option, Options)|format_desc(Lang, Options)] ++
@ -162,16 +168,28 @@ opt_to_man(Lang, {Option, Options, Children}, Level) ->
lists:keysort(1, Children))]) ++ lists:keysort(1, Children))]) ++
[io_lib:nl()|format_example(Level, Lang, Options)]. [io_lib:nl()|format_example(Level, Lang, Options)].
format_option(Lang, Option, #{note := Note, value := Val}) -> get_version_mark(#{note := Note}) ->
"\n\n_Note_ about the next option: " ++ Note ++ ":\n\n"++ [XX, YY | _] = string:tokens(binary_to_list(ejabberd_option:version()), "."),
"*" ++ atom_to_list(Option) ++ "*: 'pass:[" ++ XXYY = string:join([XX, YY], "."),
tr(Lang, Val) ++ "]'::"; case string:find(Note, XXYY) of
format_option(Lang, Option, #{value := Val}) -> nomatch -> "";
"*" ++ atom_to_list(Option) ++ "*: 'pass:[" ++ _ -> " 🟤"
end;
get_version_mark(_) ->
"".
format_option(Lang, Option, #{value := Val} = Options) ->
VersionMark = get_version_mark(Options),
"*" ++ atom_to_list(Option) ++ VersionMark ++ "*: 'pass:[" ++
tr(Lang, Val) ++ "]'::"; tr(Lang, Val) ++ "]'::";
format_option(_Lang, Option, #{}) -> format_option(_Lang, Option, #{}) ->
"*" ++ atom_to_list(Option) ++ "*::". "*" ++ atom_to_list(Option) ++ "*::".
format_versions(_Lang, #{note := Note}) when Note /= [] ->
["_Note_ about this option: " ++ Note ++ ". "];
format_versions(_, _) ->
[].
format_desc(Lang, #{desc := Desc}) -> format_desc(Lang, #{desc := Desc}) ->
tr_multi(Lang, Desc). tr_multi(Lang, Desc).
@ -194,7 +212,7 @@ format_example(Level, Lang, #{example := [_|_] = Example}) ->
false -> false ->
lists:flatmap( lists:flatmap(
fun(Block) -> fun(Block) ->
["+", "''''", "+"|Block] ["+", "*Examples*:", "+"|Block]
end, end,
lists:map( lists:map(
fun({Text, Lines}) -> fun({Text, Lines}) ->

View File

@ -81,7 +81,7 @@
get_commands_spec() -> get_commands_spec() ->
[ [
#ejabberd_commands{name = oauth_issue_token, tags = [oauth], #ejabberd_commands{name = oauth_issue_token, tags = [oauth],
desc = "Issue an [OAuth](https://docs.ejabberd.im/developer/ejabberd-api/oauth/) token for the given jid", desc = "Issue an _`oauth.md|OAuth`_ token for the given jid",
module = ?MODULE, function = oauth_issue_token, module = ?MODULE, function = oauth_issue_token,
args = [{jid, string},{ttl, integer}, {scopes, string}], args = [{jid, string},{ttl, integer}, {scopes, string}],
policy = restricted, policy = restricted,
@ -92,7 +92,7 @@ get_commands_spec() ->
result = {result, {tuple, [{token, string}, {scopes, string}, {expires_in, string}]}} result = {result, {tuple, [{token, string}, {scopes, string}, {expires_in, string}]}}
}, },
#ejabberd_commands{name = oauth_issue_token, tags = [oauth], #ejabberd_commands{name = oauth_issue_token, tags = [oauth],
desc = "Issue an [OAuth](https://docs.ejabberd.im/developer/ejabberd-api/oauth/) token for the given jid", desc = "Issue an _`oauth.md|OAuth`_ optionredir token for the given jid",
module = ?MODULE, function = oauth_issue_token, module = ?MODULE, function = oauth_issue_token,
version = 1, version = 1,
note = "updated in 24.02", note = "updated in 24.02",
@ -105,7 +105,7 @@ get_commands_spec() ->
result = {result, {tuple, [{token, string}, {scopes, {list, {scope, string}}}, {expires_in, string}]}} result = {result, {tuple, [{token, string}, {scopes, {list, {scope, string}}}, {expires_in, string}]}}
}, },
#ejabberd_commands{name = oauth_list_tokens, tags = [oauth], #ejabberd_commands{name = oauth_list_tokens, tags = [oauth],
desc = "List [OAuth](https://docs.ejabberd.im/developer/ejabberd-api/oauth/) tokens, user, scope, and seconds to expire (only Mnesia)", desc = "List _`oauth.md|OAuth`_ tokens, user, scope, and seconds to expire (only Mnesia)",
longdesc = "List OAuth tokens, their user and scope, and how many seconds remain until expirity", longdesc = "List OAuth tokens, their user and scope, and how many seconds remain until expirity",
module = ?MODULE, function = oauth_list_tokens, module = ?MODULE, function = oauth_list_tokens,
args = [], args = [],
@ -113,7 +113,7 @@ get_commands_spec() ->
result = {tokens, {list, {token, {tuple, [{token, string}, {user, string}, {scope, string}, {expires_in, string}]}}}} result = {tokens, {list, {token, {tuple, [{token, string}, {user, string}, {scope, string}, {expires_in, string}]}}}}
}, },
#ejabberd_commands{name = oauth_revoke_token, tags = [oauth], #ejabberd_commands{name = oauth_revoke_token, tags = [oauth],
desc = "Revoke authorization for an [OAuth](https://docs.ejabberd.im/developer/ejabberd-api/oauth/) token", desc = "Revoke authorization for an _`oauth.md|OAuth`_ token",
note = "changed in 22.05", note = "changed in 22.05",
module = ?MODULE, function = oauth_revoke_token, module = ?MODULE, function = oauth_revoke_token,
args = [{token, binary}], args = [{token, binary}],
@ -122,7 +122,7 @@ get_commands_spec() ->
result_desc = "Result code" result_desc = "Result code"
}, },
#ejabberd_commands{name = oauth_add_client_password, tags = [oauth], #ejabberd_commands{name = oauth_add_client_password, tags = [oauth],
desc = "Add [OAuth](https://docs.ejabberd.im/developer/ejabberd-api/oauth/) client_id with password grant type", desc = "Add _`oauth.md|OAuth`_ client_id with password grant type",
module = ?MODULE, function = oauth_add_client_password, module = ?MODULE, function = oauth_add_client_password,
args = [{client_id, binary}, args = [{client_id, binary},
{client_name, binary}, {client_name, binary},
@ -131,7 +131,7 @@ get_commands_spec() ->
result = {res, restuple} result = {res, restuple}
}, },
#ejabberd_commands{name = oauth_add_client_implicit, tags = [oauth], #ejabberd_commands{name = oauth_add_client_implicit, tags = [oauth],
desc = "Add [OAuth](https://docs.ejabberd.im/developer/ejabberd-api/oauth/) client_id with implicit grant type", desc = "Add _`oauth.md|OAuth`_ client_id with implicit grant type",
module = ?MODULE, function = oauth_add_client_implicit, module = ?MODULE, function = oauth_add_client_implicit,
args = [{client_id, binary}, args = [{client_id, binary},
{client_name, binary}, {client_name, binary},
@ -140,7 +140,7 @@ get_commands_spec() ->
result = {res, restuple} result = {res, restuple}
}, },
#ejabberd_commands{name = oauth_remove_client, tags = [oauth], #ejabberd_commands{name = oauth_remove_client, tags = [oauth],
desc = "Remove [OAuth](https://docs.ejabberd.im/developer/ejabberd-api/oauth/) client_id", desc = "Remove _`oauth.md|OAuth`_ client_id",
module = ?MODULE, function = oauth_remove_client, module = ?MODULE, function = oauth_remove_client,
args = [{client_id, binary}], args = [{client_id, binary}],
policy = restricted, policy = restricted,

View File

@ -37,13 +37,13 @@ doc() ->
#{value => "[Options, ...]", #{value => "[Options, ...]",
desc => desc =>
?T("The option for listeners configuration. See the " ?T("The option for listeners configuration. See the "
"http://../listen/[Listen Modules] section " "_`listen.md|Listen Modules`_ section "
"for details.")}}, "for details.")}},
{modules, {modules,
#{value => "{Module: Options}", #{value => "{Module: Options}",
desc => desc =>
?T("The option for modules configuration. See " ?T("The option for modules configuration. See "
"http://../modules/[Modules] section " "_`modules.md|Modules`_ section "
"for details.")}}, "for details.")}},
{loglevel, {loglevel,
#{value => #{value =>
@ -221,7 +221,7 @@ doc() ->
#{value => "{AccessName: {allow|deny: ACLRules|ACLName}}", #{value => "{AccessName: {allow|deny: ACLRules|ACLName}}",
desc => desc =>
?T("This option defines " ?T("This option defines "
"http://../basic/#access-rules[Access Rules]. " "_`basic.md#access-rules|Access Rules`_. "
"Each access rule is " "Each access rule is "
"assigned a name that can be referenced from other parts " "assigned a name that can be referenced from other parts "
"of the configuration file (mostly from 'access' options of " "of the configuration file (mostly from 'access' options of "
@ -255,7 +255,7 @@ doc() ->
{acme, {acme,
#{value => ?T("Options"), #{value => ?T("Options"),
desc => desc =>
?T("http://../basic/#acme[ACME] configuration, to automatically " ?T("_`basic.md#acme|ACME`_ configuration, to automatically "
"obtain SSL certificates for the domains served by ejabberd, " "obtain SSL certificates for the domains served by ejabberd, "
"which means that certificate requests and renewals are " "which means that certificate requests and renewals are "
"performed to some CA server (aka \"ACME server\") in a fully " "performed to some CA server (aka \"ACME server\") in a fully "
@ -303,8 +303,8 @@ doc() ->
#{value => "true | false", #{value => "true | false",
desc => desc =>
?T("Whether to allow installation of third-party modules or not. " ?T("Whether to allow installation of third-party modules or not. "
"See https://docs.ejabberd.im/developer/extending-ejabberd/modules/#ejabberd-contrib" "See _`../../developer/extending-ejabberd/modules.md#ejabberd-contrib|ejabberd-contrib`_ "
"[ejabberd-contrib] documentation section. " "documentation section. "
"The default value is 'true'.")}}, "The default value is 'true'.")}},
{allow_multiple_connections, {allow_multiple_connections,
#{value => "true | false", #{value => "true | false",
@ -328,8 +328,7 @@ doc() ->
desc => desc =>
?T("Define the permissions for API access. Please consult the " ?T("Define the permissions for API access. Please consult the "
"ejabberd Docs web -> For Developers -> ejabberd ReST API -> " "ejabberd Docs web -> For Developers -> ejabberd ReST API -> "
"https://docs.ejabberd.im/developer/ejabberd-api/permissions/" "_`../../developer/ejabberd-api/permissions.md|API Permissions`_.")}},
"[API Permissions].")}},
{append_host_config, {append_host_config,
#{value => "{Host: Options}", #{value => "{Host: Options}",
desc => desc =>
@ -373,7 +372,7 @@ doc() ->
note => "improved in 20.01", note => "improved in 20.01",
desc => desc =>
[?T("The option defines in what format the users passwords " [?T("The option defines in what format the users passwords "
"are stored, plain text or in http://../authentication/#scram[SCRAM] format:"), "", "are stored, plain text or in _`authentication.md#scram|SCRAM`_ format:"), "",
?T("* 'plain': The password is stored as plain text " ?T("* 'plain': The password is stored as plain text "
"in the database. This is risky because the passwords " "in the database. This is risky because the passwords "
"can be read if your database gets compromised. " "can be read if your database gets compromised. "
@ -392,7 +391,7 @@ doc() ->
{auth_scram_hash, {auth_scram_hash,
#{value => "sha | sha256 | sha512", #{value => "sha | sha256 | sha512",
desc => desc =>
?T("Hash algorithm that should be used to store password in http://../authentication/#scram[SCRAM] format. " ?T("Hash algorithm that should be used to store password in _`authentication.md#scram|SCRAM`_ format. "
"You shouldn't change this if you already have passwords generated with " "You shouldn't change this if you already have passwords generated with "
"a different algorithm - users that have such passwords will not be able " "a different algorithm - users that have such passwords will not be able "
"to authenticate. The default value is 'sha'.")}}, "to authenticate. The default value is 'sha'.")}},
@ -418,7 +417,7 @@ doc() ->
"corresponding JID(s) in 'subjectAltName' field. " "corresponding JID(s) in 'subjectAltName' field. "
"There is no default value."), "", "There is no default value."), "",
?T("You can use _`host_config`_ to specify this option per-vhost."), "", ?T("You can use _`host_config`_ to specify this option per-vhost."), "",
?T("To set a specific file per listener, use the listener's http://../listen-options/#cafile[cafile] option. Please notice that 'c2s_cafile' overrides the listener's 'cafile' option."), "" ?T("To set a specific file per listener, use the listener's _`listen-options.md#cafile|cafile`_ option. Please notice that 'c2s_cafile' overrides the listener's 'cafile' option."), ""
]}}, ]}},
{c2s_ciphers, {c2s_ciphers,
#{value => "[Cipher, ...]", #{value => "[Cipher, ...]",
@ -468,7 +467,7 @@ doc() ->
#{value => ?T("Path | ModuleName"), #{value => ?T("Path | ModuleName"),
note => "improved in 23.01", note => "improved in 23.01",
desc => desc =>
?T("Full path to a script that generates http://../basic/#captcha[CAPTCHA] images. " ?T("Full path to a script that generates _`basic.md#captcha|CAPTCHA`_ images. "
"'@VERSION@' is replaced with ejabberd version number in 'XX.YY' format. " "'@VERSION@' is replaced with ejabberd version number in 'XX.YY' format. "
"'@SEMVER@' is replaced with ejabberd version number in semver format " "'@SEMVER@' is replaced with ejabberd version number in semver format "
"when compiled with Elixir's mix, or XX.YY format otherwise. " "when compiled with Elixir's mix, or XX.YY format otherwise. "
@ -481,7 +480,7 @@ doc() ->
{captcha_limit, {captcha_limit,
#{value => "pos_integer() | infinity", #{value => "pos_integer() | infinity",
desc => desc =>
?T("Maximum number of http://../basic/#captcha[CAPTCHA] generated images per minute for " ?T("Maximum number of _`basic.md#captcha|CAPTCHA`_ generated images per minute for "
"any given JID. The option is intended to protect the server " "any given JID. The option is intended to protect the server "
"from CAPTCHA DoS. The default value is 'infinity'.")}}, "from CAPTCHA DoS. The default value is 'infinity'.")}},
{captcha_host, {captcha_host,
@ -491,7 +490,7 @@ doc() ->
#{value => ?T("URL | auto | undefined"), #{value => ?T("URL | auto | undefined"),
note => "improved in 23.04", note => "improved in 23.04",
desc => desc =>
?T("An URL where http://../basic/#captcha[CAPTCHA] requests should be sent. NOTE: you need " ?T("An URL where _`basic.md#captcha|CAPTCHA`_ requests should be sent. NOTE: you need "
"to configure 'request_handlers' for 'ejabberd_http' listener " "to configure 'request_handlers' for 'ejabberd_http' listener "
"as well. " "as well. "
"If set to 'auto', it builds the URL using a 'request_handler' " "If set to 'auto', it builds the URL using a 'request_handler' "
@ -696,8 +695,8 @@ doc() ->
note => "added in 23.10", note => "added in 23.10",
desc => desc =>
?T("Modules to install from " ?T("Modules to install from "
"https://docs.ejabberd.im/developer/extending-ejabberd/modules/#ejabberd-contrib" "_`../../developer/extending-ejabberd/modules.md#ejabberd-contrib|ejabberd-contrib`_ "
"[ejabberd-contrib] at start time. " "at start time. "
"The default value is an empty list of modules: '[]'.")}}, "The default value is an empty list of modules: '[]'.")}},
{jwt_auth_only_rule, {jwt_auth_only_rule,
#{value => ?T("AccessName"), #{value => ?T("AccessName"),
@ -1156,7 +1155,7 @@ doc() ->
{s2s_access, {s2s_access,
#{value => ?T("Access"), #{value => ?T("Access"),
desc => desc =>
?T("This http://../basic/#access-rules[Access Rule] defines to " ?T("This _`basic.md#access-rules|Access Rule`_ defines to "
"what remote servers can s2s connections be established. " "what remote servers can s2s connections be established. "
"The default value is 'all'; no restrictions are applied, it is" "The default value is 'all'; no restrictions are applied, it is"
" allowed to connect s2s to/from all remote servers.")}}, " allowed to connect s2s to/from all remote servers.")}},

View File

@ -625,7 +625,7 @@ maybe_disclaimer_not_admin(MenuItems, AJID, Lang) ->
{[_], []} -> {[_], []} ->
[?XREST(?T("Apparently your account has no administration rights in this server. " [?XREST(?T("Apparently your account has no administration rights in this server. "
"Please check how to grant admin rights in: " "Please check how to grant admin rights in: "
"https://docs.ejabberd.im/admin/installation/#administration-account")) "https://docs.ejabberd.im/admin/install/next-steps/#administration-account"))
]; ];
_ -> _ ->
[] []

View File

@ -410,6 +410,5 @@ listen_options() ->
" method may be removed in a future ejabberd release. You are " " method may be removed in a future ejabberd release. You are "
"encouraged to define ejabberd_xmlrpc inside request_handlers " "encouraged to define ejabberd_xmlrpc inside request_handlers "
"option of ejabberd_http listen module. See the ejabberd " "option of ejabberd_http listen module. See the ejabberd "
"documentation for details: https://docs.ejabberd.im/admin/" "documentation for details: _`/admin/configuration/listen/#ejabberd-xmlrpc|ejabberd_xmlrpc listener`_.", []),
"configuration/listen/#ejabberd-xmlrpc", []),
[]. [].

View File

@ -74,6 +74,7 @@
-callback mod_opt_type(atom()) -> econf:validator(). -callback mod_opt_type(atom()) -> econf:validator().
-callback mod_options(binary()) -> [{atom(), term()} | atom()]. -callback mod_options(binary()) -> [{atom(), term()} | atom()].
-callback mod_doc() -> #{desc => binary() | [binary()], -callback mod_doc() -> #{desc => binary() | [binary()],
note => string(),
opts => [opt_doc()], opts => [opt_doc()],
example => [string()] | [{binary(), [string()]}]}. example => [string()] | [{binary(), [string()]}]}.
-callback depends(binary(), opts()) -> [{module(), hard | soft}]. -callback depends(binary(), opts()) -> [{module(), hard | soft}].

View File

@ -170,7 +170,7 @@ get_commands_spec() ->
#ejabberd_commands{name = delete_old_users, tags = [accounts, purge], #ejabberd_commands{name = delete_old_users, tags = [accounts, purge],
desc = "Delete users that didn't log in last days, or that never logged", desc = "Delete users that didn't log in last days, or that never logged",
longdesc = "To protect admin accounts, configure this for example:\n" longdesc = "To protect admin accounts, configure this for example:\n"
"```\n" "``` yaml\n"
"access_rules:\n" "access_rules:\n"
" protect_old_users:\n" " protect_old_users:\n"
" - allow: admin\n" " - allow: admin\n"
@ -186,7 +186,7 @@ get_commands_spec() ->
#ejabberd_commands{name = delete_old_users_vhost, tags = [accounts, purge], #ejabberd_commands{name = delete_old_users_vhost, tags = [accounts, purge],
desc = "Delete users that didn't log in last days in vhost, or that never logged", desc = "Delete users that didn't log in last days in vhost, or that never logged",
longdesc = "To protect admin accounts, configure this for example:\n" longdesc = "To protect admin accounts, configure this for example:\n"
"```\n" "``` yaml\n"
"access_rules:\n" "access_rules:\n"
" delete_old_users:\n" " delete_old_users:\n"
" - deny: admin\n" " - deny: admin\n"

View File

@ -632,6 +632,6 @@ mod_doc() ->
#{desc => #{desc =>
?T("This module can be used to update existing SQL database " ?T("This module can be used to update existing SQL database "
"from the default to the new schema. Check the section " "from the default to the new schema. Check the section "
"http://../database/#default-and-new-schemas[Default and New Schemas] for details. " "_`database.md#default-and-new-schemas|Default and New Schemas`_ for details. "
"Please note that only MS SQL, MySQL, and PostgreSQL are supported. " "Please note that only MS SQL, MySQL, and PostgreSQL are supported. "
"When the module is loaded use _`update_sql`_ API.")}. "When the module is loaded use _`update_sql`_ API.")}.

View File

@ -301,6 +301,6 @@ mod_doc() ->
desc => desc =>
?T("Whether to generate CAPTCHA or not in response to " ?T("Whether to generate CAPTCHA or not in response to "
"messages from strangers. See also section " "messages from strangers. See also section "
"http://../#captcha" "_`basic.md#captcha|CAPTCHA`_"
"[CAPTCHA] of the Configuration Guide. " " of the Configuration Guide. "
"The default value is 'false'.")}}]}. "The default value is 'false'.")}}]}.

View File

@ -252,17 +252,16 @@ mod_doc() ->
#{desc => #{desc =>
[?T("This module serves a simple page for the " [?T("This module serves a simple page for the "
"https://conversejs.org/[Converse] XMPP web browser client."), "", "https://conversejs.org/[Converse] XMPP web browser client."), "",
?T("This module is available since ejabberd 21.12."),
?T("Several options were improved in ejabberd 22.05."), "",
?T("To use this module, in addition to adding it to the 'modules' " ?T("To use this module, in addition to adding it to the 'modules' "
"section, you must also enable it in 'listen' -> 'ejabberd_http' -> " "section, you must also enable it in 'listen' -> 'ejabberd_http' -> "
"http://../listen-options/#request-handlers[request_handlers]."), "", "_`listen-options.md#request_handlers|request_handlers`_."), "",
?T("Make sure either 'mod_bosh' or 'ejabberd_http_ws' " ?T("Make sure either 'mod_bosh' or 'ejabberd_http_ws' "
"http://../listen-options/#request-handlers[request_handlers] " "_`listen-options.md#request_handlers|request_handlers`_ "
"are enabled."), "", "are enabled."), "",
?T("When 'conversejs_css' and 'conversejs_script' are 'auto', " ?T("When 'conversejs_css' and 'conversejs_script' are 'auto', "
"by default they point to the public Converse client.") "by default they point to the public Converse client.")
], ],
note => "added in 21.12 and improved in 22.05",
example => example =>
[{?T("Manually setup WebSocket url, and use the public Converse client:"), [{?T("Manually setup WebSocket url, and use the public Converse client:"),
["listen:", ["listen:",

View File

@ -129,7 +129,6 @@ mod_doc() ->
" server: sat-pubsub.example.org", " server: sat-pubsub.example.org",
"", "",
"modules:", "modules:",
" ...",
" mod_delegation:", " mod_delegation:",
" namespaces:", " namespaces:",
" urn:xmpp:mam:1:", " urn:xmpp:mam:1:",

View File

@ -211,11 +211,11 @@ mod_doc() ->
[?T("This module serves small 'host-meta' files as described in " [?T("This module serves small 'host-meta' files as described in "
"https://xmpp.org/extensions/xep-0156.html[XEP-0156: Discovering " "https://xmpp.org/extensions/xep-0156.html[XEP-0156: Discovering "
"Alternative XMPP Connection Methods]."), "", "Alternative XMPP Connection Methods]."), "",
?T("This module is available since ejabberd 22.05."), "",
?T("To use this module, in addition to adding it to the 'modules' " ?T("To use this module, in addition to adding it to the 'modules' "
"section, you must also enable it in 'listen' -> 'ejabberd_http' -> " "section, you must also enable it in 'listen' -> 'ejabberd_http' -> "
"http://../listen-options/#request-handlers[request_handlers]."), "", "_`listen-options.md#request_handlers|request_handlers`_."), "",
?T("Notice it only works if ejabberd_http has tls enabled.")], ?T("Notice it only works if ejabberd_http has tls enabled.")],
note => "added in 22.05",
example => example =>
["listen:", ["listen:",
" -", " -",

View File

@ -534,11 +534,11 @@ mod_options(_) ->
mod_doc() -> mod_doc() ->
#{desc => #{desc =>
[?T("This module provides a ReST interface to call " [?T("This module provides a ReST interface to call "
"https://docs.ejabberd.im/developer/ejabberd-api[ejabberd API] " "_`../../developer/ejabberd-api/index.md|ejabberd API`_ "
"commands using JSON data."), "", "commands using JSON data."), "",
?T("To use this module, in addition to adding it to the 'modules' " ?T("To use this module, in addition to adding it to the 'modules' "
"section, you must also enable it in 'listen' -> 'ejabberd_http' -> " "section, you must also enable it in 'listen' -> 'ejabberd_http' -> "
"http://../listen-options/#request-handlers[request_handlers]."), "", "_`listen-options.md#request_handlers|request_handlers`_."), "",
?T("To use a specific API version N, when defining the URL path " ?T("To use a specific API version N, when defining the URL path "
"in the request_handlers, add a 'vN'. " "in the request_handlers, add a 'vN'. "
"For example: '/api/v2: mod_http_api'"), "", "For example: '/api/v2: mod_http_api'"), "",

View File

@ -561,18 +561,13 @@ mod_doc() ->
"content type 'ogg' is defined, 'png' is redefined, and 'jpg' " "content type 'ogg' is defined, 'png' is redefined, and 'jpg' "
"definition is deleted:"), "definition is deleted:"),
["listen:", ["listen:",
" ...",
" -", " -",
" port: 5280", " port: 5280",
" module: ejabberd_http", " module: ejabberd_http",
" request_handlers:", " request_handlers:",
" ...",
" /pub/content: mod_http_fileserver", " /pub/content: mod_http_fileserver",
" ...",
" ...",
"", "",
"modules:", "modules:",
" ...",
" mod_http_fileserver:", " mod_http_fileserver:",
" docroot: /var/www", " docroot: /var/www",
" accesslog: /var/log/ejabberd/access.log", " accesslog: /var/log/ejabberd/access.log",
@ -585,5 +580,4 @@ mod_doc() ->
" content_types:", " content_types:",
" .ogg: audio/ogg", " .ogg: audio/ogg",
" .png: image/png", " .png: image/png",
" default_content_type: text/html", " default_content_type: text/html"]}]}.
" ..."]}]}.

View File

@ -234,7 +234,7 @@ mod_doc() ->
"another URL from which that file can later be downloaded."), "", "another URL from which that file can later be downloaded."), "",
?T("In order to use this module, it must be enabled " ?T("In order to use this module, it must be enabled "
"in 'listen' -> 'ejabberd_http' -> " "in 'listen' -> 'ejabberd_http' -> "
"http://../listen-options/#request-handlers[request_handlers].")], "_`listen-options.md#request_handlers|request_handlers`_.")],
opts => opts =>
[{host, [{host,
#{desc => ?T("Deprecated. Use 'hosts' instead.")}}, #{desc => ?T("Deprecated. Use 'hosts' instead.")}},
@ -367,40 +367,35 @@ mod_doc() ->
"of vCard. Since the representation has no attributes, " "of vCard. Since the representation has no attributes, "
"the mapping is straightforward."), "the mapping is straightforward."),
example => example =>
[{?T("For example, the following XML representation of vCard:"), ["# This XML representation of vCard:",
["<vCard xmlns='vcard-temp'>", "# <vCard xmlns='vcard-temp'>",
" <FN>Conferences</FN>", "# <FN>Conferences</FN>",
" <ADR>", "# <ADR>",
" <WORK/>", "# <WORK/>",
" <STREET>Elm Street</STREET>", "# <STREET>Elm Street</STREET>",
" </ADR>", "# </ADR>",
"</vCard>"]}, "# </vCard>",
{?T("will be translated to:"), "# ",
["vcard:", "# is translated to:",
"vcard:",
" fn: Conferences", " fn: Conferences",
" adr:", " adr:",
" -", " -",
" work: true", " work: true",
" street: Elm Street"]}]}}], " street: Elm Street"]}}],
example => example =>
["listen:", ["listen:",
" ...",
" -", " -",
" port: 5443", " port: 5443",
" module: ejabberd_http", " module: ejabberd_http",
" tls: true", " tls: true",
" request_handlers:", " request_handlers:",
" ...",
" /upload: mod_http_upload", " /upload: mod_http_upload",
" ...",
" ...",
"", "",
"modules:", "modules:",
" ...",
" mod_http_upload:", " mod_http_upload:",
" docroot: /ejabberd/upload", " docroot: /ejabberd/upload",
" put_url: \"https://@HOST@:5443/upload\"", " put_url: \"https://@HOST@:5443/upload\""]}.
" ..."]}.
-spec depends(binary(), gen_mod:opts()) -> [{module(), hard | soft}]. -spec depends(binary(), gen_mod:opts()) -> [{module(), hard | soft}].
depends(_Host, _Opts) -> depends(_Host, _Opts) ->

View File

@ -134,19 +134,15 @@ mod_doc() ->
"to use the quota feature. You can stick to the default names " "to use the quota feature. You can stick to the default names "
"and just specify access rules such as those in this example:"), "and just specify access rules such as those in this example:"),
["shaper_rules:", ["shaper_rules:",
" ...",
" soft_upload_quota:", " soft_upload_quota:",
" 1000: all # MiB", " 1000: all # MiB",
" hard_upload_quota:", " hard_upload_quota:",
" 1100: all # MiB", " 1100: all # MiB",
" ...",
"", "",
"modules:", "modules:",
" ...",
" mod_http_upload: {}", " mod_http_upload: {}",
" mod_http_upload_quota:", " mod_http_upload_quota:",
" max_days: 100", " max_days: 100"]}]}.
" ..."]}]}.
-spec depends(binary(), gen_mod:opts()) -> [{module(), hard | soft}]. -spec depends(binary(), gen_mod:opts()) -> [{module(), hard | soft}].
depends(_Host, _Opts) -> depends(_Host, _Opts) ->

View File

@ -884,8 +884,8 @@ mod_options(Host) ->
mod_doc() -> mod_doc() ->
#{desc => #{desc =>
[?T("https://matrix.org/[Matrix] gateway."), "", [?T("https://matrix.org/[Matrix] gateway.")],
?T("This module is available since ejabberd 24.02.")], note => "added in 24.02",
example => example =>
["listen:", ["listen:",
" -", " -",

View File

@ -102,16 +102,13 @@ mod_doc() ->
[?T("This module is an experimental implementation of " [?T("This module is an experimental implementation of "
"https://xmpp.org/extensions/xep-0369.html" "https://xmpp.org/extensions/xep-0369.html"
"[XEP-0369: Mediated Information eXchange (MIX)]. " "[XEP-0369: Mediated Information eXchange (MIX)]. "
"MIX support was added in ejabberd 16.03 as an " "It's asserted that "
"experimental feature, updated in 19.02, and is not "
"yet ready to use in production. It's asserted that "
"the MIX protocol is going to replace the MUC protocol " "the MIX protocol is going to replace the MUC protocol "
"in the future (see _`mod_muc`_)."), "", "in the future (see _`mod_muc`_)."), "",
?T("To learn more about how to use that feature, you can refer to " ?T("To learn more about how to use that feature, you can refer to "
"our tutorial: https://docs.ejabberd.im/tutorials/mix-010/" "our tutorial: _`../../tutorials/mix-010.md|Getting started with MIX`_"), "",
"[Getting started with XEP-0369: Mediated Information "
"eXchange (MIX) v0.1]."), "",
?T("The module depends on _`mod_mam`_.")], ?T("The module depends on _`mod_mam`_.")],
note => "added in 16.03 and improved in 19.02",
opts => opts =>
[{access_create, [{access_create,
#{value => ?T("AccessName"), #{value => ?T("AccessName"),

View File

@ -282,7 +282,7 @@ listen_options() ->
mod_doc() -> mod_doc() ->
#{desc => #{desc =>
?T("This module adds " ?T("This module adds "
"https://docs.ejabberd.im/admin/guide/mqtt/[support for the MQTT] " "_`../guide/mqtt/index.md|support for the MQTT`_ "
"protocol version '3.1.1' and '5.0'. Remember to configure " "protocol version '3.1.1' and '5.0'. Remember to configure "
"'mod_mqtt' in 'modules' and 'listen' sections."), "'mod_mqtt' in 'modules' and 'listen' sections."),
opts => opts =>

View File

@ -178,7 +178,6 @@ mod_doc() ->
?T("It is available since ejabberd 23.01.")], ?T("It is available since ejabberd 23.01.")],
example => example =>
["modules:", ["modules:",
" ...",
" mod_mqtt_bridge:", " mod_mqtt_bridge:",
" servers:", " servers:",
" \"mqtt://server.com\":", " \"mqtt://server.com\":",
@ -189,8 +188,7 @@ mod_doc() ->
" \"remoteB\": \"localB\" # changes to 'remoteB' on remote server will be stored as 'localB' on local server", " \"remoteB\": \"localB\" # changes to 'remoteB' on remote server will be stored as 'localB' on local server",
" authentication:", " authentication:",
" certfile: \"/etc/ejabberd/mqtt_server.pem\"", " certfile: \"/etc/ejabberd/mqtt_server.pem\"",
" replication_user: \"mqtt@xmpp.server.com\"", " replication_user: \"mqtt@xmpp.server.com\""],
" ..."],
opts => opts =>
[{servers, [{servers,
#{value => "{ServerUrl: {publish: [TopicPairs], subscribe: [TopicPairs], authentication: [AuthInfo]}}", #{value => "{ServerUrl: {publish: [TopicPairs], subscribe: [TopicPairs], authentication: [AuthInfo]}}",

View File

@ -1654,21 +1654,22 @@ mod_doc() ->
"of vCard. Since the representation has no attributes, " "of vCard. Since the representation has no attributes, "
"the mapping is straightforward."), "the mapping is straightforward."),
example => example =>
[{?T("For example, the following XML representation of vCard:"), ["# This XML representation of vCard:",
["<vCard xmlns='vcard-temp'>", "# <vCard xmlns='vcard-temp'>",
" <FN>Conferences</FN>", "# <FN>Conferences</FN>",
" <ADR>", "# <ADR>",
" <WORK/>", "# <WORK/>",
" <STREET>Elm Street</STREET>", "# <STREET>Elm Street</STREET>",
" </ADR>", "# </ADR>",
"</vCard>"]}, "# </vCard>",
{?T("will be translated to:"), "# ",
["vcard:", "# is translated to:",
"vcard:",
" fn: Conferences", " fn: Conferences",
" adr:", " adr:",
" -", " -",
" work: true", " work: true",
" street: Elm Street"]}]}}, " street: Elm Street"]}},
{cleanup_affiliations_on_start, {cleanup_affiliations_on_start,
#{value => "true | false", #{value => "true | false",
note => "added in 22.05", note => "added in 22.05",
@ -1732,7 +1733,7 @@ mod_doc() ->
?T("When a user tries to join a room where they have no " ?T("When a user tries to join a room where they have no "
"affiliation (not owner, admin or member), the room " "affiliation (not owner, admin or member), the room "
"requires them to fill a CAPTCHA challenge (see section " "requires them to fill a CAPTCHA challenge (see section "
"http://../#captcha[CAPTCHA] " "_`basic.md#captcha|CAPTCHA`_ "
"in order to accept their join in the room. " "in order to accept their join in the room. "
"The default value is 'false'.")}}, "The default value is 'false'.")}},
{description, {description,
@ -1824,8 +1825,7 @@ mod_doc() ->
#{value => "true | false", #{value => "true | false",
desc => desc =>
?T("Allow users to subscribe to room events as described in " ?T("Allow users to subscribe to room events as described in "
"https://docs.ejabberd.im/developer/xmpp-clients-bots/extensions/muc-sub/" "_`../../developer/xmpp-clients-bots/extensions/muc-sub.md|Multi-User Chat Subscriptions`_. "
"[Multi-User Chat Subscriptions]. "
"The default value is 'false'.")}}, "The default value is 'false'.")}},
{title, {title,
#{value => ?T("Room Title"), #{value => ?T("Room Title"),

View File

@ -380,7 +380,7 @@ get_commands_spec() ->
desc = "Subscribe several users to a MUC conference", desc = "Subscribe several users to a MUC conference",
note = "added in 22.05", note = "added in 22.05",
longdesc = "This command accepts up to 50 users at once " longdesc = "This command accepts up to 50 users at once "
"(this is configurable with the *`mod_muc_admin`* option " "(this is configurable with the _`mod_muc_admin`_ option "
"`subscribe_room_many_max_users`)", "`subscribe_room_many_max_users`)",
module = ?MODULE, function = subscribe_room_many, module = ?MODULE, function = subscribe_room_many,
args_desc = ["Users JIDs and nicks", args_desc = ["Users JIDs and nicks",
@ -402,7 +402,7 @@ get_commands_spec() ->
#ejabberd_commands{name = subscribe_room_many, tags = [muc_room, muc_sub], #ejabberd_commands{name = subscribe_room_many, tags = [muc_room, muc_sub],
desc = "Subscribe several users to a MUC conference", desc = "Subscribe several users to a MUC conference",
longdesc = "This command accepts up to 50 users at once " longdesc = "This command accepts up to 50 users at once "
"(this is configurable with the *`mod_muc_admin`* option " "(this is configurable with the _`mod_muc_admin`_ option "
"`subscribe_room_many_max_users`)", "`subscribe_room_many_max_users`)",
module = ?MODULE, function = subscribe_room_many, module = ?MODULE, function = subscribe_room_many,
version = 1, version = 1,

View File

@ -120,8 +120,8 @@ mod_doc() ->
"https://xmpp.org/extensions/xep-0421.html" "https://xmpp.org/extensions/xep-0421.html"
"[XEP-0421: Anonymous unique occupant identifiers for MUCs]."), "", "[XEP-0421: Anonymous unique occupant identifiers for MUCs]."), "",
?T("When the module is enabled, the feature is enabled " ?T("When the module is enabled, the feature is enabled "
"in all semi-anonymous rooms."), "", "in all semi-anonymous rooms.")],
?T("This module is available since ejabberd 23.10.")] note => "added in 23.10"
}. }.
depends(_, _) -> depends(_, _) ->

View File

@ -264,8 +264,8 @@ mod_doc() ->
#{desc => #{desc =>
[?T("This module implement Real-time blocklists for MUC rooms."), "", [?T("This module implement Real-time blocklists for MUC rooms."), "",
?T("It works by observing remote pubsub node conforming with " ?T("It works by observing remote pubsub node conforming with "
"specification described in https://xmppbl.org/."), "", "specification described in https://xmppbl.org/.")],
?T("This module is available since ejabberd 23.04.")], note => "added in 23.04",
opts => opts =>
[{rtbl_server, [{rtbl_server,
#{value => ?T("Domain"), #{value => ?T("Domain"),

View File

@ -1247,8 +1247,8 @@ mod_doc() ->
"are currently open."), "", "are currently open."), "",
?T("NOTE: 'ejabberdctl' has a command to " ?T("NOTE: 'ejabberdctl' has a command to "
"delete expired messages (see chapter " "delete expired messages (see chapter "
"https://docs.ejabberd.im/admin/guide/managing" "_`../guide/managing.md|Managing an ejabberd server`_ "
"[Managing an ejabberd server] in online documentation.")], "in online documentation.")],
opts => opts =>
[{access_max_user_messages, [{access_max_user_messages,
#{value => ?T("AccessName"), #{value => ?T("AccessName"),

View File

@ -352,9 +352,7 @@ mod_doc() ->
"The default value is 'none'.")}}], "The default value is 'none'.")}}],
example => example =>
["modules:", ["modules:",
" ...",
" mod_ping:", " mod_ping:",
" send_pings: true", " send_pings: true",
" ping_interval: 4 min", " ping_interval: 4 min",
" timeout_action: kill", " timeout_action: kill"]}.
" ..."]}.

View File

@ -150,8 +150,6 @@ mod_doc() ->
?T("The time interval. The default value is '1' minute.")}}], ?T("The time interval. The default value is '1' minute.")}}],
example => example =>
["modules:", ["modules:",
" ...",
" mod_pres_counter:", " mod_pres_counter:",
" count: 5", " count: 5",
" interval: 30 secs", " interval: 30 secs"]}.
" ..."]}.

View File

@ -163,15 +163,13 @@ mod_doc() ->
"The default value is 'none'.")}}]}], "The default value is 'none'.")}}]}],
example => example =>
["modules:", ["modules:",
" ...",
" mod_privilege:", " mod_privilege:",
" roster:", " roster:",
" get: all", " get: all",
" presence:", " presence:",
" managed_entity: all", " managed_entity: all",
" message:", " message:",
" outgoing: all", " outgoing: all"]}.
" ..."]}.
depends(_, _) -> depends(_, _) ->
[]. [].

View File

@ -237,23 +237,7 @@ mod_doc() ->
"by some XMPP clients in Service Discovery. The value of " "by some XMPP clients in Service Discovery. The value of "
"'vCard' is a YAML map constructed from an XML representation " "'vCard' is a YAML map constructed from an XML representation "
"of vCard. Since the representation has no attributes, " "of vCard. Since the representation has no attributes, "
"the mapping is straightforward."), "the mapping is straightforward.")}}],
example =>
[{?T("For example, the following XML representation of vCard:"),
["<vCard xmlns='vcard-temp'>",
" <FN>Conferences</FN>",
" <ADR>",
" <WORK/>",
" <STREET>Elm Street</STREET>",
" </ADR>",
"</vCard>"]},
{?T("will be translated to:"),
["vcard:",
" fn: Conferences",
" adr:",
" -",
" work: true",
" street: Elm Street"]}]}}],
example => example =>
["acl:", ["acl:",
" admin:", " admin:",
@ -274,7 +258,6 @@ mod_doc() ->
" proxyrate: 10240", " proxyrate: 10240",
"", "",
"modules:", "modules:",
" ...",
" mod_proxy65:", " mod_proxy65:",
" host: proxy1.example.org", " host: proxy1.example.org",
" name: \"File Transfer Proxy\"", " name: \"File Transfer Proxy\"",
@ -284,5 +267,4 @@ mod_doc() ->
" access: proxy65_access", " access: proxy65_access",
" shaper: proxy65_shaper", " shaper: proxy65_shaper",
" recbuf: 10240", " recbuf: 10240",
" sndbuf: 10240", " sndbuf: 10240"]}.
" ..."]}.

View File

@ -4504,27 +4504,27 @@ mod_doc() ->
"representation of vCard. Since the representation has " "representation of vCard. Since the representation has "
"no attributes, the mapping is straightforward."), "no attributes, the mapping is straightforward."),
example => example =>
[{?T("The following XML representation of vCard:"), ["# This XML representation of vCard:",
["<vCard xmlns='vcard-temp'>", "# <vCard xmlns='vcard-temp'>",
" <FN>PubSub Service</FN>", "# <FN>Conferences</FN>",
" <ADR>", "# <ADR>",
" <WORK/>", "# <WORK/>",
" <STREET>Elm Street</STREET>", "# <STREET>Elm Street</STREET>",
" </ADR>", "# </ADR>",
"</vCard>"]}, "# </vCard>",
{?T("will be translated to:"), "# ",
["vcard:", "# is translated to:",
" fn: PubSub Service", "vcard:",
" fn: Conferences",
" adr:", " adr:",
" -", " -",
" work: true", " work: true",
" street: Elm Street"]}]}} " street: Elm Street"]}}
], ],
example => example =>
[{?T("Example of configuration that uses flat nodes as default, " [{?T("Example of configuration that uses flat nodes as default, "
"and allows use of flat, hometree and pep nodes:"), "and allows use of flat, hometree and pep nodes:"),
["modules:", ["modules:",
" ...",
" mod_pubsub:", " mod_pubsub:",
" access_createnode: pubsub_createnode", " access_createnode: pubsub_createnode",
" max_subscriptions_node: 100", " max_subscriptions_node: 100",
@ -4534,14 +4534,12 @@ mod_doc() ->
" max_items: 4", " max_items: 4",
" plugins:", " plugins:",
" - flat", " - flat",
" - pep", " - pep"]},
" ..."]},
{?T("Using relational database requires using mod_pubsub with " {?T("Using relational database requires using mod_pubsub with "
"db_type 'sql'. Only flat, hometree and pep plugins supports " "db_type 'sql'. Only flat, hometree and pep plugins supports "
"SQL. The following example shows previous configuration " "SQL. The following example shows previous configuration "
"with SQL usage:"), "with SQL usage:"),
["modules:", ["modules:",
" ...",
" mod_pubsub:", " mod_pubsub:",
" db_type: sql", " db_type: sql",
" access_createnode: pubsub_createnode", " access_createnode: pubsub_createnode",
@ -4549,6 +4547,5 @@ mod_doc() ->
" last_item_cache: false", " last_item_cache: false",
" plugins:", " plugins:",
" - flat", " - flat",
" - pep", " - pep"]}
" ..."]}
]}. ]}.

View File

@ -671,7 +671,7 @@ mod_doc() ->
{captcha_protected, {captcha_protected,
#{value => "true | false", #{value => "true | false",
desc => desc =>
?T("Protect registrations with http://../basic/#captcha[CAPTCHA]. " ?T("Protect registrations with _`basic.md#captcha|CAPTCHA`_. "
"The default is 'false'.")}}, "The default is 'false'.")}},
{ip_access, {ip_access,
#{value => ?T("AccessName"), #{value => ?T("AccessName"),

View File

@ -615,7 +615,7 @@ mod_doc() ->
?T("- Register a new account on the server."), "", ?T("- Register a new account on the server."), "",
?T("- Change the password from an existing account on the server."), "", ?T("- Change the password from an existing account on the server."), "",
?T("- Unregister an existing account on the server."), "", ?T("- Unregister an existing account on the server."), "",
?T("This module supports http://../basic/#captcha[CAPTCHA] " ?T("This module supports _`basic.md#captcha|CAPTCHA`_ "
"to register a new account. " "to register a new account. "
"To enable this feature, configure the " "To enable this feature, configure the "
"top-level _`captcha_cmd`_ and " "top-level _`captcha_cmd`_ and "
@ -625,7 +625,7 @@ mod_doc() ->
"important to include the last / character in the URL, " "important to include the last / character in the URL, "
"otherwise the subpages URL will be incorrect."), "", "otherwise the subpages URL will be incorrect."), "",
?T("This module is enabled in 'listen' -> 'ejabberd_http' -> " ?T("This module is enabled in 'listen' -> 'ejabberd_http' -> "
"http://../listen-options/#request-handlers[request_handlers], " "_`listen-options.md#request_handlers|request_handlers`_, "
"no need to enable in 'modules'."), "no need to enable in 'modules'."),
?T("The module depends on _`mod_register`_ where all the " ?T("The module depends on _`mod_register`_ where all the "
"configuration is performed.")], "configuration is performed.")],

View File

@ -1410,8 +1410,6 @@ mod_doc() ->
?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}], ?T("Same as top-level _`cache_life_time`_ option, but applied to this module only.")}}],
example => example =>
["modules:", ["modules:",
" ...",
" mod_roster:", " mod_roster:",
" versioning: true", " versioning: true",
" store_current_id: false", " store_current_id: false"]}.
" ..."]}.

View File

@ -93,14 +93,12 @@ mod_doc() ->
"is 'all'.")}}], "is 'all'.")}}],
example => example =>
["modules:", ["modules:",
" ...",
" mod_s2s_dialback:", " mod_s2s_dialback:",
" access:", " access:",
" allow:", " allow:",
" server: legacy.domain.tld", " server: legacy.domain.tld",
" server: invalid-cert.example.org", " server: invalid-cert.example.org",
" deny: all", " deny: all"]}.
" ..."]}.
s2s_in_features(Acc, _) -> s2s_in_features(Acc, _) ->
[#db_feature{errors = true}|Acc]. [#db_feature{errors = true}|Acc].

View File

@ -92,9 +92,7 @@ mod_doc() ->
"to which stanzas will be forwarded.")}}], "to which stanzas will be forwarded.")}}],
example => example =>
["modules:", ["modules:",
" ...",
" mod_service_log:", " mod_service_log:",
" loggers:", " loggers:",
" - xmpp-server.tld", " - xmpp-server.tld",
" - component.domain.tld", " - component.domain.tld"]}.
" ..."]}.

View File

@ -678,10 +678,10 @@ mod_doc() ->
?T("- Connection parameters: The module also accepts the " ?T("- Connection parameters: The module also accepts the "
"connection parameters, all of which default to the top-level " "connection parameters, all of which default to the top-level "
"parameter of the same name, if unspecified. " "parameter of the same name, if unspecified. "
"See http://../ldap/#ldap-connection[LDAP Connection] " "See _`ldap.md#ldap-connection|LDAP Connection`_ "
"section for more information about them."), "", "section for more information about them."), "",
?T("Check also the http://../ldap/#ldap-examples" ?T("Check also the _`ldap.md#ldap-examples|Configuration examples`_ "
"[Configuration examples] section to get details about " "section to get details about "
"retrieving the roster, " "retrieving the roster, "
"and configuration examples including Flat DIT and Deep DIT.")], "and configuration examples including Flat DIT and Deep DIT.")],
opts => opts =>
@ -710,13 +710,13 @@ mod_doc() ->
"name of roster entries (usually full names of people in " "name of roster entries (usually full names of people in "
"the roster). See also the parameters 'ldap_userdesc' and " "the roster). See also the parameters 'ldap_userdesc' and "
"'ldap_useruid'. For more information check the LDAP " "'ldap_useruid'. For more information check the LDAP "
"http://../ldap/#filters[Filters] section.")}}, "_`ldap.md#filters|Filters`_ section.")}},
{ldap_filter, {ldap_filter,
#{desc => #{desc =>
?T("Additional filter which is AND-ed together " ?T("Additional filter which is AND-ed together "
"with \"User Filter\" and \"Group Filter\". " "with \"User Filter\" and \"Group Filter\". "
"For more information check the LDAP " "For more information check the LDAP "
"http://../ldap/#filters[Filters] section.")}}, "_`ldap.md#filters|Filters`_ section.")}},
%% Attributes: %% Attributes:
{ldap_groupattr, {ldap_groupattr,
#{desc => #{desc =>
@ -774,8 +774,7 @@ mod_doc() ->
#{desc => #{desc =>
?T("A regex for extracting user ID from the value of the " ?T("A regex for extracting user ID from the value of the "
"attribute named by 'ldap_memberattr'. Check the LDAP " "attribute named by 'ldap_memberattr'. Check the LDAP "
"http://../ldap/#control-parameters" "_`ldap.md#control-parameters|Control Parameters`_ section.")}},
"[Control Parameters] section.")}},
{ldap_auth_check, {ldap_auth_check,
#{value => "true | false", #{value => "true | false",
desc => desc =>

View File

@ -383,7 +383,7 @@ mod_doc() ->
?T("NOTE: It is not enough to just load this module. " ?T("NOTE: It is not enough to just load this module. "
"You should also configure listeners and DNS records " "You should also configure listeners and DNS records "
"properly. For details see the section about the " "properly. For details see the section about the "
"http://../listen/#ejabberd-sip[ejabberd_sip] listen module " "_`listen.md#ejabberd_sip|ejabberd_sip`_ listen module "
"in the ejabberd Documentation.")], "in the ejabberd Documentation.")],
opts => opts =>
[{always_record_route, [{always_record_route,
@ -437,7 +437,6 @@ mod_doc() ->
"cannot omit \"port\" or \"scheme\").")}}], "cannot omit \"port\" or \"scheme\").")}}],
example => example =>
["modules:", ["modules:",
" ...",
" mod_sip:", " mod_sip:",
" always_record_route: false", " always_record_route: false",
" record_route: \"sip:example.com;lr\"", " record_route: \"sip:example.com;lr\"",
@ -449,7 +448,6 @@ mod_doc() ->
" via:", " via:",
" - tls://sip-tls.example.com:5061", " - tls://sip-tls.example.com:5061",
" - tcp://sip-tcp.example.com:5060", " - tcp://sip-tcp.example.com:5060",
" - udp://sip-udp.example.com:5060", " - udp://sip-udp.example.com:5060"]}.
" ..."]}.
-endif. -endif.

View File

@ -159,8 +159,8 @@ mod_doc() ->
?T("This module allows XMPP clients to discover STUN/TURN services " ?T("This module allows XMPP clients to discover STUN/TURN services "
"and to obtain temporary credentials for using them as per " "and to obtain temporary credentials for using them as per "
"https://xmpp.org/extensions/xep-0215.html" "https://xmpp.org/extensions/xep-0215.html"
"[XEP-0215: External Service Discovery]. " "[XEP-0215: External Service Discovery]."),
"This module is included in ejabberd since version 20.04."), note => "added in 20.04",
opts => opts =>
[{access, [{access,
#{value => ?T("AccessName"), #{value => ?T("AccessName"),

View File

@ -667,18 +667,21 @@ mod_doc() ->
"of vCard. Since the representation has no attributes, " "of vCard. Since the representation has no attributes, "
"the mapping is straightforward."), "the mapping is straightforward."),
example => example =>
[{?T("For example, the following XML representation of vCard:"), ["# This XML representation of vCard:",
["<vCard xmlns='vcard-temp'>", "# ",
" <FN>Conferences</FN>", "# <vCard xmlns='vcard-temp'>",
" <ADR>", "# <FN>Conferences</FN>",
" <WORK/>", "# <ADR>",
" <STREET>Elm Street</STREET>", "# <WORK/>",
" </ADR>", "# <STREET>Elm Street</STREET>",
"</vCard>"]}, "# </ADR>",
{?T("will be translated to:"), "# </vCard>",
["vcard:", "# ",
"# is translated to:",
"# ",
"vcard:",
" fn: Conferences", " fn: Conferences",
" adr:", " adr:",
" -", " -",
" work: true", " work: true",
" street: Elm Street"]}]}}]}. " street: Elm Street"]}}]}.

View File

@ -48,7 +48,7 @@ write_doap_head()
<download-page rdf:resource="https://www.process-one.net/en/ejabberd/downloads/"/> <download-page rdf:resource="https://www.process-one.net/en/ejabberd/downloads/"/>
<download-mirror rdf:resource="https://github.com/processone/ejabberd/tags"/> <download-mirror rdf:resource="https://github.com/processone/ejabberd/tags"/>
<license rdf:resource="https://raw.githubusercontent.com/processone/ejabberd/master/COPYING"/> <license rdf:resource="https://raw.githubusercontent.com/processone/ejabberd/master/COPYING"/>
<schema:logo rdf:resource="https://docs.ejabberd.im/static/shared/images/footer_logo_e@2x.png"/> <schema:logo rdf:resource="https://docs.ejabberd.im/assets/img/footer_logo_e@2x.png"/>
<bug-database rdf:resource="https://github.com/processone/ejabberd/issues"/> <bug-database rdf:resource="https://github.com/processone/ejabberd/issues"/>
<support-forum rdf:resource="xmpp:ejabberd@conference.process-one.net?join"/> <support-forum rdf:resource="xmpp:ejabberd@conference.process-one.net?join"/>
<repository> <repository>

View File

@ -67,7 +67,7 @@ rel_vsn=$(git describe --tags | sed -e 's/-g.*//' -e 's/-/./' | tr -d '[:space:]
home_url='https://www.ejabberd.im' home_url='https://www.ejabberd.im'
doc_url='https://docs.ejabberd.im' doc_url='https://docs.ejabberd.im'
upgrade_url="$doc_url/admin/upgrade/#specific-version-upgrade-notes" upgrade_url="$doc_url/admin/upgrade/#specific-version-upgrade-notes"
admin_url="$doc_url/admin/installation/#administration-account" admin_url="$doc_url/admin/install/next-steps/#administration-account"
default_code_dir="/opt/$rel_name-$rel_vsn" default_code_dir="/opt/$rel_name-$rel_vsn"
default_data_dir="/opt/$rel_name" default_data_dir="/opt/$rel_name"
tmp_dir=$(mktemp -d "/tmp/.$rel_name.XXXXXX") tmp_dir=$(mktemp -d "/tmp/.$rel_name.XXXXXX")