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
Core:
#### Core:
- Added Matrix gateway in `mod_matrix_gw`
- Support SASL2 and Bind2
- 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
- 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: Set EJABBERD_OPTS back to `""`, and use previous flags as example
- 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: Only care about PEP bookmarks options when creating node from scratch
SQL:
#### SQL:
- MySQL: Support `sha256_password` auth plugin
- ejabberd_sql_schema: Use the first unique index as a primary key
- 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`
Installers and Container:
#### Installers and Container:
- 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 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 many dependency versions
Commands API:
#### Commands API:
- `print_sql_schema`: New command available in ejabberdctl command-line script
- ejabberdctl: Rework temporary node name generation
- ejabberdctl: Print argument description, examples and note in help
@ -51,7 +56,7 @@ Commands API:
- ejabberd_xmlrpc: Fix support for restuple error response
- 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'
- 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`
@ -82,7 +87,8 @@ Compilation with Rebar3/Elixir/Mix:
## Version 23.10
Compilation:
#### Compilation:
- Erlang/OTP: Raise the requirement to Erlang/OTP 20.0 as a minimum
- CI: Update tests to Erlang/OTP 26 and recent Elixir
- 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`
- `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))
- `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))
@ -105,7 +112,8 @@ Commands:
- `ejabberdctl`: Support `policy=user` in the help and return proper arguments
- `ejabberdctl`: Document how to stop a debug shell: control+g
Container:
#### Container:
- Dockerfile: Add missing dependency for mssql databases
- Dockerfile: Reorder stages and steps for consistency
- Dockerfile: Use Alpine as base for `METHOD=package`
@ -113,7 +121,8 @@ Container:
- Dockerfile: Provide specific OTP and elixir vsn for direct compilation
- 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))
- `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
@ -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: 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
- Make sure that `policy=user` commands have `host` instead of `server` arg in docs
- Improve syntax of many command descriptions for the 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
Installers (`make-binaries`):
#### Installers (`make-binaries`):
- Bump Erlang/OTP version to 26.1.1, and other dependencies
- Remove outdated workaround
- Don't build Linux-PAM examples
@ -147,7 +157,8 @@ Installers (`make-binaries`):
- Set kernel version for all builds
- Let curl fail on HTTP errors
Modules:
#### Modules:
- `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_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_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))
- 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))
@ -178,7 +190,8 @@ MUC:
- 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
SQL:
#### SQL:
- Add ability to force alternative upsert implementation in mysql
- Properly parse mysql version even if it doesn't have type tag
- Use prepared statement with mysql
@ -190,7 +203,8 @@ SQL:
## Version 23.04
General:
#### General:
- New `s2s_out_bounce_packet` hook
- Re-allow anonymous connection for connection without client certificates ([#3985](https://github.com/processone/ejabberd/issues/3985))
- 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_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
- Improve output in `gen_html_doc_for_commands` command
- Fix ejabberdctl output formatting ([#3979](https://github.com/processone/ejabberd/issues/3979))
- Log HTTP handler exceptions
MUC:
#### MUC:
- New command `get_room_history`
- Persist `none` role for outcasts
- Try to populate room history from mam when unhibernating
@ -218,7 +234,8 @@ MUC:
- Store state in db in `mod_muc:create_room()`
- Make subscribers members by default
SQL schemas:
#### SQL schemas:
- Fix a long standing bug in new schema migration
- `update_sql` command: Many improvements in new schema migration
- `update_sql` command: Add support to migrate MySQL too
@ -227,14 +244,16 @@ SQL schemas:
- Remove unnecessary indexes
- New SQL schema migrate fix
MS SQL:
#### MS SQL:
- MS SQL schema fixes
- Add `new` schema for MS SQL
- Add MS SQL support for new schema migration
- Minor MS SQL improvements
- Fix MS SQL error caused by `ORDER BY` in subquery
SQL Tests:
#### SQL Tests:
- Add support for running tests on MS SQL
- Add ability to run tests on upgraded DB
- Un-deprecate `ejabberd_config:set_option/2`
@ -242,7 +261,8 @@ SQL Tests:
- Correct README for creating test docker MS SQL DB
- Fix TSQLlint warnings in MSSQL test script
Testing:
#### Testing:
- Fix Shellcheck warnings in shell scripts
- Fix Remark-lint warnings
- 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)
- 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
- Add `tini` as runtime init
- Set `ERLANG_NODE` fixed to `ejabberd@localhost`
- Upload images as artifacts to Github Actions
- 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
- Add `METHOD` to build container using packages ([#3983](https://github.com/processone/ejabberd/issues/3983))
- Add `tini` as runtime init
@ -267,14 +287,16 @@ Testing:
- Expose only `HOME` volume, it contains all the required subdirs
- 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: Fix building with erlang/otp v25.x
- make-packages: Fix for installers workflow, which didn't find lynx
## Version 23.01
General:
#### General:
- Add `misc:uri_parse/2` to allow declaring default ports for protocols
- 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))
@ -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))
- Translations: Update German translation
Admin:
#### Admin:
- `api_permissions`: Fix option crash when doesn't have `who:` section
- `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
@ -305,13 +328,15 @@ Admin:
- Silent warning in OTP24 about not specified `cacerts` in SQL connections
- Fix compilation warnings with Elixir 1.14
DOAP:
#### DOAP:
- Support extended `-protocol` erlang attribute
- 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))
- `ejabberd.doap`: New DOAP file describing ejabberd supported protocols
MQTT:
#### MQTT:
- Add MQTT bridge module
- Add support for certificate authentication in MQTT bridge
- Implement reload in MQTT bridge
@ -320,7 +345,8 @@ MQTT:
- `mqtt_publish`: New hook for MQTT publish event
- `mqtt_(un)subscribe`: New hooks for MQTT subscribe & unsubscribe events
VSCode:
#### VSCode:
- Improve `.devcontainer` to use use devcontainer image and `.vscode`
- Add `.vscode` files to instruct VSCode how to run ejabberd
- Add Erlang LS default configuration
@ -328,7 +354,8 @@ VSCode:
## Version 22.10
Core:
#### Core:
- Add `log_burst_limit_*` options ([#3865](https://github.com/processone/ejabberd/issues/3865))
- 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))
@ -346,7 +373,8 @@ Core:
- `mod_shared_roster_ldap`: Update roster_get hook to use `#roster_item{}`
- `prosody2ejabberd`: Fix parsing of scram password from prosody
MIX:
#### MIX:
- Fix MIX's filter_nodes
- Return user jid on join
- `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_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))
- Don't persist `none` role ([#3330](https://github.com/processone/ejabberd/issues/3330))
- Allow MUC service admins to bypass max_user_conferences limitation
@ -374,7 +403,8 @@ MUC:
- Export `mod_muc_admin:get_room_pid/2`
- Export function for getting room diagnostics
SQL:
#### SQL:
- Handle errors reported from begin/commit inside transaction
- Make connection close errors bubble up from inside sql transaction
- Make first sql reconnect wait shorter time
@ -386,7 +416,8 @@ SQL:
- Update mysql library
- 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 clean`: Improve this and "distclean"
- `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 header files which content is already in xmpp library
Container:
#### Container:
- Get ejabberd-contrib sources to include them
- Copy `.ejabberd-modules` directory if available
- 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))
- Fix build instructions, add more podman examples
Installers:
#### Installers:
- make-binaries: Include CAPTCHA script with release
- make-binaries: Edit rebar.config more carefully
- make-binaries: Fix linking of EIMP dependencies
@ -423,14 +456,16 @@ Installers:
- make-installers: Override code on upgrade
- make-installers: Apply cosmetic changes
External modules:
#### External modules:
- ext_mod: Support managing remote nodes in the cluster
- ext_mod: Handle correctly when COMMIT.json not found
- Don't bother with COMMIT.json user-friendly feature in automated user case
- Handle not found COMMIT.json, for example in GH Actions
- Add WebAdmin page for managing external modules
Workflows Actions:
#### Workflows Actions:
- Update workflows to Erlang 25
- Update workflows: Ubuntu 18 is deprecated and 22 is added
- CI: Remove syntax_tools from applications, as fast_xml fails Dialyzer
@ -438,42 +473,42 @@ Workflows Actions:
## Version 22.05
Core
#### Core
- C2S: Don't expect that socket will be available in `c2s_terminated` hook
- Event handling process hook tracing
- Guard against `erlang:system_info(logical_processors)` not always returning a number
- `domain_balancing`: Allow for specifying `type` only, without specifying `component_number`
MQTT
#### MQTT
- Add TLS certificate authentication for MQTT connections
- Fix login when generating client id, keep connection record (#3593)
- Pass property name as expected in mqtt_codec (fixes login using MQTT 5)
- Support MQTT subscriptions spread over the cluster (#3750)
MUC
#### MUC
- Attach meta field with real jid to mucsub subscription events
- Handle user removal
- Stop empty MUC rooms 30 seconds after creation
- `default_room_options`: Update options configurable
- `subscribe_room_many_max_users`: New option in `mod_muc_admin`
mod_conversejs
#### mod_conversejs
- Improved options to support `@HOST@` and `auto` values
- Set `auth` and `register` options based on ejabberd configuration
- `conversejs_options`: New option
- `conversejs_resources`: New option
PubSub
#### PubSub
- `mod_pubsub`: Allow for limiting `item_expire` value
- `mod_pubsub`: Unsubscribe JID on whitelist removal
- `node_pep`: Add config-node and multi-items features (#3714)
SQL
#### SQL
- Improve compatibility with various db engine versions
- Sync old-to-new schema script with reality (#3790)
- 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)
- `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
@ -486,7 +521,7 @@ Other Modules
- `mod_shared_roster`: Normalize JID on unset_presence (#3752)
- `mod_stun_disco`: Fix parsing of IPv6 listeners
Dependencies
#### Dependencies
- autoconf: Supported from 2.59 to the new 2.71
- fast_tls: Update to 1.1.14 to support OpenSSL 3
- 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
- `make update`: Fix when used with rebar 3.18
Compile
#### Compile
- `mix release`: Copy `include/` files for ejabberd, deps and otp, in `mix.exs`
- `rebar3 release`: Fix ERTS path in `ejabberdctl`
- `configure.ac`: Set default ejabberd version number when not using git
@ -505,7 +540,7 @@ Compile
- `tools/make-binaries`: New script for building Linux binaries
- `tools/make-installers`: New script for building command line installers
Start
#### Start
- New `make relive` similar to `ejabberdctl live` without installing
- `ejabberdctl`: Fix some warnings detected by ShellCheck
- `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`
- `tools/captcha.sh`: Fix some warnings detected by ShellCheck
Commands
#### Commands
- Accept more types of ejabberdctl commands arguments as JSON-encoded
- `delete_old_mam_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)
- `subscribe_room_many`: New command
Translations
#### Translations
- Updated Catalan
- Updated French
- Updated German
@ -533,7 +568,7 @@ Translations
- Updated Portuguese (Brazil)
- Updated Spanish
Workflows
#### Workflows
- CI: Publish CT logs and Cover on failure to an external GH Pages repo
- CI: Test shell scripts using ShellCheck (#3738)
- Container: New workflow to build and publish containers
@ -543,12 +578,12 @@ Workflows
## Version 21.12
Commands
#### Commands
- `create_room_with_opts`: Fixed when using SQL storage
- `change_room_option`: Add missing fields from config inside `mod_muc_admin:change_options`
- piefxis: Fixed arguments of all commands
Modules
#### Modules
- mod_caps: Don't forget caps on XEP-0198 resumption
- mod_conversejs: New module to serve a simple page for Converse.js
- mod_http_upload_quota: Avoid `max_days` race
@ -563,7 +598,7 @@ Modules
- mod_register_web: Handle unknown host gracefully
- mod_register_web: Use mod_register configured restrictions
PubSub
#### PubSub
- Add `delete_expired_pubsub_items` command
- Add `delete_old_pubsub_items` command
- Optimize publishing on large nodes (SQL)
@ -574,7 +609,7 @@ PubSub
- node_flat: 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
- mod_mam export: assign MUC entries to the MUC service
- MySQL: Fix typo when creating index
@ -582,7 +617,7 @@ SQL
- PgSQL: Add missing SQL migration for table `push_session`
- 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
- Make s2s connection table cleanup more robust
- Update export/import of scram password to XEP-0227 1.1
@ -590,7 +625,7 @@ Other
## Version 21.07
Compilation
#### Compilation
- Add rebar3 3.15.2 binary
- Add support for mix to: `./configure --enable-rebar=mix`
- Improved `make rel` to work with rebar3 and mix
@ -602,14 +637,16 @@ Compilation
- Added experimental support for GitHub Codespaces
- Switch test service from TravisCI to GitHub Actions
Commands:
#### Commands:
- Display extended error message in ejabberdctl
- Remove SMP option from ejabberdctl.cfg, `-smp` was removed in OTP 21
- `create_room`: After creating room, store in DB if it's persistent
- `help`: Major changes in its usage and output
- `srg_create`: Update to use `label` parameter instead of `name`
Modules:
#### Modules:
- ejabberd_listener: New `send_timeout` option
- mod_mix: Improvements to update to 0.14.1
- mod_muc_room: Don't leak owner JIDs
@ -626,7 +663,8 @@ Modules:
- WebAdmin: New simple pages to view mnesia tables information and content
- WebSocket: Fix typos
SQL:
#### SQL:
- MySQL Backend Patch for scram-sha512
- SQLite: When exporting for SQLite, use its specific escape options
- SQLite: Minor fixes for new_sql_schema support
@ -636,14 +674,16 @@ SQL:
## Version 21.04
API Commands:
#### API Commands:
- `add_rosteritem/...`: Add argument guards to roster commands
- `get_user_subscriptions`: New command for MUC/Sub
- `remove_mam_for_user_with_peer`: Fix when removing room archive
- `send_message`: Fix bug introduced in ejabberd 21.01
- `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
- CAPTCHA: New question/answer-based CAPTCHA script
- `--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
- Updated dependencies to fix Dialyzer warnings
Miscellaneous:
#### Miscellaneous:
- CAPTCHA: Update `FORM_TYPE` from captcha to register
- LDAP: fix eldap certificate verification
- MySQL: Fix for "specified key was too long"
- Translations: updated the Esperanto, Greek, and Japanese translations
- Websocket: Fix PONG responses
Modules:
#### Modules:
- `mod_block_strangers`: If stanza is type error, allow it passing
- `mod_caps`: Don't request roster when not needed
- `mod_caps`: Skip reading roster in one more case
@ -674,7 +716,8 @@ Modules:
## Version 21.01
Miscellaneous changes:
#### Miscellaneous changes:
- `log_rotate_size` option: Fix handling of infinity value
- `mod_time`: Fix invalid timezone
- Auth JWT: New `check_decoded_jwt` hook runs the default JWT verifier
@ -689,7 +732,8 @@ Miscellaneous changes:
- Stun: Block loopback addresses by default
- Several documentation fixes and clarifications
Commands:
#### Commands:
- `decide_room`: Use better fallback value for room activity time when skipping room
- `delete_old_message`: Fix when using sqlite spool table
- `module_install`: Make ext_mod compile module with debug_info flags
@ -697,13 +741,15 @@ Commands:
- `send_message`: Dont include empty in messages
- `set_room_affiliation`: Validate affiliations
Running:
#### Running:
- Docker: New `Dockerfile` and `devcontainer.json`
- New `ejabberdctl foreground-quiet`
- Systemd: Allow for listening on privileged ports
- Systemd: Integrate nicely with systemd
Translations:
#### Translations:
- Moved gettext PO files to a new `ejabberd-po` repository
- 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
- check_decoded_jwt: new hook to check decoded JWT after success authentication
* Admin
#### Admin
- Docker: Fix DB initialization
- New sql_odbc_driver option: choose the mssql ODBC driver
- Rebar3: Fully supported. Enable with `./configure --with-rebar=/path/to/rebar3`
- systemd: start ejabberd in foreground
* Modules:
#### Modules:
- MAM: Make sure that jid used as base in mam xml_compress is bare
- MAM: Support for MAM Flipped Pages
- MUC: Always show MucSub subscribers nicks
@ -744,7 +790,7 @@ Translations:
## Version 20.07
* Changes in this version
#### Changes in this version
- Add support for using unix sockets in listeners.
- Make this version compatible with erlang R23
- Make room permissions checks more strict for subscribers
@ -771,7 +817,7 @@ Translations:
## Version 20.03
* Changes in this version
#### Changes in this version
- Add support of ssl connection when connection to mysql
database (configured with `sql_ssl: true` option)
- Experimental support for cockroachdb when configured
@ -791,7 +837,7 @@ Translations:
## Version 20.02
* Changes in this version
#### Changes in this version
- Fix problems when trying to use string format with unicode
values directly in xmpp nodes
- Add missing oauth_client table declaration in lite.new.sql
@ -809,7 +855,7 @@ Translations:
## Version 20.01
* New features
#### New features
- Implement OAUTH authentication in mqtt
- Make logging infrastructure use new logger introduced
in Erlang (requires OTP22)
@ -824,7 +870,7 @@ Translations:
- Generate man page automatically
- Implement copy feature in mod_carboncopy
* Fixes
#### Fixes
- Make webadmin work with configurable paths
- Fix handling of result in xmlrpc module
- Make webadmin work even when accessed through not declared domain
@ -842,18 +888,18 @@ Translations:
## Version 19.09
* Admin
#### Admin
- The minimum required Erlang/OTP version is now 19.3
- Fix API call using OAuth (#2982)
- Rename MUC command arguments from Host to Service (#2976)
* Webadmin
#### Webadmin
- Don't treat 'Host' header as a virtual XMPP host (#2989)
- Fix some links to Guide in WebAdmin and add new ones (#3003)
- Use select fields to input host in WebAdmin Backup (#3000)
- Check account auth provided in WebAdmin is a local host (#3000)
* ACME
#### ACME
- Improve ACME implementation
- Fix IDA support in ACME requests
- Fix unicode formatting in ACME module
@ -864,10 +910,10 @@ Translations:
- Don't auto request certificate for localhost and IP-like domains
- Add listener for ACME challenge in example config
* Authentication
#### Authentication
- JWT-only authentication for some users (#3012)
* MUC
#### MUC
- Apply default role after revoking admin affiliation (#3023)
- Custom exit message is not broadcast (#3004)
- 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)
- Rename MUC command arguments from Host to Service (#2976)
* SQL
#### SQL
- Fix transactions for Microsoft SQL Server (#2978)
- Spawn SQL connections on demand only
* Misc
#### Misc
- Add support for XEP-0328: JID Prep
- Added gsfonts for captcha
- Log Mnesia table type on creation
@ -895,12 +941,12 @@ Translations:
## Version 19.08
* Administration
#### Administration
- Improve ejabberd halting procedure
- Process unexpected erlang messages uniformly: logging a warning
- mod_configure: Remove modules management
* Configuration
#### Configuration
- Use new configuration validator
- ejabberd_http: Use correct virtual host when consulting trusted_proxies
- Fix Elixir modules detection in the configuration file
@ -910,7 +956,7 @@ Translations:
- mod_stream_mgmt: Allow flexible timeout format
- mod_mqtt: Allow flexible timeout format in session_expiry option
* Misc
#### Misc
- Fix SQL connections leakage
- New authentication method using JWT tokens
- extauth: Add 'certauth' command
@ -925,14 +971,14 @@ Translations:
- mod_privacy: Don't attempt to query 'undefined' active list
- mod_privacy: Fix race condition
* MUC
#### MUC
- Add code for hibernating inactive muc_room processes
- Improve handling of unexpected iq in mod_muc_room
- Attach mod_muc_room processes to a supervisor
- Restore room when receiving message or generic iq for not started room
- Distribute routing of MUC messages across all CPU cores
* PubSub
#### PubSub
- Fix pending nodes retrieval for SQL backend
- Check access_model when publishing PEP
- Remove deprecated pubsub plugins
@ -940,7 +986,7 @@ Translations:
## Version 19.05
* Admin
#### Admin
- The minimum required Erlang/OTP version is now 19.1
- 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
@ -951,19 +997,19 @@ Translations:
- Improve request_handlers validator
- Fix syntax in example Elixir config file
* Auth
#### Auth
- Correctly support cache tags in ejabberd_auth
- Don't process failed EXTERNAL authentication by mod_fail2ban
- Don't call to mod_register when it's not loaded
- Make anonymous auth don't {de}register user when there are other resources
* Developer
#### Developer
- Rename listening callback from start/2 to start/3
- New hook called when room gets destroyed: room_destroyed
- New hooks for tracking mucsub subscriptions changes: muc_subscribed, muc_unsubscribed
- Make static hooks analyzer working again
* MUC
#### MUC
- Service admins are allowed to recreate room even if archive is nonempty
- New option user_mucsub_from_muc_archive
- Avoid late arrival of get_disco_item response
@ -972,7 +1018,7 @@ Translations:
- Make get_subscribed_rooms work even for non-persistant rooms
- 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 use_mam_for_storage: fetch data from mam instead of spool table
- 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
- Make mod_offline put msg ignored by mam in spool when mam storage is on
* SQL:
#### SQL:
- Add SQL schemas for MQTT tables
- Report better errors on SQL terms decode failure
- Fix PostgreSQL compatibility in mod_offline_sql:remove_old_messages
- Fix handling of list arguments on pgsql
- Preliminary support for SQL in process_rosteritems command
* Tests
#### Tests
- Add tests for user mucsub mam from muc mam
- Add tests for offline with mam storage
- Add tests for offline use_mam_for_storage
- Initial Docker environment to run ejabberd test suite
- Test offline:use_mam_for_storage, mam:user_mucsub_from_muc_archive used together
* Websocket
#### Websocket
- Add WebSockets support to mod_mqtt
- Return "Bad request" error when origin in websocket connection doesn't match
- Fix RFC6454 violation on websocket connection when validating Origin header
- 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_announce: Add 'sessionid' attribute when required
- mod_bosh: Don't put duplicate polling attribute in bosh payload
@ -1017,14 +1063,14 @@ Translations:
## Version 19.02
* Admin
#### Admin
- 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 is not configured
- rooms_empty_destroy command: Several fixes to behave more conservative
- Fix serverhost->host parameter name for muc_(un)register_nick API
* Configuration
#### Configuration
- Allow specifying tag for listener for api_permission purposes
- Change default ciphers to intermediate
- 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_offline: New option store_groupchat to allow storing group chat messages
* Core
#### Core
- Add MQTT protocol support
- Fix (un)setting of priority
- Use OTP application startup infrastructure for starting dependencies
- Improve starting order of several dependencies
* MAM
#### MAM
- mod_mam_mnesia/sql: Improve check for empty archive
- 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
- Additional checks for database failures
* MUC
#### MUC
- 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
- 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
- Handle versioning result when shared roster group has remote account
- Fix SQL queries
* Miscelanea
#### Miscelanea
- CAPTCHA: Add no-store hint to CAPTCHA challenge stanzas
- HTTP: Reject http_api request with malformed Authentication header
- mod_carboncopy: Don't lose carbons on presence change or session resumption
@ -1071,7 +1117,7 @@ Translations:
## Version 18.12
* MAM data store compression
* Proxy protocol support
* MUC Self-Ping optimization (XEP-0410)
* Bookmarks conversion (XEP-0411)
- MAM data store compression
- Proxy protocol support
- MUC Self-Ping optimization (XEP-0410)
- Bookmarks conversion (XEP-0411)

View File

@ -7,7 +7,7 @@ from source code.
For a more detailed explanation, please check the
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

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).
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
@ -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
[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
@ -249,7 +249,7 @@ For this you can either:
Example to connect a local `ejabberdctl` to a containerized ejabberd:
1. When creating the container, export port 5210, and set `ERLANG_COOKIE`:
```
```sh
docker run --name ejabberd -it \
-e ERLANG_COOKIE=`cat $HOME/.erlang.cookie` \
-p 5210:5210 -p 5222:5222 \
@ -260,7 +260,7 @@ docker run --name ejabberd -it \
4. Now use `ejabberdctl` in your local ejabberd deployment
To connect using a local `ejabberd` script:
```
```sh
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/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

View File

@ -109,14 +109,14 @@ and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MI
[erlang]: https://www.erlang.org/
[features]: https://docs.ejabberd.im/admin/introduction/
[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/
[im]: https://ejabberd.im/
[issues]: https://github.com/processone/ejabberd/issues
[localization]: https://docs.ejabberd.im/developer/extending-ejabberd/localization/
[mqtt]: https://mqtt.org/
[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/
[p1download]: https://www.process-one.net/en/ejabberd/downloads/
[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"],
maintainers: ["ProcessOne"],
licenses: ["GPL-2.0-or-later"],
links: %{"Site" => "https://www.ejabberd.im",
"Documentation" => "http://docs.ejabberd.im",
"Source" => "https://github.com/processone/ejabberd",
links: %{"ejabberd.im" => "https://www.ejabberd.im",
"ejabberd Docs" => "http://docs.ejabberd.im",
"GitHub" => "https://github.com/processone/ejabberd",
"ProcessOne" => "http://www.process-one.net/"}]
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"},
"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"},
"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_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"},

View File

@ -131,7 +131,7 @@ get_commands_spec() ->
"only on log files generated by some modules.\n"
"This can be useful when an external tool is "
"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,
module = ?MODULE, function = reopen_log,
args = [], result = {res, rescode}},

View File

@ -87,7 +87,7 @@ md_tag(h2, V) ->
md_tag(strong, V) ->
[<<"*">>, V, <<"*">>];
md_tag('div', V) ->
[<<"<div class='note-down'>">>, V, <<"</div>">>];
[<<"*Note* about this command: ">>, V, <<".">>];
md_tag(_, 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("]")].
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
{{_, rescode}, V} when V == true; V == ok ->
{200, [?STR_L("")]};
@ -364,7 +364,7 @@ make_tags(HTMLOutput) ->
-dialyzer({no_match, gen_tags/2}).
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,
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)])]
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
unknown -> false;
_ -> lists:member(gen_mod, proplists:get_value(behaviour, Definer:module_info(attributes)))
end,
ModuleText = case IsDefinerMod of
true ->
[?TAG(h2, <<"Module:">>), ?TAG(p, ?RAW("*`"++atom_to_list(Definer)++"`*"))];
[?TAG(h2, <<"Module:">>), ?TAG(p, ?RAW("_`"++atom_to_list(Definer)++"`_"))];
false ->
[]
end,
@ -415,8 +415,8 @@ gen_doc(#ejabberd_commands{name=Name, tags=Tags, desc=Desc, longdesc=LongDesc,
true -> {NoteEl, []}
end,
[NotePre,
?TAG(h1, atom_to_list(Name)),
[?TAG(h1, make_command_name(Name, Note)),
NotePre,
?TAG(p, ?RAW(Desc)),
case LongDesc of
"" -> [];
@ -435,6 +435,19 @@ gen_doc(#ejabberd_commands{name=Name, tags=Tags, desc=Desc, longdesc=LongDesc,
[Name, Ex])))
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() ->
lists:flatmap(
fun(Mod) ->
@ -492,21 +505,22 @@ generate_md_output(File, RegExp, Languages, Cmds) ->
end, Cmds2),
Cmds4 = [maybe_add_policy_arguments(Cmd) || Cmd <- Cmds3],
Langs = binary:split(Languages, <<",">>, [global]),
Header = <<"---\ntitle: Administration API reference\ntoc: true\nmenu: API Reference\norder: 1\n"
"// Autogenerated with 'ejabberdctl gen_markdown_doc_for_commands'\n---\n\n"
"This section describes API of ejabberd.\n">>,
Version = binary_to_list(ejabberd_config:version()),
Header = ["# API Reference\n\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),
{ok, Fh} = file:open(File, [write]),
{ok, Fh} = file:open(File, [write, {encoding, utf8}]),
io:format(Fh, "~ts~ts", [Header, Out]),
file:close(Fh),
ok.
generate_tags_md(File) ->
Header = <<"---\ntitle: API Tags\ntoc: true\nmenu: API Tags\norder: 2\n"
"// Autogenerated with 'ejabberdctl gen_markdown_doc_for_tags'\n---\n\n"
"This section enumerates the tags and their associated API.\n">>,
Version = binary_to_list(ejabberd_config:version()),
Header = ["# API Tags\n\n"
"This section enumerates the API tags of ejabberd ", Version, ". \n\n"],
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]),
file:close(Fh),
ok.

View File

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

View File

@ -81,7 +81,7 @@
get_commands_spec() ->
[
#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,
args = [{jid, string},{ttl, integer}, {scopes, string}],
policy = restricted,
@ -92,7 +92,7 @@ get_commands_spec() ->
result = {result, {tuple, [{token, string}, {scopes, string}, {expires_in, string}]}}
},
#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,
version = 1,
note = "updated in 24.02",
@ -105,7 +105,7 @@ get_commands_spec() ->
result = {result, {tuple, [{token, string}, {scopes, {list, {scope, string}}}, {expires_in, string}]}}
},
#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",
module = ?MODULE, function = oauth_list_tokens,
args = [],
@ -113,7 +113,7 @@ get_commands_spec() ->
result = {tokens, {list, {token, {tuple, [{token, string}, {user, string}, {scope, string}, {expires_in, string}]}}}}
},
#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",
module = ?MODULE, function = oauth_revoke_token,
args = [{token, binary}],
@ -122,7 +122,7 @@ get_commands_spec() ->
result_desc = "Result code"
},
#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,
args = [{client_id, binary},
{client_name, binary},
@ -131,7 +131,7 @@ get_commands_spec() ->
result = {res, restuple}
},
#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,
args = [{client_id, binary},
{client_name, binary},
@ -140,7 +140,7 @@ get_commands_spec() ->
result = {res, restuple}
},
#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,
args = [{client_id, binary}],
policy = restricted,

View File

@ -37,13 +37,13 @@ doc() ->
#{value => "[Options, ...]",
desc =>
?T("The option for listeners configuration. See the "
"http://../listen/[Listen Modules] section "
"_`listen.md|Listen Modules`_ section "
"for details.")}},
{modules,
#{value => "{Module: Options}",
desc =>
?T("The option for modules configuration. See "
"http://../modules/[Modules] section "
"_`modules.md|Modules`_ section "
"for details.")}},
{loglevel,
#{value =>
@ -221,7 +221,7 @@ doc() ->
#{value => "{AccessName: {allow|deny: ACLRules|ACLName}}",
desc =>
?T("This option defines "
"http://../basic/#access-rules[Access Rules]. "
"_`basic.md#access-rules|Access Rules`_. "
"Each access rule is "
"assigned a name that can be referenced from other parts "
"of the configuration file (mostly from 'access' options of "
@ -255,7 +255,7 @@ doc() ->
{acme,
#{value => ?T("Options"),
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, "
"which means that certificate requests and renewals are "
"performed to some CA server (aka \"ACME server\") in a fully "
@ -303,8 +303,8 @@ doc() ->
#{value => "true | false",
desc =>
?T("Whether to allow installation of third-party modules or not. "
"See https://docs.ejabberd.im/developer/extending-ejabberd/modules/#ejabberd-contrib"
"[ejabberd-contrib] documentation section. "
"See _`../../developer/extending-ejabberd/modules.md#ejabberd-contrib|ejabberd-contrib`_ "
"documentation section. "
"The default value is 'true'.")}},
{allow_multiple_connections,
#{value => "true | false",
@ -328,8 +328,7 @@ doc() ->
desc =>
?T("Define the permissions for API access. Please consult the "
"ejabberd Docs web -> For Developers -> ejabberd ReST API -> "
"https://docs.ejabberd.im/developer/ejabberd-api/permissions/"
"[API Permissions].")}},
"_`../../developer/ejabberd-api/permissions.md|API Permissions`_.")}},
{append_host_config,
#{value => "{Host: Options}",
desc =>
@ -373,7 +372,7 @@ doc() ->
note => "improved in 20.01",
desc =>
[?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 "
"in the database. This is risky because the passwords "
"can be read if your database gets compromised. "
@ -392,7 +391,7 @@ doc() ->
{auth_scram_hash,
#{value => "sha | sha256 | sha512",
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 "
"a different algorithm - users that have such passwords will not be able "
"to authenticate. The default value is 'sha'.")}},
@ -418,7 +417,7 @@ doc() ->
"corresponding JID(s) in 'subjectAltName' field. "
"There is no default value."), "",
?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,
#{value => "[Cipher, ...]",
@ -468,7 +467,7 @@ doc() ->
#{value => ?T("Path | ModuleName"),
note => "improved in 23.01",
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. "
"'@SEMVER@' is replaced with ejabberd version number in semver format "
"when compiled with Elixir's mix, or XX.YY format otherwise. "
@ -481,7 +480,7 @@ doc() ->
{captcha_limit,
#{value => "pos_integer() | infinity",
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 "
"from CAPTCHA DoS. The default value is 'infinity'.")}},
{captcha_host,
@ -491,7 +490,7 @@ doc() ->
#{value => ?T("URL | auto | undefined"),
note => "improved in 23.04",
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 "
"as well. "
"If set to 'auto', it builds the URL using a 'request_handler' "
@ -696,8 +695,8 @@ doc() ->
note => "added in 23.10",
desc =>
?T("Modules to install from "
"https://docs.ejabberd.im/developer/extending-ejabberd/modules/#ejabberd-contrib"
"[ejabberd-contrib] at start time. "
"_`../../developer/extending-ejabberd/modules.md#ejabberd-contrib|ejabberd-contrib`_ "
"at start time. "
"The default value is an empty list of modules: '[]'.")}},
{jwt_auth_only_rule,
#{value => ?T("AccessName"),
@ -1156,7 +1155,7 @@ doc() ->
{s2s_access,
#{value => ?T("Access"),
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. "
"The default value is 'all'; no restrictions are applied, it is"
" 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. "
"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 "
"encouraged to define ejabberd_xmlrpc inside request_handlers "
"option of ejabberd_http listen module. See the ejabberd "
"documentation for details: https://docs.ejabberd.im/admin/"
"configuration/listen/#ejabberd-xmlrpc", []),
"documentation for details: _`/admin/configuration/listen/#ejabberd-xmlrpc|ejabberd_xmlrpc listener`_.", []),
[].

View File

@ -74,6 +74,7 @@
-callback mod_opt_type(atom()) -> econf:validator().
-callback mod_options(binary()) -> [{atom(), term()} | atom()].
-callback mod_doc() -> #{desc => binary() | [binary()],
note => string(),
opts => [opt_doc()],
example => [string()] | [{binary(), [string()]}]}.
-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],
desc = "Delete users that didn't log in last days, or that never logged",
longdesc = "To protect admin accounts, configure this for example:\n"
"```\n"
"``` yaml\n"
"access_rules:\n"
" protect_old_users:\n"
" - allow: admin\n"
@ -186,7 +186,7 @@ get_commands_spec() ->
#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",
longdesc = "To protect admin accounts, configure this for example:\n"
"```\n"
"``` yaml\n"
"access_rules:\n"
" delete_old_users:\n"
" - deny: admin\n"

View File

@ -632,6 +632,6 @@ mod_doc() ->
#{desc =>
?T("This module can be used to update existing SQL database "
"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. "
"When the module is loaded use _`update_sql`_ API.")}.

View File

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

View File

@ -252,17 +252,16 @@ mod_doc() ->
#{desc =>
[?T("This module serves a simple page for the "
"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' "
"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' "
"http://../listen-options/#request-handlers[request_handlers] "
"_`listen-options.md#request_handlers|request_handlers`_ "
"are enabled."), "",
?T("When 'conversejs_css' and 'conversejs_script' are 'auto', "
"by default they point to the public Converse client.")
],
note => "added in 21.12 and improved in 22.05",
example =>
[{?T("Manually setup WebSocket url, and use the public Converse client:"),
["listen:",

View File

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

View File

@ -211,11 +211,11 @@ mod_doc() ->
[?T("This module serves small 'host-meta' files as described in "
"https://xmpp.org/extensions/xep-0156.html[XEP-0156: Discovering "
"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' "
"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.")],
note => "added in 22.05",
example =>
["listen:",
" -",

View File

@ -534,11 +534,11 @@ mod_options(_) ->
mod_doc() ->
#{desc =>
[?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."), "",
?T("To use this module, in addition to adding it to the 'modules' "
"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 "
"in the request_handlers, add a 'vN'. "
"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' "
"definition is deleted:"),
["listen:",
" ...",
" -",
" port: 5280",
" module: ejabberd_http",
" request_handlers:",
" ...",
" /pub/content: mod_http_fileserver",
" ...",
" ...",
"",
"modules:",
" ...",
" mod_http_fileserver:",
" docroot: /var/www",
" accesslog: /var/log/ejabberd/access.log",
@ -585,5 +580,4 @@ mod_doc() ->
" content_types:",
" .ogg: audio/ogg",
" .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."), "",
?T("In order to use this module, it must be enabled "
"in 'listen' -> 'ejabberd_http' -> "
"http://../listen-options/#request-handlers[request_handlers].")],
"_`listen-options.md#request_handlers|request_handlers`_.")],
opts =>
[{host,
#{desc => ?T("Deprecated. Use 'hosts' instead.")}},
@ -367,40 +367,35 @@ mod_doc() ->
"of vCard. Since the representation has no attributes, "
"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"]}]}}],
["# This XML representation of vCard:",
"# <vCard xmlns='vcard-temp'>",
"# <FN>Conferences</FN>",
"# <ADR>",
"# <WORK/>",
"# <STREET>Elm Street</STREET>",
"# </ADR>",
"# </vCard>",
"# ",
"# is translated to:",
"vcard:",
" fn: Conferences",
" adr:",
" -",
" work: true",
" street: Elm Street"]}}],
example =>
["listen:",
" ...",
" -",
" port: 5443",
" module: ejabberd_http",
" tls: true",
" request_handlers:",
" ...",
" /upload: mod_http_upload",
" ...",
" ...",
"",
"modules:",
" ...",
" mod_http_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}].
depends(_Host, _Opts) ->

View File

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

View File

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

View File

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

View File

@ -282,7 +282,7 @@ listen_options() ->
mod_doc() ->
#{desc =>
?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 "
"'mod_mqtt' in 'modules' and 'listen' sections."),
opts =>

View File

@ -178,7 +178,6 @@ mod_doc() ->
?T("It is available since ejabberd 23.01.")],
example =>
["modules:",
" ...",
" mod_mqtt_bridge:",
" servers:",
" \"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",
" authentication:",
" certfile: \"/etc/ejabberd/mqtt_server.pem\"",
" replication_user: \"mqtt@xmpp.server.com\"",
" ..."],
" replication_user: \"mqtt@xmpp.server.com\""],
opts =>
[{servers,
#{value => "{ServerUrl: {publish: [TopicPairs], subscribe: [TopicPairs], authentication: [AuthInfo]}}",

View File

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

View File

@ -380,7 +380,7 @@ get_commands_spec() ->
desc = "Subscribe several users to a MUC conference",
note = "added in 22.05",
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`)",
module = ?MODULE, function = subscribe_room_many,
args_desc = ["Users JIDs and nicks",
@ -402,7 +402,7 @@ get_commands_spec() ->
#ejabberd_commands{name = subscribe_room_many, tags = [muc_room, muc_sub],
desc = "Subscribe several users to a MUC conference",
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`)",
module = ?MODULE, function = subscribe_room_many,
version = 1,

View File

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

View File

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

View File

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

View File

@ -352,9 +352,7 @@ mod_doc() ->
"The default value is 'none'.")}}],
example =>
["modules:",
" ...",
" mod_ping:",
" send_pings: true",
" 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.")}}],
example =>
["modules:",
" ...",
" mod_pres_counter:",
" count: 5",
" interval: 30 secs",
" ..."]}.
" interval: 30 secs"]}.

View File

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

View File

@ -237,23 +237,7 @@ mod_doc() ->
"by some XMPP clients in Service Discovery. The value of "
"'vCard' is a YAML map constructed from an XML representation "
"of vCard. Since the representation has no attributes, "
"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"]}]}}],
"the mapping is straightforward.")}}],
example =>
["acl:",
" admin:",
@ -274,7 +258,6 @@ mod_doc() ->
" proxyrate: 10240",
"",
"modules:",
" ...",
" mod_proxy65:",
" host: proxy1.example.org",
" name: \"File Transfer Proxy\"",
@ -284,5 +267,4 @@ mod_doc() ->
" access: proxy65_access",
" shaper: proxy65_shaper",
" recbuf: 10240",
" sndbuf: 10240",
" ..."]}.
" sndbuf: 10240"]}.

View File

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

View File

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

View File

@ -615,7 +615,7 @@ mod_doc() ->
?T("- Register a new account on the server."), "",
?T("- Change the password from 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 enable this feature, configure the "
"top-level _`captcha_cmd`_ and "
@ -625,7 +625,7 @@ mod_doc() ->
"important to include the last / character in the URL, "
"otherwise the subpages URL will be incorrect."), "",
?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'."),
?T("The module depends on _`mod_register`_ where all the "
"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.")}}],
example =>
["modules:",
" ...",
" mod_roster:",
" versioning: true",
" store_current_id: false",
" ..."]}.
" store_current_id: false"]}.

View File

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

View File

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

View File

@ -383,7 +383,7 @@ mod_doc() ->
?T("NOTE: It is not enough to just load this module. "
"You should also configure listeners and DNS records "
"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.")],
opts =>
[{always_record_route,
@ -437,7 +437,6 @@ mod_doc() ->
"cannot omit \"port\" or \"scheme\").")}}],
example =>
["modules:",
" ...",
" mod_sip:",
" always_record_route: false",
" record_route: \"sip:example.com;lr\"",
@ -449,7 +448,6 @@ mod_doc() ->
" via:",
" - tls://sip-tls.example.com:5061",
" - tcp://sip-tcp.example.com:5060",
" - udp://sip-udp.example.com:5060",
" ..."]}.
" - udp://sip-udp.example.com:5060"]}.
-endif.

View File

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

View File

@ -667,18 +667,21 @@ mod_doc() ->
"of vCard. Since the representation has no attributes, "
"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"]}]}}]}.
["# This XML representation of vCard:",
"# ",
"# <vCard xmlns='vcard-temp'>",
"# <FN>Conferences</FN>",
"# <ADR>",
"# <WORK/>",
"# <STREET>Elm Street</STREET>",
"# </ADR>",
"# </vCard>",
"# ",
"# is translated to:",
"# ",
"vcard:",
" fn: Conferences",
" adr:",
" -",
" work: true",
" 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-mirror rdf:resource="https://github.com/processone/ejabberd/tags"/>
<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"/>
<support-forum rdf:resource="xmpp:ejabberd@conference.process-one.net?join"/>
<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'
doc_url='https://docs.ejabberd.im'
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_data_dir="/opt/$rel_name"
tmp_dir=$(mktemp -d "/tmp/.$rel_name.XXXXXX")