Compare commits

...

467 Commits

Author SHA1 Message Date
Badlop ef754939c4 Set version to 25.04
CI / Tests (25) (push) Failing after 9s
CI / Tests (26) (push) Failing after 0s
CI / Tests (27) (push) Failing after 0s
Container / Container (push) Failing after 45s
Installers / Binaries (push) Failing after 50s
Runtime / Rebars (20, rebar) (push) Failing after 6s
Runtime / Rebars (20, rebar3) (push) Failing after 5s
Runtime / Rebars (25, rebar) (push) Failing after 6s
Runtime / Rebars (25, rebar3) (push) Failing after 4s
Runtime / Rebars (26, rebar) (push) Failing after 7s
Runtime / Rebars (26, rebar3) (push) Failing after 4s
Runtime / Rebars (27, rebar3) (push) Failing after 6s
Runtime / Rebar3+Elixir (1.13) (push) Failing after 7s
Runtime / Rebar3+Elixir (1.14) (push) Failing after 6s
Runtime / Rebar3+Elixir (1.15) (push) Failing after 6s
Runtime / Rebar3+Elixir (1.16) (push) Failing after 6s
Runtime / Rebar3+Elixir (1.17) (push) Failing after 7s
Runtime / Rebar3+Elixir (1.18) (push) Failing after 7s
Runtime / Mix (1.13) (push) Failing after 5s
Runtime / Mix (1.14) (push) Failing after 5s
Runtime / Mix (1.15) (push) Failing after 5s
Runtime / Mix (1.16) (push) Failing after 4s
Runtime / Mix (1.17) (push) Failing after 4s
Runtime / Mix (1.18) (push) Failing after 4s
Installers / Release (push) Has been skipped
2025-04-16 17:58:37 +02:00
Badlop ee3a0b8b1a Bump Erlang/OTP version to 27.3.2
27.3.3 was just release, but image is not yet published in
https://hub.docker.com/_/erlang/tags?name=27.3
2025-04-16 17:20:28 +02:00
Badlop 2182cb60ae CHANGELOG: Fix typos 2025-04-16 13:44:13 +02:00
Badlop 4da8278e66 Update other translations 2025-04-16 13:44:13 +02:00
Badlop 629db496b5 Update Chinese (Simplified) translation (thanks to Sketch6580) 2025-04-16 13:44:13 +02:00
Badlop f79b8e166a Update Ukrainian translation (thanks to Максим Горпиніч) 2025-04-16 13:44:13 +02:00
Badlop fae4ab97fd Update Albanian translation (thanks to Besnik Bleta) 2025-04-16 13:44:13 +02:00
Badlop da8d04a654 Update Portuguese translation (thanks to Silvério Santos) 2025-04-16 13:44:13 +02:00
Badlop ce02fc485f Update Portuguese (Brazil) translation (thanks to Wellington Uemura) 2025-04-16 13:44:13 +02:00
Badlop 69695ffe27 Update German translation (thanks to Nautilusx) 2025-04-16 13:44:13 +02:00
Badlop 6fdb467484 Update man page to 25.04 2025-04-16 13:44:13 +02:00
Badlop d8016a6477 Result of running "make format" 2025-04-16 13:44:13 +02:00
Badlop e43d864184 CI: Bump ubuntu-24.04, and Erlang 25+ (#4281)
Update postgresql preparation:
- ubuntu-20.04 included PostgreSQL 14.13
- ubuntu-24.04 includes PostgreSQL 16.4
and in the meantime, PostgreSQL 15.0 revoked
"the CREATE permission from all users except a database owner from the public (or default) schema."
See https://www.postgresql.org/about/news/postgresql-15-released-2526/
2025-04-16 13:44:07 +02:00
Badlop 4d3681aba1 Annotate kick_users version 2025-04-16 13:43:13 +02:00
Paweł Chmielowski d791f6ceaa Update changelog 2025-04-16 12:56:04 +02:00
Paweł Chmielowski 602a42f5ce Add tests for duplicate occupant-id handling 2025-04-16 11:39:30 +02:00
Paweł Chmielowski c98739d5b5 Replace all occupand_id tags 2025-04-14 16:42:00 +02:00
Paweł Chmielowski 425504454c Allow passing multiple paths in external_beams 2025-04-08 14:21:18 +02:00
Paweł Chmielowski 780031847c Relax limits of shared groups names
We want to normalize it, but we don't need to limit it to what nodeprep
allows (like for example ':' that we see in use)
2025-04-04 11:07:51 +02:00
Paweł Chmielowski c3af613db1 Catch errors from mod_shared_roster:create_group in srg_* commands 2025-04-04 11:07:51 +02:00
Badlop babd01a87f Container: Improve explanation of CTL_ON ignore prefix 2025-04-03 13:43:15 +02:00
Badlop 17b605a32b kick_users command: Move to "Online Users" page, disable auto-execution
kick_users can be considered a "modifier" command with "informative" result
as described in include/ejabberd_commands.hrl

ejabberd_web_admin executes automatically a command if:
- it returns something different than rescode or restuple
- and all its arguments are provided
- and force_execution is set to true or undefined
2025-04-03 13:43:13 +02:00
badlop fc813acd7b Merge pull request #4364 from Quobis/ejabberdctl-kick_users-command
ejabberdctl: add new `kick_users host` command
2025-04-03 12:56:53 +02:00
Badlop d842d6772d CI: Pull Redis image from ECR instead of Docker Hub
Pull images from Amazon ECR (Elastic Container Registry) Public Gallery
instead of Docker Hub to reduce consumption of the pull limits
https://www.docker.com/blog/revisiting-docker-hub-policies-prioritizing-developer-experience/
2025-04-01 16:07:46 +02:00
Badlop 67aaf93157 Runtime: Pull images from ECR instead of Docker Hub
Pull images from Amazon ECR (Elastic Container Registry) Public Gallery
instead of Docker Hub to reduce consumption of the pull limits
https://www.docker.com/blog/revisiting-docker-hub-policies-prioritizing-developer-experience/
2025-04-01 13:42:22 +02:00
Badlop 9154275431 Revert "build(deps): bump stun from 1.2.17 to 1.2.19"
This reverts commit a8a5be7a34.

Don't upgrade to stun 1.2.19 yet, because esip still depends on stun 1.2.17:

Because "the lock" depends on "esip 1.0.57" which depends on "stun 1.2.17", "the lock" requires "stun 1.2.17".
And because "the lock" specifies "stun 1.2.19", no version of "the lock" is allowed.
So, because "your app" depends on "the lock", version solving failed.
** (Mix) Hex dependency resolution failed
2025-04-01 13:42:22 +02:00
Badlop c343ef7aad Container: Apply recent ejabberdctl backward support code 2025-04-01 13:42:22 +02:00
Badlop 78093735b7 ejabberdctl: Add backward support for mnesia path with nodename (#4366) 2025-04-01 12:35:51 +02:00
dependabot[bot] ed6a111982 build(deps): bump XMPP-Interop-Testing/xmpp-interop-tests-action
Bumps [XMPP-Interop-Testing/xmpp-interop-tests-action](https://github.com/xmpp-interop-testing/xmpp-interop-tests-action) from 1.4.0 to 1.5.0.
- [Commits](https://github.com/xmpp-interop-testing/xmpp-interop-tests-action/compare/v1.4.0...v1.5.0)

---
updated-dependencies:
- dependency-name: XMPP-Interop-Testing/xmpp-interop-tests-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 12:35:47 +02:00
dependabot[bot] a8a5be7a34 build(deps): bump stun from 1.2.17 to 1.2.19
Bumps [stun](https://github.com/processone/stun) from 1.2.17 to 1.2.19.
- [Changelog](https://github.com/processone/stun/blob/master/CHANGELOG.md)
- [Commits](https://github.com/processone/stun/compare/1.2.17...1.2.19)

---
updated-dependencies:
- dependency-name: stun
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 12:35:44 +02:00
Paweł Chmielowski 5008947e32 Make sqlite update_primary_key when copying data use list of columns and not *
Since * depends on order of columns, if original table have different
column layout we could get resulting columns in wrong order.

This is fix for issue #4365
2025-03-31 11:49:30 +02:00
Marcos de Vera Piquero 0827a5116f ejabberdctl: add new kick_users host command
This new command accepts a host name and will kick all user sessions
found for that given host. The result is the number of kicked
sessions.
2025-03-28 17:45:54 +01:00
Badlop 85d0e93af5 Set version to 25.03
Container / Container (push) Failing after 46s
Installers / Binaries (push) Failing after 51s
Runtime / Rebars (20, rebar) (push) Failing after 4s
Runtime / Rebars (20, rebar3) (push) Failing after 4s
Runtime / Rebars (25, rebar) (push) Failing after 5s
Runtime / Rebars (25, rebar3) (push) Failing after 5s
Runtime / Rebars (26, rebar) (push) Failing after 5s
Runtime / Rebars (26, rebar3) (push) Failing after 4s
Runtime / Rebars (27, rebar3) (push) Failing after 4s
Runtime / Rebar3+Elixir (1.13) (push) Failing after 5s
Runtime / Rebar3+Elixir (1.14) (push) Failing after 5s
Runtime / Rebar3+Elixir (1.15) (push) Failing after 5s
Runtime / Rebar3+Elixir (1.16) (push) Failing after 4s
Runtime / Rebar3+Elixir (1.17) (push) Failing after 4s
Runtime / Rebar3+Elixir (1.18) (push) Failing after 1m34s
Runtime / Mix (1.13) (push) Failing after 5s
Runtime / Mix (1.14) (push) Failing after 5s
Runtime / Mix (1.15) (push) Failing after 5s
Runtime / Mix (1.16) (push) Failing after 4s
Runtime / Mix (1.17) (push) Failing after 5s
Runtime / Mix (1.18) (push) Failing after 5s
Installers / Release (push) Has been skipped
CI / Tests (20.0) (push) Has been cancelled
CI / Tests (25) (push) Has been cancelled
CI / Tests (26) (push) Has been cancelled
CI / Tests (27) (push) Has been cancelled
2025-03-28 10:41:53 +01:00
Badlop f677436437 Update changelog to 25.03 2025-03-28 10:41:45 +01:00
Badlop 05f8992e3e Update man page to 25.03 2025-03-28 10:37:29 +01:00
Badlop 2ed7ce49a2 Update documentation about XEP-0424 support and move to proper file (#3340) 2025-03-28 10:37:26 +01:00
Badlop 9087867631 Container: Document the used Erlang and Elixir versions 2025-03-28 10:37:24 +01:00
Badlop f58a0cdbfd Add some apps to rebar2 OTP releases 2025-03-27 22:07:04 +01:00
Badlop 91fb02d62e Result of running "make doap" 2025-03-27 22:07:02 +01:00
Badlop d831fd4789 Result of runing "make translations" 2025-03-27 22:07:01 +01:00
Badlop 322e642f19 Update Chinese (Simplified) translation (thanks to Sketch6580) 2025-03-27 22:07:00 +01:00
Badlop 4967acaec9 Update Ukrainian translation (thanks to Максим Горпиніч) 2025-03-27 22:06:59 +01:00
Badlop 113e5a322e New Tamil translation (thanks to TamilNeram) 2025-03-27 22:06:57 +01:00
Badlop 9c29457ee2 mod_adhoc_api: Fix warning when running "make translations" 2025-03-27 22:06:56 +01:00
Badlop 4fe5ee034c Update version number in documentation to 25.03 2025-03-27 22:06:54 +01:00
Badlop 78650f827e Rephrase auth_stored_password_types documentation 2025-03-27 22:06:52 +01:00
Badlop a4fc448a52 Container: Bump versions to Erlang/OTP 27.3 and Elixir 1.18.3 2025-03-27 22:06:50 +01:00
Paweł Chmielowski 01a71dc189 Restore odbc in dialyzer apps 2025-03-27 18:29:54 +01:00
Paweł Chmielowski 90a200be25 Tag deps 2025-03-27 16:25:12 +01:00
Paweł Chmielowski 9c92fcc92d Fix last commit 2025-03-26 13:03:41 +01:00
Paweł Chmielowski 6f9f4b3635 Fix issues with ldap authentication 2025-03-26 12:52:03 +01:00
Paweł Chmielowski 968fbc9424 Fix compilation on <R25 2025-03-26 11:29:59 +01:00
Paweł Chmielowski 7862c6a7db Add support for storing multiple passwords formats per user
This adds option 'auth_stored_password_types' that can be used to setup
storage of multiple passwords for each user. When this is set, on each
password set, database will now store password in each format specified.
2025-03-26 11:03:39 +01:00
Alexey Shchepin ced72f4a89 Sanitize message ID coming from Matrix 2025-03-25 17:42:31 +03:00
Alexey Shchepin 85dbadee5c Merge branch 'matrix' 2025-03-24 21:09:49 +03:00
Alexey Shchepin cf13abdab6 Preserve XMPP message IDs in Matrix rooms 2025-03-24 20:00:33 +03:00
dependabot[bot] 239d4a5bfb build(deps): bump golang in /.github/container
Bumps golang from 1.23-alpine to 1.24-alpine.

---
updated-dependencies:
- dependency-name: golang
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-24 16:16:12 +01:00
Badlop 51e96433ea Add XEPs that are indirectly supported and required by XEP-0479 2025-03-24 16:16:10 +01:00
Badlop 12274a969a ejabberd_config: Recover support for keywords in atom option that will be converted to binary 2025-03-24 16:16:08 +01:00
Badlop 79a4dd4a26 econf: Recover support for setting hosts as atoms in config file 2025-03-24 16:16:06 +01:00
Badlop d9e86600dc Register hooks and iq_handler using the gen_mod support for registrations 2025-03-24 16:16:04 +01:00
Badlop b8cb1bbdcf Register commands using the new gen_mod support 2025-03-24 16:16:02 +01:00
Badlop c180349fc6 gen_mod: Support registering commands and hook_subscribe in start/2 result 2025-03-24 16:16:00 +01:00
Badlop a6fec278c3 ejabberd_commands: Fix command unregistration 2025-03-24 16:15:57 +01:00
Badlop 999ede59ce Update a pair more URLs in documentation 2025-03-24 16:15:53 +01:00
Alexey Shchepin 30a7b0ef3b Better Matrix room topic and room roles to MUC conversion, support room aliases in invites 2025-03-20 17:33:53 +03:00
Badlop 16af90648e Update moved or broken URLs in documentation 2025-03-20 12:52:52 +01:00
Badlop 7723951c05 mod_muc_room: New muc_disco_info_extras event, useful for mod_muc_webchat_url (#3041) 2025-03-20 12:52:28 +01:00
Badlop 1668cde93f Update xmpp to get support for webchat_url (#3041) 2025-03-20 12:52:26 +01:00
badlop 418ca34c85 Merge pull request #4357 from badlop/adhoc_api
New mod_adhoc_api and related improvements
2025-03-20 11:10:43 +01:00
Paweł Chmielowski 6d8e588b78 Allows test to be run using ct_run 2025-03-19 10:40:49 +01:00
Badlop 9bf2d6ce5b mod_configure: Document available alternative API commands 2025-03-19 10:40:01 +01:00
Badlop 496daf9220 mod_adhoc_api: New module to execute API Commands using Ad-Hoc Commands 2025-03-19 10:39:53 +01:00
Badlop 573e06cc0c mod_muc_admin: create_room_with_opts command recommends using ; and = separators 2025-03-19 10:38:10 +01:00
Badlop 6d77ace5c9 mod_http_api: Sort list elements in a command result 2025-03-19 10:38:10 +01:00
Badlop aa78362c7f mod_configure: Add option 'access' to let configure the access name 2025-03-19 10:38:10 +01:00
Badlop 6151674e64 ejabberd_commands: Show warning when registering command with an existing name
In ejabberd modules, only register/unregister commands
if module is not running for any other vhost.
2025-03-19 10:38:10 +01:00
Badlop 1ea0dde417 ejabberd_admin: Allow using mnesia_list_tables and mnesia_table_change_storage 2025-03-19 10:38:10 +01:00
Badlop 53dea7b6d7 Fix email addresses in modules headers 2025-03-18 19:58:47 +01:00
Badlop c87ba45a86 Result of running "make format" 2025-03-18 19:57:38 +01:00
badlop 6ea25e2272 Merge pull request #4350 from badlop/define_keyword
New define_keyword option
2025-03-18 15:48:58 +01:00
Badlop 888c335c2e Add tests for config features define_macro and define_keyword 2025-03-18 13:40:21 +01:00
Badlop 4dcf97c4c1 Now, when running tests, external may contain duplicate module 2025-03-18 13:40:21 +01:00
Badlop 352ee3a318 Docs: Document define_keyword and simplify define_macro 2025-03-18 13:40:21 +01:00
Badlop c8abff33c1 Remove some options keyword expansion, as they are now predefined 2025-03-18 13:40:21 +01:00
Badlop 998690f58c Add support to replace keywords in modules options 2025-03-18 13:40:21 +01:00
Badlop 6e68c2ec02 Add support to replace keywords in listener options 2025-03-18 13:40:21 +01:00
Badlop 896b7c7559 Add support to replace keywords in toplevel options 2025-03-18 13:40:21 +01:00
Badlop 69b190775c Implement internal functions get_predefined and replace keywords 2025-03-18 13:40:21 +01:00
Badlop b769de0690 New option define_keyword 2025-03-18 13:40:21 +01:00
Badlop 19482529ee Inform that define_macro cannot be used inside host_config 2025-03-18 13:40:21 +01:00
Badlop ad8e325139 Disable commands tests for old Erlang/OTP versions
Since recently, this test fails with Erlang/OTP 22 and lower:
  =result        failed:
    {test_case_failed,
     "Received input:
      [{error,{compilation_failed,
         \"/home/runner/.ejabberd-modules/sources/ejabberd-contrib/mod_example/src/mod_example.erl\"}}]
      don't match expected patterns:ok"},
2025-03-18 12:45:25 +01:00
Badlop b901a69f5c mix.exs: Keep debug info when building dev release (thanks to Stefan Strigler) 2025-03-17 15:09:12 +01:00
Badlop 62a165e4cf ejabberd_web_admin: Support commands with tuple arguments; fix list indent 2025-03-17 15:09:10 +01:00
badlop 29616dc163 Merge pull request #4340 from badlop/containers-frictionless
CTL_OVER_HTTP and containers frictionless
2025-03-12 19:40:56 +01:00
Badlop 60324d4b7a CONTAINER.md: Include documentation for ecs container image 2025-03-12 18:19:39 +01:00
Badlop cfa6575b4f CONTAINER.md: Update with all the recent improvements 2025-03-12 18:18:03 +01:00
Badlop 3b01e4e4e0 Container: Fix warning about relative workdir 2025-03-12 18:18:03 +01:00
Badlop fa4a93c465 Container: Place sockets/ outside database/
The socket file is useless outside the container, and also
database/ may get mounted as volume, and can't handle socket file
2025-03-12 18:18:03 +01:00
Badlop 74d6d53ac6 Container: Add ERL_FLAGS to compile elixir on qemu cross-platform
Without this, compiling Elixir on arm64 using QEMU fails with:
 <<"could not call Module.put_attribute/3 because the module ExUnit.DocTest
 is already compiled">>

Solution found in:
  https://elixirforum.com/t/elixir-docker-image-wont-build-for-linux-arm64-v8-using-github-actions/56383/13
2025-03-12 18:18:03 +01:00
Badlop 8070a656fe Container: Use again direct METHOD, qemu got fixed (3983)(4280)
Partially revert d15cf99:
  Container: Add METHOD to build container using packages (3983)
2025-03-12 18:18:03 +01:00
Badlop 105a0c2029 Container: Enable CTL_OVER_HTTP by default 2025-03-12 18:18:03 +01:00
Badlop e887546c27 Container: Copy support for CTL_OVER_HTTP 2025-03-12 18:18:03 +01:00
Badlop 9305232f8c Container: Remove runDeps file once it's used 2025-03-12 18:18:03 +01:00
Badlop 7832a6342a Container: Link path to mnesia spool dir for backwards compatibility
The ejabberdctl script in ecs image sets mnesia spool dir as:
: "${SPOOL_DIR:="$HOME_DIR/database/$ERLANG_NODE"}"
2025-03-12 18:18:03 +01:00
Badlop c924a47188 Container: Improve entrypoint script: register account, or set random
If password variable is set, register that account.
Example kubernetes yaml file in podman:

    env:
    - name: EJABBERD_MACRO_ADMIN
      value: administrator@example.org
    - name: REGISTER_ADMIN_PASSWORD
      value: somePass0rd

If admin and password are not set,
grant admin rights only to a random account name.
Notice that admin rights are granted to that variable in the default
ejabberd.yml, so if the account is not created, somebody else could do.
2025-03-12 18:18:03 +01:00
Badlop 1d42d55064 Container: Compile ejabberdapi during build
Code written originally by sando38 for ecs's Dockerfile.
2025-03-12 18:18:03 +01:00
Badlop dd7550dbad Container: Listen for webadmin in a port number lower than any other
In the docker-desktop and podman-desktop,
when user clicks their "Open Browser" buttons,
those apps open a browser with / URL and the lowest exposed port number.
2025-03-12 18:18:03 +01:00
Badlop 7df7daa050 Container: Define and use macros in the configuration file 2025-03-12 18:18:03 +01:00
Badlop 090a7e664e Container: Apply customizations directly in the configuration file 2025-03-12 18:18:03 +01:00
Badlop 3d49bed0cf Container: Copy main example configuration file, will be customized 2025-03-12 18:18:03 +01:00
Badlop 9f28098d04 Container: Copy files to stable path, add ecs backwards compatibility
Copy captcha scripts to stable path for referencing in compose files:
  /usr/local/bin/
which is included in $PATH

For backwards compatibility with ecs, link:
  /opt/ -> /home/
  /usr/local/bin/ -> /opt/ejabberd/bin/

Copy sql files to stable path for referencing:
  /opt/ejabberd/sql/
For backwards compatibility with ecs, copy also to
  /opt/ejabberd/database/
ecs image implemented this in ejabberdctl since 2019:
  edb0373fd0ae0b24807a41ba2c3bf04b5b514844
  Keep SQL init scripts in container (#42)
2025-03-12 18:18:03 +01:00
Badlop e761b22c61 ejabberd_listener: When opening ctl_over_http connection, log in DEBUG 2025-03-12 18:18:03 +01:00
Badlop 4d62f545c5 ejabberd_admin: Separate Status command result with newline
This is useful for CTL_OVER_HTTP
2025-03-12 18:18:03 +01:00
Badlop f789495c39 ejabberdctl: Improve method to pass command arguments 2025-03-12 18:18:03 +01:00
Badlop 46a64c0f68 New ejabberdctl option CTL_OVER_HTTP
This uses an HTTP connection to execute the command,
which is way faster than starting an erlang node
2025-03-12 18:18:03 +01:00
Badlop ab8a39e71f ejabberdctl: Improve explanation how to stop ejabberd in live mode 2025-03-12 18:18:03 +01:00
Badlop 630301a7ba ejabberdctl: Document the --auth option
The expected placement of --auth is not arbitrary,
it should be provided immediately before the command+args
2025-03-12 18:18:03 +01:00
Badlop d4fd987e84 ejabberd_listener: When stopping listener, delete Unix Domain Socket file 2025-03-12 17:21:46 +01:00
Badlop c5abe5d882 ejabberd_listener: Apparently the sleep 5 seconds isn't needed anymore 2025-03-12 17:09:37 +01:00
Badlop 71dbbc1b5a ejabberd_listener: Use /tmp for temporary socket, as path is restricted to 107 chars 2025-03-12 17:09:37 +01:00
Badlop c9a9585573 ejabberd_listener: Add support for socket relative path
If the 'port' option is set to "unix:some-filename" without absolute path,
then the file is created in the mnesia spool directory
2025-03-12 17:09:37 +01:00
Badlop bb2f398fa2 ejabberd_listener: Handle unix socket when logging remote client 2025-03-12 17:09:37 +01:00
Badlop afc54aeb20 ext_mod: Provide output path when mix unpacks dependency from hex
When installing a module with mix available in the system,
mix downloads and uncompresses the dependency.
By default the output dir is <app>-<version> [1], and
that breaks compilation of the prometheus library:
  .../sources/ejabberd-contrib/mod_prometheus/deps/prometheus-4.11.0/src/metrics/prometheus_quantile_summary.erl:67:14:
  can't find include lib "quantile_estimator/include/quantile_estimator.hrl"
  %   67| -include_lib("quantile_estimator/include/quantile_estimator.hrl").

[1] https://hexdocs.pm/hex/Mix.Tasks.Hex.Package.html#module-command-line-options
2025-03-12 12:42:42 +01:00
badlop 9c142e5509 Merge pull request #4361 from sstrigler/ext_mod-fix-greedy-include-path
Ext mod fix greedy include path cont'd
2025-03-12 10:59:44 +01:00
Stefan Strigler 27f98f50d3 fix typo 2025-03-12 08:11:25 +01:00
Stefan Strigler 0145594adc add $libdir/include to include path 2025-03-12 08:11:07 +01:00
badlop 67ee0de7e3 Merge pull request #4360 from sstrigler/ext_mod-fix-greedy-include-path
fix greedy include path (fixes #4359)
2025-03-11 19:28:52 +01:00
Stefan Strigler 087718c47a fix greedy include path (fixes #4359) 2025-03-11 15:05:54 +01:00
Badlop 6bf5930703 mod_announce: Improve documentation syntax 2025-03-06 22:06:04 +01:00
Badlop 90c4fa2a84 mod_admin_extra: If policy=user, ejabberd adds the user/host args 2025-03-06 22:06:03 +01:00
Badlop b75c3257bd ejabberd_oauth: Commands description should be plain text
The desc field is displayed in "ejabberdctl help", which has
no markdown processing.

If adding links is important, they can be added in the longdesc field.
2025-03-06 22:05:58 +01:00
Badlop 178b09f5bb ejabberd_admin: Fix crash in list_cluster_detailed when a node is down 2025-03-06 22:05:56 +01:00
Badlop 70980efe39 make-binaries: Bump versions to Erlang/OTP 27.3 and Elixir 1.18.3 2025-03-06 22:05:53 +01:00
dependabot[bot] c124dbdd6a build(deps-dev): bump ex_doc from 0.37.1 to 0.37.2
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.37.1 to 0.37.2.
- [Release notes](https://github.com/elixir-lang/ex_doc/releases)
- [Changelog](https://github.com/elixir-lang/ex_doc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/elixir-lang/ex_doc/compare/v0.37.1...v0.37.2)

---
updated-dependencies:
- dependency-name: ex_doc
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-06 22:05:49 +01:00
dependabot[bot] 6af2a65e53 build(deps): bump stringprep from 1.0.30 to 1.0.31
Bumps [stringprep](https://github.com/processone/stringprep) from 1.0.30 to 1.0.31.
- [Changelog](https://github.com/processone/stringprep/blob/master/CHANGELOG.md)
- [Commits](https://github.com/processone/stringprep/compare/1.0.30...1.0.31)

---
updated-dependencies:
- dependency-name: stringprep
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-06 22:05:48 +01:00
Badlop 54f89e7568 Update XEP-0280 supported version to 1.0.1 2025-03-06 22:05:45 +01:00
Paweł Chmielowski 66205cf648 Merge pull request #4356 from pouriya/ref-new-hook-to-customize-resource-binding
Add c2s_handle_bind hook
2025-03-06 14:19:57 +01:00
Paweł Chmielowski b38d8618b2 Fix crashes when ouath is feed with invalid jid
This should fix issue #4355
2025-02-26 11:17:55 +01:00
p 051093f4f8 ref: c2s_handle_bind hook 2025-02-25 14:11:02 +03:30
Alexey Shchepin 2a85c0a474 Add muc#user element to presences and an initial empty subject 2025-02-24 17:39:57 +03:00
Alexey Shchepin 7018b8b164 Fix gen_iq_handler:remove_iq_handler call in mod_matrix_gw 2025-02-21 12:05:34 +03:00
Alexey Shchepin 41232ccb39 Properly handle IQ requests in mod_matrix_gw 2025-02-21 04:15:08 +03:00
Paweł Chmielowski 6bd4399aee Bubble up db errors in nodetree_tree_sql:set_node 2025-02-20 14:48:45 +01:00
Badlop 45dafbcdcc Result of running "make format" 2025-02-19 11:07:36 +01:00
Badlop a32bfd1215 Show warning also when deprecated listener option is set as disabled (#4345) 2025-02-19 11:07:36 +01:00
Badlop 78f7a9a244 CI: Fix step name, remove obsolete step reference 2025-02-19 11:07:36 +01:00
dependabot[bot] 44782001e2 mix.lock: bump ex_doc from 0.36.1 to 0.37.1
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.36.1 to 0.37.1.
- [Release notes](https://github.com/elixir-lang/ex_doc/releases)
- [Changelog](https://github.com/elixir-lang/ex_doc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/elixir-lang/ex_doc/compare/v0.36.1...v0.37.1)

---
updated-dependencies:
- dependency-name: ex_doc
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-19 11:07:26 +01:00
badlop c7d7d07ee4 Merge pull request #4348 from mtstickney/fix_privileged_iq_response_detection
Don't rewrite "self-addressed" privileged IQs as results.
2025-02-18 11:03:04 +01:00
badlop 27390c387d Merge pull request #4341 from mtstickney/route_unprivileged_iqs_from_privileged_component
Accept non-privileged IQs from XEP-0356 privileged components.
2025-02-18 11:02:21 +01:00
Badlop ceee3d3be1 Fix placement of vcard_xupdate documentation 2025-02-14 17:17:13 +01:00
Badlop 983c016bba Update xmpp to get XEP-0317 Hats namespaces version 0.2.0 2025-02-14 16:58:55 +01:00
Badlop 8a7e955453 Update yconf to support macro inside string 2025-02-14 16:58:50 +01:00
Badlop 376f7b261e mod_mam: Mention in documentation that MAM should use some SQL storage 2025-02-14 16:57:32 +01:00
Alexey Shchepin 80423d7e69 Support Matrix room aliases 2025-02-13 16:21:05 +03:00
Holger Weiss da61f3dfea make-binaries: Bump OpenSSL version to 3.4.1 2025-02-11 16:46:45 +01:00
Holger Weiss a49ec4d583 make-binaries: Fix building Termcap and Linux-PAM
Building GNU Termcap and Linux-PAM using the updated toolchain both
failed, since crosstool-NG now uses GCC 14.x, which turns the
"implicit-function-declaration" warning into an error.  See:

https://gcc.gnu.org/gcc-14/porting_to.html#warnings-as-errors

Therefore, specify "CFLAGS=-Wno-error=implicit-function-declaration" to
turn this error back into a warning.
2025-02-07 20:08:26 +01:00
Holger Weiss 5f849bdb3f make-binaries: Bump dependency versions 2025-02-07 15:49:25 +01:00
Holger Weiss d875e0280c make-binaries: Stick to Linux-PAM 1.6.1
Stick to Linux-PAM version 1.6.1 for the moment.  Newer Linux-PAM
versions are built using Meson instead of Autotools, so we need to add
that to our toolchain before being able to update Linux-PAM.
2025-02-07 15:45:59 +01:00
Holger Weiss 4188c062e7 make-binaries: Bump crosstool-NG version to 1.27.0 2025-02-07 15:27:15 +01:00
Badlop 21ae72d02e Result of running "make doap options" 2025-02-06 11:02:17 +01:00
Badlop d834a9c1c1 Delete ejabberd.cfg which apparently isn't needed anymore 2025-02-06 11:02:17 +01:00
Badlop 07b102bb80 Docs: Fix markdown of some toplevel options 2025-02-06 11:02:17 +01:00
Badlop 480e2442ee Improve define_macro option validator 2025-02-06 11:02:17 +01:00
Badlop a9c7bf97ef Add define_macro to globals() because it's useless inside host_config 2025-02-06 10:51:51 +01:00
Badlop cae40c3f72 mod_http_api: Define the option type that opt_type.sh cannot derive itself 2025-02-06 10:51:49 +01:00
Badlop 4f90d1a0d9 Document that XEP-0474 0.4.0 was recently upgraded
Thanks to https://github.com/processone/xmpp/pull/99
2025-02-06 10:51:46 +01:00
Badlop 22b3d0e49f get_auto_url: Don't build auto URL if port is unix domain socket (#4345) 2025-02-06 10:51:44 +01:00
Badlop 0732603a4e Disable opaque_union dialyzer warnings as workaround for dialyzer with Erlang/OTP 28
See
https://github.com/erlang/otp/commit/5dab31e9f991531f2e0de44b896229b686f753f9
2025-02-06 10:51:42 +01:00
Badlop e34b6f4204 Update odbc:connection_reference mention to fix dialyzer with Erlang/OTP 28 2025-02-06 10:51:39 +01:00
Matthew Stickney 64142de4fe Don't rewrite "self-addressed" privileged IQs as results.
process_privilege_iq is meant to rewrite the result of a privileged IQ into
the forwarded form required by XEP-0356 so it can be routed back to the
original privileged requester. It checks whether the impersonated JID
(`ReplacedJid`) of the original request matches the recipient of the IQ
being processed to determine if this is a response to a a privileged IQ
(assuming it has privileged-IQ metadata attached).

Unfortunately, it doesn't check the packet type, and this check will also
match a privileged-IQ _request_ that is being sent to the same user that's
being impersonated. This results in the request itself being rewritten and
forwarded back to the sending component, instead of being processed and
having the result send back.

Instead, just check for IQ results (either a regular result or an error),
and as long as it is marked as being a response to a privileged-IQ, always
rewrite it and forward it to the sending component. There's no circumstance
under which we _shouldn't_ forward a privileged-IQ response, so we don't
need to be tricky about checking whether impersonated-user and recipient
match.
2025-02-01 13:20:10 -05:00
Matthew Stickney a4062f6ac0 mod_privilege: Accept non-privileged IQs from privileged components.
mod_privilege current drops any non-privileged IQ received from a component
with an error about it not being properly wrapped. While this might
represent a mistake on the part of the component, it means that well-
behaved components can no longer send non-privileged IQs (something they
normally can do if mod_privilege isn't enabled).

Since mod_privilege is intended to grant additional permissions, and not
remove existing ones, route non-privileged IQs received from the component
normally.

This also removes the special-case for roster-query IQ stanzas, since
those are also non-privileged and will be routed along with any other
non-privileged IQ packet. This mirrors the privileged-IQ/everything-else
structure of the XEP, which defined the handling of privileged IQ
stanzas and leaves all other IQ stanzas as defined in their own specs.

To make this clearer, the predicate function now returns distinct
results indicating privileged IQs, non-privileged IQs, and error
conditions, rather than treating non-privilege IQs as an error that gets
handled by routing the packet normally.
2025-02-01 13:18:10 -05:00
Holger Weiss 76baf58d5d mod_private: Improve exception handling
Properly isolate the code that should be subject to exception handling.
2025-01-31 14:23:45 +01:00
Holger Weiss e134d7f0b4 mod_private: Don't warn on conversion errors
Clients publish invalid bookmark elements in practice (e.g., bookmarks
with an empty <nick/> element).  The server admin can't address that
issue, so don't spam the log with warnings.
2025-01-31 13:51:37 +01:00
Holger Weiss 20a0051578 mod_private: Handle invalid PEP-native bookmarks
Don't crash while attempting to convert invalid XEP-0402 conference
bookmark elements.
2025-01-31 13:49:22 +01:00
Holger Weiss eca3204e82 mod_private: Don't crash on invalid bookmarks
Catch failures while decoding the conference bookmark element.
2025-01-28 19:37:49 +01:00
Holger Weiss a19ab9f4e3 Update xmpp to bring SSDP to XEP version 0.4 2025-01-25 22:21:43 +01:00
Paweł Chmielowski 133d52d040 Stop processing other handlers in mod_s2s_bidi:s2s_in_handle_info
This should fix issue reported in #4344
2025-01-22 14:12:32 +01:00
Badlop 20a77cb9c7 acl: Fixed bug matching the acl "shared_group: NAME"
This config triggered a crash at client login:

acl:
  tech:
    shared_group: techteam
access_rules:
  announce:
    allow: tech
  configure:
    allow: tech
2025-01-21 13:45:35 +01:00
Badlop cab96d2156 mod_shared_roster: Remove unnecesary double call to split_grouphost
which was added in 5b0f0d8
2025-01-21 13:45:33 +01:00
Badlop 9be76cce9e Fix support for compiling in VSCode 2025-01-21 13:45:28 +01:00
Alexey Shchepin e7035f3235 Fix handling of 3PI events in mod_matrix_gw_room 2025-01-20 09:10:57 +03:00
Badlop 6e4ac0c501 Fix recent commit to work with Erlang/OTP 20 2025-01-16 20:38:43 +01:00
Badlop aa612463cc mod_muc: Document MUC room option vcard_xupdate 2025-01-15 20:33:42 +01:00
Badlop 9827ad43e4 mod_muc_admin: Verify room option value before setting it (#4337) 2025-01-15 20:33:40 +01:00
Badlop e0bb900651 mod_muc_admin: Add forgotten support to set enable_hats room option 2025-01-15 20:33:39 +01:00
Badlop ad1b577ca9 mix.exs: The ex_doc dependency is only relevant for the edoc Mix environment 2025-01-15 20:33:36 +01:00
Badlop f72cfa9a13 Test: Uninstall mod_example when the tests has finished 2025-01-15 20:33:33 +01:00
Paweł Chmielowski 056635119c Fix json version of json_encode_with_kv_list for nested kv lists
This should fix error reported in issue #4338
2025-01-14 10:03:31 +01:00
Badlop 2e754a5557 mod_admin_update_sql: Fix mysql support 2025-01-13 16:34:09 +01:00
Badlop 6959447c2c mod_admin_update_sql: Fix update_sql when using tables created by ejabberd internally 2025-01-13 16:34:07 +01:00
Badlop 4a363b6e76 Test: Fixes to handle re-running test after update_sql
Enable some modules so ejabberd creates their SQL tables
and later those tables can be updated without errors by mod_admin_update_sql
when ci.yml calls "make test" to check update_sql.

However, mod_shared_roster should be stopped before running the actual tests,
as it introduces undesired IQ queries

On the other hand, a few SQL tables are global RAM, and cannot be created
in SQL just for a vhost that is not the first one defined.
2025-01-13 16:34:05 +01:00
Badlop 862cacabcb ejabberdctl.template: Handle erts versions 9 o lower 2025-01-13 16:34:04 +01:00
Badlop 29e6204bde Docs: Reword explanation about ACL names and definitions 2025-01-13 16:34:03 +01:00
Badlop bc6c868c8a Docs: Don't use backtick quotes for ejabberd name
This change improves sentences legibility.
In the Introduction page, use **strong** instead.

Notice backtick quotes are for raw code in markdown, for example:
- `ejabberd` container image
- `ejabberd` script generated by OTP Release
- `ejabberd` username in system, for example for MySQL or container host
2025-01-13 16:34:01 +01:00
Badlop 9d87193d80 mix.lock: Update to recent versions 2025-01-13 16:33:59 +01:00
Badlop 85b660fb4b rebar.config: Bump provider_asn1 version to 0.4.1 2025-01-13 16:33:58 +01:00
Holger Weiss 5a6e46c32a Merge remote-tracking branch 'processone/pr/4297'
* processone/pr/4297:
  mix_pam: Remove 'Channels' roster group of mix channels
2025-01-08 21:23:23 +01:00
Badlop 457d8fc6cc Container: Bump versions to Erlang/OTP 27.2 and Elixir 1.18.1 2025-01-03 11:50:07 +01:00
Badlop 8ebbb45a19 Update copyright year to 2025 (#4139) 2025-01-03 11:49:37 +01:00
Badlop 13dae75d01 Partially revert "Workflows: Bump ubuntu from 22.04 to 24.04 when possible (#4281)"
ubuntu-24.04 includes texinfo 7.1, which has a problematic bug.
Let's revert to ubuntu-22.04 until 24.04 includes a fixed texinfo.

URL to keep an eye:
https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md

This partially reverts commit d3baacd78e.
2025-01-03 11:49:37 +01:00
Badlop 172847bc76 Update path to ejabberd-contrib section in Docs site 2025-01-03 11:49:37 +01:00
Holger Weiss 2b2551bc50 make-binaries: Bump Erlang/OTP version to 27.2 2025-01-02 18:25:24 +01:00
Holger Weiss aa8957f137 make-binaries: Bump dependency versions 2025-01-02 18:24:30 +01:00
badlop ba9a7916db Merge pull request #4333 from di72nn/fix_typos_in_docs
Fix a couple of typos in documentation
2024-12-30 19:45:49 +01:00
Dmitriy Bogdanov 5945dba412 Fix a couple of typos in documentation 2024-12-26 14:55:31 +01:00
Paweł Chmielowski 7d5413ce95 Update xmpp to bring fix for ssdp hash calculation 2024-12-21 20:03:18 +01:00
Holger Weiss 364ee0f8ed ejabberd.yml.example: Enable mod_muc_occupantid
Add mod_muc_occupantid to the list of modules enabled in the sample
configuration.  It's not necessarily obvious that it's required for
using certain modern features in group chat, and there's no downside in
activating this module.
2024-12-21 11:04:08 +01:00
Paweł Chmielowski 213a513f54 Fix name option in documentation 2024-12-20 10:32:21 +01:00
Paweł Chmielowski aa65e626f4 Fix values allowed in db_type of mod_auth_fast documentation 2024-12-20 09:38:03 +01:00
Paweł Chmielowski 5b3b29565c Remove overide on fast_xml 2024-12-19 16:27:16 +01:00
Paweł Chmielowski f38f81159d Fix issue with wrong namespace in mod_s2s_bidi 2024-12-19 14:04:56 +01:00
Badlop 7511307868 Set version to 24.12
Container / Container (push) Failing after 48s
Installers / Binaries (push) Failing after 53s
Runtime / Rebars (20, rebar) (push) Failing after 4s
Runtime / Rebars (20, rebar3) (push) Failing after 5s
Runtime / Rebars (25, rebar) (push) Failing after 4s
Runtime / Rebars (25, rebar3) (push) Failing after 4s
Runtime / Rebars (26, rebar) (push) Failing after 4s
Runtime / Rebars (26, rebar3) (push) Failing after 5s
Runtime / Rebars (27, rebar3) (push) Failing after 4s
Runtime / Rebar3+Elixir (1.13) (push) Failing after 1m21s
Runtime / Rebar3+Elixir (1.14) (push) Failing after 1m29s
Runtime / Rebar3+Elixir (1.15) (push) Failing after 9s
Runtime / Rebar3+Elixir (1.16) (push) Failing after 8s
Runtime / Rebar3+Elixir (1.17) (push) Failing after 9s
Runtime / Mix (1.13) (push) Failing after 5s
Runtime / Mix (1.14) (push) Failing after 5s
Runtime / Mix (1.15) (push) Failing after 5s
Runtime / Mix (1.16) (push) Failing after 5s
Runtime / Mix (1.17) (push) Failing after 5s
Installers / Release (push) Has been skipped
CI / Tests (20.0) (push) Has been cancelled
CI / Tests (25) (push) Has been cancelled
CI / Tests (26) (push) Has been cancelled
CI / Tests (27) (push) Has been cancelled
2024-12-19 11:50:21 +01:00
Badlop 1cadc6b1dc CI: Revert old feature that published failed CT logs to website
Nowadays the CT logs can be downloaded from each action run in:
  https://github.com/processone/ejabberd/actions/workflows/ci.yml

This partially reverts commit 8ccad7f
  Publish CT logs and Cover on failure to an external GH Pages repo
2024-12-19 11:21:25 +01:00
Badlop 405437b086 mix.lock, rebar.lock: Update to recent versions 2024-12-19 10:56:30 +01:00
Badlop 51f4382b9f CHANGELOG.md: Update 2024-12-19 10:45:19 +01:00
Holger Weiss e967a409d3 stundisco_tests: Fix TURNS credentials syntax 2024-12-18 22:24:53 +01:00
Holger Weiss eaebfc795e rebar.config: Depend on current xmpp version
We now hard-depend on xmpp 1.9.1.
2024-12-18 21:31:55 +01:00
Holger Weiss 3bc66a7054 stundisco_tests: Check correct credentials syntax 2024-12-18 21:17:07 +01:00
Holger Weiss 8cfcc69100 mod_stun_disco: Fix syntax of credentials response
As per XEP-0215 (#3.3), the response to a credentials request must use
the <credentials/> element rather than <services/>.

Thanks to Thilo Molitor for spotting the issue.
2024-12-18 20:43:03 +01:00
Badlop ce3bc85d32 CHANGELOG.md: Update to 24.12, fix some newlines 2024-12-18 19:23:47 +01:00
Badlop 1fe9e3aa67 CONTAINER.md: Fix some typos 2024-12-18 19:23:45 +01:00
Badlop d93a8e341f mod_http_api: Annotate that default_version was added in new release 2024-12-18 19:23:41 +01:00
Paweł Chmielowski 1107cefdb6 Use tagged deps 2024-12-18 17:29:37 +01:00
Jérôme Sautret 92b2bb7532 Merge branch 'master' of github.com:processone/ejabberd 2024-12-18 16:24:12 +01:00
Jérôme Sautret 9a2a9187cd Revert "Experimental support for joining Matrix rooms as MUC rooms"
This reverts commit eb6f242d99.
2024-12-18 16:23:29 +01:00
Jérôme Sautret 50b57ada7c Revert "Fix dialyzer errors"
This reverts commit e589265921.
2024-12-18 16:22:21 +01:00
Paweł Chmielowski a8649767f2 Pull updated xmpp 2024-12-18 16:03:13 +01:00
Metalhearf 2eb605873c Add security policy and reporting guidelines 2024-12-18 15:51:08 +01:00
Paweł Chmielowski 26e8679359 Make rsm handling in disco items mod_muc, correctly count skipped rooms 2024-12-18 15:07:13 +01:00
Paweł Chmielowski 2aa673e780 Update xmpp dep once more 2024-12-17 15:11:33 +01:00
Paweł Chmielowski 06303ae7ab Relax checks for channels bindings for connections using external encryption
This should fix issue #4322
2024-12-17 13:49:05 +01:00
Paweł Chmielowski 2b3d588f10 Typo 2024-12-17 13:30:04 +01:00
Paweł Chmielowski 3dd7febb98 Fix expiration date calculation in mod_auth_fast 2024-12-17 13:28:54 +01:00
Badlop beb5bfea36 Update man page to 24.12 2024-12-17 12:31:59 +01:00
Badlop 628f286eb6 Update Spanish and Catalan translations 2024-12-17 12:31:57 +01:00
Badlop 9e14c7a803 Update Chinese (Simplified) translation (thanks to Sketch6580) 2024-12-17 12:31:56 +01:00
Badlop 863f2e019c Update Albanian translation (thanks to Besnik Bleta) 2024-12-17 12:31:55 +01:00
Badlop 4334ce9c29 Update Portuguese (Brazil) translation (thanks to Wellington Uemura) 2024-12-17 12:31:54 +01:00
Badlop 7008e49675 Update Italian translation (thanks to Ermete Melchiorre) 2024-12-17 12:31:53 +01:00
Badlop b84596be57 Update French translation (thanks to ButterflyOfFire) 2024-12-17 12:31:52 +01:00
Badlop 4fd26306fe Update German translation (thanks to Nautilusx) 2024-12-17 12:31:51 +01:00
Badlop 8e9ea2d98c Update Bulgarian translation (thanks to MrEddX) 2024-12-17 12:31:49 +01:00
Badlop 1024cbe5b3 Result of running "make doap" 2024-12-17 12:31:48 +01:00
Badlop a16ef68a49 Result of running "make format" 2024-12-17 12:31:47 +01:00
Badlop 7726904f79 Fix comment about file names 2024-12-17 12:31:45 +01:00
Badlop 1481734f47 Update version number to 24.12 2024-12-17 12:31:42 +01:00
Paweł Chmielowski 01955b867d Fix dialyzer warning 2024-12-17 11:13:56 +01:00
Paweł Chmielowski 549a2b0790 Remove message left from debugging 2024-12-17 11:01:11 +01:00
Paweł Chmielowski 2caaa09c99 Add support for XEP-0484: Fast Authentication Streamlining Tokens 2024-12-17 10:56:11 +01:00
Badlop da06a50072 WebAdmin: Use lowercase username and server authentication credentials 2024-12-17 10:13:00 +01:00
Badlop 2b02af13ba CONTAINER.md: Add kubernetes yaml examples to use with podman 2024-12-17 10:12:57 +01:00
Badlop ae238bc984 mod_http_api: Fix crash when module not enabled (for example, in CT tests) 2024-12-17 10:12:55 +01:00
Badlop 3d2036db61 mod_http_api: New option default_version
The server administrator can define default API version
for a vhost using the new module option:

modules:
  mod_http_api:
    default_version: 1

The server administrator can define default API version
for a port using the path:

listen:
  -
    request_handlers:
      /api/v2: mod_http_api

The client can use a specific API version,
regardless of what the admin has set,
by appending it in the URL:

http://localhost:5280/api/v2/get_loglevel/v3
2024-12-17 10:12:53 +01:00
Badlop b8360cae08 Rename argument "name" to "room" for consistency
And thanks to args_rename, both argument names can be used,
either "name" or "room". So, this doesn't involve an API
version change.
2024-12-17 10:12:51 +01:00
Badlop 790cb104cd Change arguments and result to consistent names (API v3)
Commands accept as argument: user, host, room, service
and return as result JIDs

Commands that change in API v3:
get_room_affiliations
muc_register_nick
muc_unregister_nick
set_room_affiliation
status_list
status_list_host
subscribe_room
subscribe_room_many
unsubscribe_room
2024-12-17 10:12:48 +01:00
Badlop f3c935d2e1 Fix some documentation syntax, add links to toplevel, modules and API 2024-12-09 17:25:27 +01:00
Alexey Shchepin e589265921 Fix dialyzer errors 2024-12-06 21:56:02 +03:00
Alexey Shchepin eb6f242d99 Experimental support for joining Matrix rooms as MUC rooms 2024-12-06 20:20:12 +03:00
Badlop ce6d5aa6a0 Redis: Disable some dialyzer warnings when using old Erlang 20 2024-12-05 13:03:43 +01:00
Badlop f269d5b613 Redis: Add support for unix domain socket (#4318) 2024-12-05 13:01:40 +01:00
Badlop a84c492130 Redis: Use the recommended eredis:start_link/1 function 2024-12-05 13:01:38 +01:00
Badlop 3ae636b454 Redis: Use eredis 1.7.1 from Nordix when using mix/rebar3 and Erlang 21+ 2024-12-05 13:01:37 +01:00
Badlop 06e3f9f0a4 Runtime: Disable edoc when using old problematic Elixir versions 2024-12-05 13:01:35 +01:00
dependabot[bot] 1669303a40 Bump ex_doc from 0.34.2 to 0.35.1
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.34.2 to 0.35.1.
- [Release notes](https://github.com/elixir-lang/ex_doc/releases)
- [Changelog](https://github.com/elixir-lang/ex_doc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/elixir-lang/ex_doc/compare/v0.34.2...v0.35.1)

---
updated-dependencies:
- dependency-name: ex_doc
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-05 13:01:33 +01:00
Badlop 39e37b6175 Add support to define macros as environment variables
Define and macro by setting as environment variable:
  EJABBERD_MACRO_ + macro name

For example, if you configure in ejabberd.yml:
  define_macro:
    LOGLEVEL: 4
  loglevel: LOGLEVEL

You can define (and overwrite) that macro definition when starting ejabberd:
  EJABBERD_MACRO_LOGLEVEL=5 make relive
2024-12-05 13:01:31 +01:00
Badlop c72ba1f188 mod_scram_upgrade: Update XEP-0480 supported version (processone/xmpp#80) 2024-12-05 13:01:30 +01:00
Badlop 4d625e5574 Erlang/OTP 27 finally exports re:mp/0 2024-12-05 13:01:28 +01:00
Badlop 803f95050f WebAdmin: Fix calculation of node's uptime days 2024-12-05 13:01:26 +01:00
Badlop c021cf34be Explain that join_cluster returns immediately (since 5a34020, 24.06) 2024-12-05 13:01:23 +01:00
Holger Weiss 7fce7d1049 Merge remote-tracking branch 'processone/pr/4323'
* processone/pr/4323:
  Enable allow_unencrypted_sasl2 on websockets
2024-12-03 18:58:25 +01:00
Mark Zealey bd36895afe Enable allow_unencrypted_sasl2 on websockets
https://github.com/processone/ejabberd/commit/47232838 added the
allow_unencrypted_sasl2 option, but this was not added to websockets.
2024-12-03 17:39:58 +00:00
Holger Weiss b90c48f837 mod_scram_upgrade: Don't abort the upgrade
Fix a matching mistake that made the SASL mechanism upgrade fail.
2024-12-01 20:23:52 +01:00
Holger Weiss 344775aa8e mod_pubsub: Send notifications on PEP item retract 2024-11-30 20:38:33 +01:00
Badlop 7d0c20e133 mod_shared_roster: The name of a new group is lowercased
Until now it was possible to create a shared roster group with name
"Group1", and it was a different group that "group1".

From now on, new group names will be stored lowercase,
just like the username in a Jabber ID.

This only affects commands srg_add and srg_create.
All the other commands are still case sensitive, to allow admins of
existing databases with case-sensitive groups manage them.
2024-11-27 16:20:53 +01:00
Badlop ab5a2e8d10 mod_shared_roster: Get back support for groupid@vhost in displayed
Feature first implemented by 262157c in ejabberd 2.1.10
Bug introduced with cache improvements by 5b0f0d8 in ejabberd 21.07
2024-11-27 13:54:02 +01:00
Badlop e34c1ebcba WebAdmin: Fix link to displayed group when it is from another vhost 2024-11-27 13:54:00 +01:00
Badlop 73dbc01c2e WebAdmin: Shared group names are case sensitive, use original case instead of lowercase 2024-11-27 13:53:58 +01:00
Badlop f0773c4ab8 mix:exs: When development tools is enabled, add debugger and wx 2024-11-25 17:23:32 +01:00
Badlop cc5c9f6008 Fix problems introduced in two recent commits 2024-11-25 17:23:28 +01:00
Badlop da9c591eed Improve create_rooms_file command to support vhosts with different config
Until now it created all the rooms in the storage of the first vhost
listed in the ejabberd configuration file. Similarly, it used only
the default room options defined for the first vhost.
2024-11-25 16:20:30 +01:00
Badlop 6790ab01e8 Improve example Elixir modules 2024-11-25 16:20:19 +01:00
Badlop f9cecca362 Rename mod_presence_demo.ex to mod_example.ex 2024-11-25 16:20:16 +01:00
badlop f4009939a6 Merge pull request #4315 from Quobis/support-loading-elixir-modules-for-auth
feat: support loading Elixir modules for auth
2024-11-25 16:08:54 +01:00
Marcos de Vera Piquero 17b5b34e3c feat: support loading Elixir modules for auth
Allow to specify an Elixir module name in `auth_method`.

If the referenced module, `M`,  cannot be loaded as `ejabberd_auth_M`,
try to load it as `Elixir.M`.
2024-11-25 15:31:27 +01:00
Badlop c291c20a3b Fix problem starting ejabberd when first host uses SQL, other one mnesia
The problem appeared when there are several vhosts,
the first vhost uses SQL for persistent data (and RAM for volatile),
and another vhost wants to use Mnesia

Example config to trigger the problem:

  hosts:
    - mysql.localhost
    - localhost
  host_config:
    mysql.localhost:
      default_db: sql

In that case, ejabberd crashed at start with an error like:
[critical] Internal error of module mod_muc has occurred during start:
...
** exception exit: {aborted,
                     {no_exists,
                         [muc_room,
                          [{{muc_room,{'_',<<"conference.localhost">>},'_'},
                            [],
                            ['$_']}]]}}
2024-11-22 19:25:52 +01:00
Badlop 22e7ce37d4 Fix typos in previous commit 2024-11-22 19:25:49 +01:00
Badlop 2137602a6a Makefile: Add support to run "make format" when compiling with mix 2024-11-22 10:53:43 +01:00
dependabot[bot] c7b29b5a9a Bump dialyxir from 1.4.4 to 1.4.5
Bumps [dialyxir](https://github.com/jeremyjh/dialyxir) from 1.4.4 to 1.4.5.
- [Release notes](https://github.com/jeremyjh/dialyxir/releases)
- [Changelog](https://github.com/jeremyjh/dialyxir/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jeremyjh/dialyxir/compare/1.4.4...1.4.5)

---
updated-dependencies:
- dependency-name: dialyxir
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-22 10:53:04 +01:00
Badlop 715b5b64c6 Runtime: Test Dialyzer in Rebars jobs (#4281)
The CI workflow uses ubuntu-24.04 and setup-beam action,
so it can test only Erlang/OTP 24 and higher.

To ensure Dialyzer is also ran with older Erlang versions,
let's add Dialyzer testing to the Runtime workflow,
which uses the erlang container, and that allows
to run Erlang/OTP 20 in ubuntu-24.04.
2024-11-14 13:58:14 +01:00
Badlop c20ed8c7b3 Runtime: Try using elixir container for Rebar3+Elixir and Mix jobs (#4281) 2024-11-14 13:58:11 +01:00
Badlop d3baacd78e Workflows: Bump ubuntu from 22.04 to 24.04 when possible (#4281) 2024-11-14 13:58:07 +01:00
Badlop 07e20784cb New evacuate_kindly command: kick users and prevent login (#4309) 2024-11-14 13:57:47 +01:00
Badlop 9eb8bb6c40 mod_matrix_gw_s2s probably works correctly only in Erlang/OTP >= 25
In Erlang/OTP 25, the function inet_res:getbyname/3
returns {ok, Hostent} where the last tuple element of Hostent
may be h_addr_list = [inet:ip_address()]}
or H_addr_list :: [dns_data()]}

However, in Erlang/OTP 24.1 and older, that element was only of type
h_addr_list = [inet:ip_address()]}

https://erlang.org/documentation/doc-13.0-rc3/lib/kernel-8.4/doc/html/inet_res.html#getbyname-3
https://erlang.org/documentation/doc-12.1/lib/kernel-8.1/doc/html/inet_res.html#getbyname-3
2024-11-14 13:57:47 +01:00
Badlop e10c0f3120 Bump Expat to 2.6.4 2024-11-14 13:57:47 +01:00
Badlop 6f7efebb56 Only delete offline msgs when user has MAM enabled (#4287) 2024-11-14 13:57:43 +01:00
Badlop a657778065 Result of running "make doap" 2024-11-14 13:57:43 +01:00
Badlop 3650d94bb5 Remove XEPs that are only a client thing 2024-11-14 13:57:43 +01:00
Badlop 6a428f3d02 Add ejabberd version and implementation status for many XEPs 2024-11-14 13:57:43 +01:00
Badlop abe1d96c58 Announce support for XEP-0384 OMEMO Encryption (#4305)
The last required piece to support XEP-0384 was
supporting max_items=max, which was added for ejabberd 21.12 in commit
8f8de0403b
2024-11-14 13:57:39 +01:00
Badlop 29a59cfe48 Add "XMPP Date and Time Profiles" implemented by xmpp and used everywhere 2024-11-14 13:49:41 +01:00
Holger Weiss 18c54f4e9e ejabberd.yml.example: Use non-standard STUN port
STUN via UDP can easily be abused for reflection/amplification DDoS
attacks.  Suggest a non-standard port to make it harder for attackers to
discover the service.

Modern XMPP clients discover the port via XEP-0215, so there's no
advantage in sticking to the standard port.
2024-11-14 12:21:58 +01:00
Paweł Chmielowski c7d967a2b5 Fix dialyzer issue 2024-11-05 17:10:09 +01:00
Paweł Chmielowski b50ea7ef1f Make mod_privilge properly handle roster iq 2024-11-05 16:57:52 +01:00
Holger Weiss 4843cd432f Disable the systemd watchdog by default
Some users reported ejabberd being restarted by systemd due to missing
watchdog pings despite the actual service operating just fine.  So far,
we weren't able to track down the issue, so we'll no longer enable the
watchdog in our example service unit.

Closes #4054.
2024-11-05 15:37:21 +01:00
Paweł Chmielowski d56eae809d Catch extra case in check for s2s bidi element 2024-11-05 13:26:42 +01:00
Metalhearf af97211ecc Update URLs in docs/conf files for consistency. 2024-10-31 17:30:20 +01:00
Badlop 601fcba4cb Set version to 24.10
Container / Container (push) Failing after 55s
Installers / Binaries (push) Failing after 49s
Runtime / Rebars (20, rebar) (push) Failing after 4s
Runtime / Rebars (20, rebar3) (push) Failing after 5s
Runtime / Rebars (25, rebar) (push) Failing after 4s
Runtime / Rebars (25, rebar3) (push) Failing after 4s
Runtime / Rebars (26, rebar) (push) Failing after 4s
Runtime / Rebars (26, rebar3) (push) Failing after 4s
Runtime / Rebars (27, rebar3) (push) Failing after 4s
Installers / Release (push) Has been skipped
CI / Tests (20.0) (push) Has been cancelled
CI / Tests (25) (push) Has been cancelled
CI / Tests (26) (push) Has been cancelled
CI / Tests (27) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.13, 23.0) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.13, 25) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.15, 25) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.15, 26) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.16, 25) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.16, 26) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.17, 25) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.17, 26) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.17, 27) (push) Has been cancelled
Runtime / Mix (1.13, 23.0) (push) Has been cancelled
Runtime / Mix (1.13, 25) (push) Has been cancelled
Runtime / Mix (1.15, 25) (push) Has been cancelled
Runtime / Mix (1.15, 26) (push) Has been cancelled
Runtime / Mix (1.16, 25) (push) Has been cancelled
Runtime / Mix (1.16, 26) (push) Has been cancelled
Runtime / Mix (1.17, 25) (push) Has been cancelled
Runtime / Mix (1.17, 26) (push) Has been cancelled
Runtime / Mix (1.17, 27) (push) Has been cancelled
2024-10-28 17:02:10 +01:00
Badlop cc3a9f7722 Update Changelog to 24.10 2024-10-28 16:34:25 +01:00
Badlop 296ef8287f Remove mod_tombstone from man, it's in ejabberd-contrib (thanks to Licaon_Kter) 2024-10-28 16:34:22 +01:00
Paweł Chmielowski b5dab24679 Update dependencies 2024-10-28 16:21:44 +01:00
Badlop 319414b985 Update man page to 24.10 2024-10-28 13:50:02 +01:00
Badlop 6b0058c89c Add two more version notes 2024-10-28 13:50:02 +01:00
Badlop 855c828d1f Update Spanish and Catalan translations 2024-10-28 13:35:49 +01:00
Badlop c72ef537ee Update Chinese (Simplified) translation (thanks to Sketch6580) 2024-10-28 13:35:47 +01:00
Badlop 11e86811a0 Update Portuguese (Brazil) translation (thanks to Wellington Uemura) 2024-10-28 13:35:46 +01:00
Badlop 2183f60917 Update Italian translation (thanks to Ermete Melchiorre) 2024-10-28 13:35:45 +01:00
Badlop 05f0fbf195 Update Bulgarian translation (thanks to MrEddX) 2024-10-28 13:35:43 +01:00
Badlop 853da159de ejabberd.yml.example: Enable mod_s2s_bidi in default configuration 2024-10-28 12:06:56 +01:00
Badlop 643ae7e5f9 Result of running "make doap options" 2024-10-28 12:06:55 +01:00
Badlop 322e25d18e CI: Get again continue-on-error for XMPP Interop Tests
See explanations following the comment
https://github.com/processone/ejabberd/pull/4285#issuecomment-2397047355

This partially reverts commit 94c2a115d5.
2024-10-28 12:06:53 +01:00
Badlop bdd8ba115e Document ejabberd version of the new modules 2024-10-28 12:06:51 +01:00
Badlop 71ad7c368d Minor improvements to support mod_tombstones
New check_register_user hook in ejabberd_auth.erl
to allow blocking account registration when a tombstone exists.

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

mod_tombstones is available in experimental mode in ejabberd-contrib git.

Initial feature request: #2546
2024-10-28 12:06:48 +01:00
Paweł Chmielowski 8be0f8a0b0 Revert some unrelated changes 2024-10-28 09:44:05 +01:00
Paweł Chmielowski e9e678a994 Add support for scram upgrade tasks 2024-10-28 09:26:04 +01:00
Paweł Chmielowski a89152a3d7 Add support for s2s bidi 2024-10-28 09:25:56 +01:00
Linus Jahn 73f5d950e5 mix_pam: Remove 'Channels' roster group of mix channels
This isn't specified and was probably only meant for debugging. In real
clients having this (forced) 'Channels' group is undesireable in most
cases.
2024-10-26 12:57:15 +02:00
Badlop 46d5ab369f Update xmpp dependency 2024-10-21 17:23:59 +02:00
Badlop 81906b74ed Support "IQ permission" from XEP-0356 0.4.1 (#3889) 2024-10-21 17:23:59 +02:00
Badlop 74b0f64645 mod_block_strangers: Add feature announcement to disco-info (#4039) 2024-10-21 17:23:59 +02:00
Badlop 50948d1619 mod_mam: Advertise XEP-0424 feature in server disco-info (#3340) 2024-10-21 17:23:49 +02:00
Holger Weiss 38f1132192 ejabberd_stun: Omit 'auth_realm' log message
These days, TURN authentication is usually performed using ephemeral
credentials handed out by mod_stun_disco.  In that case, the TURN realm
is irrelevant.  Therefore, omit the misleading log message that warned
about a missing realm configuration.

(Commit 6eb2f07274 reduced the log level
of that message already.)
2024-10-15 22:50:30 +02:00
Badlop 50ef49d190 mod_vcard: Return explicit error stanza when user attempts to modify other's vcard 2024-10-11 11:54:18 +02:00
Badlop 3669ac8aed ejabberd_app: At server start, log Erlang and Elixir versions 2024-10-11 11:54:16 +02:00
Badlop 7f8519c0af ejabberdctl: If ERLANG_NODE lacks host, add hostname (#4288) 2024-10-11 11:49:34 +02:00
dependabot[bot] 859ba3e0c2 Bump dialyxir from 1.4.3 to 1.4.4
Bumps [dialyxir](https://github.com/jeremyjh/dialyxir) from 1.4.3 to 1.4.4.
- [Release notes](https://github.com/jeremyjh/dialyxir/releases)
- [Changelog](https://github.com/jeremyjh/dialyxir/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jeremyjh/dialyxir/compare/1.4.3...1.4.4)

---
updated-dependencies:
- dependency-name: dialyxir
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 11:49:30 +02:00
Badlop 94c2a115d5 CI: Disable XMPP Interop specifications that are known to fail 2024-10-11 11:49:28 +02:00
badlop 634b646711 Merge pull request #4285 from guusdk/xmpp-interop-testing
CI: Add XMPP Interop tests
2024-10-11 11:03:26 +02:00
Holger Weiss 2a9dc2c7b2 make-binaries: Bump Erlang/OTP version to 26.2.5.4 2024-10-09 15:37:47 +02:00
Holger Weiss ef93a5359b Bump 'xmpp' dependency tag
This fixes announcing SASL2 over non-TLS connections if
'allow_unencrypted_sasl2' is configured.
2024-10-08 17:38:11 +02:00
Badlop efb1fc9b3f mod_register: Document behavior when access is set to none (#4078) 2024-10-01 15:57:19 +02:00
Badlop aa5faf1f36 mod_privilege: Replace try...catch with a clean alternative 2024-10-01 15:57:15 +02:00
Holger Weiss 4723283896 ejabberd_c2s: Optionally allow unencrypted SASL2
XEP-0388 says: "SASL2 MUST only be used by Clients or offered by Servers
after TLS negotiation".  Therefore, we reject SASL2 negotiations over
unencrypted transports by default.  However, TLS might be terminated
outside of ejabberd.  Add the 'allow_unencrypted_sasl2' option to
support this use case.
2024-09-29 20:40:01 +02:00
Holger Weiss 36187e07d0 mod_pubsub: Fall back to default plugin options
If the plugin handling a node creation request isn't enabled, fall back
to applying the default plugin (currently node_flat) options.
2024-09-28 17:58:07 +02:00
Holger Weiss a9583b43c3 mod_pubsub: Fix choice of node config defaults
Ignore node plugin defaults if the plugin handling the request isn't
enabled, rather than ignoring 'default_node_config' options and
applying plugin defaults in that case.
2024-09-28 17:51:28 +02:00
Holger Weiss ca54f81f58 mod_pubsub: Fix merging of default node options
Use any option specified via 'default_node_config' by default, and take
the remaining defaults from the node plugin handling the request.  This
is the documented behavior.

Before this change, the code applied the plugin defaults only if no
'default_node_config' existed at all.  And even this logic didn't work
as intended, since 'default_node_config' yielded an empty list in case
it wasn't configured, which resulted in plugin defaults never being
applied.
2024-09-28 16:56:46 +02:00
Holger Weiss b4399291ef mod_pubsub: Fix default node config parsing
Don't merge 'default_node_config' settings with the default options of
the first configured node plugin.  Otherwise, the latter might later
override those of the plugin that should handle a node creation request.
For example, the following configuration would lead to the 'flat'
options being used by default for 'pep' nodes as well:

  mod_pubsub:
    plugins:
      - flat
      - pep
2024-09-28 16:45:59 +02:00
Guus der Kinderen a8df58f056 CI: Limit execution of XMPP Interop tests
Run the XMPP Interop tests on only one build of the CI-matrix. This prevents redundant testing, as well as logs overwriting each-other.
2024-09-27 09:55:18 +02:00
Guus der Kinderen 54a89b39fb CI: Add XMPP Interop tests
Modifies the CI build to integrate the GitHub Action-based test runner from the [XMPP Interop Testing project](https://xmpp-interop-testing.github.io). This executes additional integration tests that help verify ejabberd's compliance with XMPP specifications.

In this commit, none of the tests are excluded, which likely results in false positives. Therefor, the 'continue-on-error' flag is set. This should ideally be removed in a later commit.
2024-09-26 21:45:51 +02:00
Badlop 4a931b42ab hooks_deps: Hide false-positive warnings about gen_mod 2024-09-24 12:37:06 +02:00
Badlop 15d73b9d20 Support to block IPs in a vhost using append_host_config (#4038) 2024-09-24 12:20:16 +02:00
Badlop c2d4f73893 Move some modules webadmin pages to their modules 2024-09-16 17:50:47 +02:00
Badlop 31b85351f2 Add new "MAM Archive" page to webadmin 2024-09-16 17:50:46 +02:00
Badlop c900f0ad83 WebAdmin: Improve pages to handle disabled modules 2024-09-16 17:50:44 +02:00
Badlop b2e6749fd2 Fix dialyzer: captcha_cmd is a binary for sure 2024-09-16 17:50:43 +02:00
Badlop 2437dc4e06 New command get_mam_count to get number of archived messages for an account 2024-09-16 17:50:42 +02:00
Badlop 115e7d08aa Add links in user page to offline and roster pages 2024-09-16 17:50:40 +02:00
Badlop d9ddbe0212 Add mam and offline tags to the related purge commands 2024-09-16 17:50:39 +02:00
Badlop 512285e48d Result of running "make options" 2024-09-16 17:50:38 +02:00
Badlop 642e7ecc29 mod_matrix_gw: Remove useless option "persist" 2024-09-16 17:50:37 +02:00
Badlop ce5a8acaf7 Define the types of options that opt_type.sh cannot derive automatically 2024-09-16 17:50:33 +02:00
Holger Weiss 3d9a5a1635 Fix 'update' command output
So far, ejabberd_update:update/0 returned the return value of
release_handler_1:eval_script/1.  That function returns the list of
updated but unpurged modules, i.e., modules where one or more processes
are still running an old version of the code.  Since commit
5a34020d23, the ejabberd 'update' command
assumes that value to be the list of updated modules instead.  As
that seems more useful, modify ejabberd_update:update/0 accordingly.
This fixes the 'update' command output.
2024-09-14 21:54:01 +02:00
Holger Weiss 3469a51f58 mod_pubsub: Don't blindly echo PEP notification
Since commit 514c25caef, whenever a PEP
item was published, a notification was blindly sent back to the owner.
However, this should only be done subject to +notify filtering, as per
XEP-0163:

| the PEP service shall send notifications to all of the account owner's
| available resources (subject to notification filtering).

The motivation for the mentioned commit was that +notify subscriptions
initially didn't work for PEP node owners (#2108).  However, that issue
was fixed by commit 5968bc9318 (#2112).
As a result, the owner's client was actually notified twice if the
client was subscribed to the node (e.g., via +notify).

Therefore, just omit the additional, blind notification.

Thanks to W. Martin Borgert and Daniel Gultsch for reporting the issue.
2024-09-13 20:50:00 +02:00
Paweł Chmielowski d4b30957a3 Skip non-delivery errors for local pubsub generated notifications
Those are ignored by pubsub service anyway, so we can skip those, and
reduce number of messages processed by pubsub process.
2024-09-11 13:20:53 +02:00
Badlop cc377bbebf Update lock files 2024-09-11 11:39:39 +02:00
Badlop eec836239f Improve documentation of ldap_servers and ldap_backups options (#3977) 2024-09-11 11:39:34 +02:00
Badlop 941d51a6e7 Handle call by gen_event:swap_handler (#4233) 2024-09-11 11:39:30 +02:00
Holger Weiss e3243fa35b make-binaries: Update OpenSSL URLs 2024-09-06 19:18:32 +02:00
Holger Weiss 70512c7116 make-binaries: Bump dependency versions 2024-09-06 19:05:12 +02:00
Paweł Chmielowski 3c896d1c6a Better handling of malformed jids in send_direct_invitation command 2024-09-02 12:49:39 +02:00
Paweł Chmielowski b455d93c69 Fix dialyzer warnings 2024-09-02 12:42:55 +02:00
Paweł Chmielowski 017b2feac1 Make set_presence command return error when session not found
Should fix issue #4274
2024-09-02 12:01:56 +02:00
Paweł Chmielowski 5f47860ee1 Remove support for old websocket connection protocol
This removes handling of pre-rfc7395 encapsulation of xmpp in websocket
(where data send in websocket was using just raw data as send in regular
socket). This didn't work correctly for last 5 years, and as we didn't
see complains about this, we can assume it's not used anymore.
2024-09-02 11:55:46 +02:00
Badlop 795498fa45 Runtime: Cache hex.pm archive from rebar3 and mix 2024-08-26 15:50:25 +02:00
Badlop aa1717ee77 CI: Add Elvis tests 2024-08-26 15:50:25 +02:00
Badlop db6d3e63f2 Fix Elvis report: Fix dollar space syntax
https://github.com/inaka/elvis_core/blob/main/doc_rules/elvis_style/no_dollar_space.md
2024-08-26 15:50:25 +02:00
Badlop 0304428d95 Fix Elvis report: Remove spaces in weird places
https://github.com/inaka/elvis_core/blob/main/doc_rules/elvis_style/no_space.md
2024-08-26 15:50:25 +02:00
Badlop 74b80bfe08 Fix Elvis report: Don't use ignored variables
https://github.com/inaka/elvis_core/blob/main/doc_rules/elvis_style/used_ignored_variable.md
2024-08-26 15:48:32 +02:00
Badlop 90ce65e4dc Fix Elvis report: Remove trailing whitespace characters
https://github.com/inaka/elvis_core/blob/main/doc_rules/elvis_text_style/no_trailing_whitespace.md
2024-08-26 15:48:32 +02:00
Badlop d4d9771a71 Makefile: Add support for "make elvis" when using rebar3 2024-08-26 15:48:32 +02:00
Badlop 70ee294079 elvis.config: Fix file syntax, set vim mode, disable many tests
Let's disable the tests that would require major changes in existing
ejabberd source code, and fixing them would produce a curtain of changes
that would difficult using git blame and git log, but provide minimal
benefits.

Don't check erlang header files by now.

Don't check rebar.config because it has customizations that must be
parsed by rebar.config.script to have suitable syntax.
2024-08-26 15:48:32 +02:00
Badlop 5f4d17621f Fix Erlang LS warning about unused macro definitions
Macro name + commit when it was added - commit when usage was removed:

* BATCH_SIZE + f6db8428 - 71c44bff8
* INVALID_SETTING_MSG - 6b126171d - 381065397
* POLICY_ACCESS + 7c1e7e5b - 56d273477
* PROCNAME + 068db1a2 - 6876a37e6
* SALT_LENGTH + e575c87e - 633b68db1
* SERVER + 068db1a2 - but was never used!
* SERVER + f44e23b8c - but was never used!
* STORAGE_TYPES + 92db9ff1 - 9a93acc62
* TCP_SEND_TIMEOUT + f0af10e6 - 6e900d6a8
* TDTD + c3280e9 - 5a34020
* TVFIELD + dcc05ac8 - da310a517
2024-08-26 15:48:32 +02:00
Badlop 8f4179050b erlang_ls.config: Let it find paths, update to Erlang 26, enable crossref 2024-08-26 15:48:32 +02:00
Badlop fddacd51a4 .vscode/launch.json: Experimental support for debugging with Neovim 2024-08-26 15:48:32 +02:00
Badlop e726ba9a8b .vscode/relive.sh: Update to benefit from ejabberd 24.02 behaviour 2024-08-26 15:48:32 +02:00
Badlop da1673e264 mix.lock: Don't mention Relive deps, otherwise they are always downloaded 2024-08-26 15:48:32 +02:00
Badlop 7cd34d3709 CONTAINER.md: Use same general badges in both container images readme files 2024-08-26 15:48:32 +02:00
Paweł Chmielowski ec7fd05987 Update xmpp once more 2024-08-24 15:27:58 +02:00
Paweł Chmielowski 34a58863e3 Update xmpp dep 2024-08-24 13:16:03 +02:00
Paweł Chmielowski 3237a955e5 Fix dep spec for rebar2 2024-08-23 20:56:52 +02:00
Paweł Chmielowski 8e7489c2be Remove duplicate dep from mix.exs 2024-08-23 20:52:36 +02:00
Paweł Chmielowski df5202a2f0 Update deps to bring improved s2s fallback for invalid direct tls connections
This allows connections to server that have both xmpps-server and xmpp-server
srv entries, for which xmpps version doesn't work correctly. Before this
change we would stop on non-working xmpps server, now we will also attempt
to connect further servers on list.
2024-08-23 20:48:53 +02:00
Badlop db3a5d8915 Start ExSync manually to ensure it's started if (and only if) Relive 2024-08-21 10:51:59 +02:00
Badlop 6110f213de Return error stanza when storage doesn't support vcard update (#4266) 2024-08-21 10:51:56 +02:00
Badlop e99fe98db4 Remove from extra_applications the apps already defined in deps (#4265) 2024-08-21 10:51:53 +02:00
Michael Slezak b07e28be2c Fix 'mix release' error: logger being regular and included application (#4265) 2024-08-21 10:51:51 +02:00
Badlop 937d5fe495 Document which SQL servers can really use update_sql_schema 2024-08-21 10:51:49 +02:00
Badlop 01141e5f69 Relax password complexity in test database
This password is not strong enough in MSSQL 2022, relax this restriction
  https://learn.microsoft.com/en-us/sql/relational-databases/security/password-policy?view=sql-server-ver16
  https://learn.microsoft.com/en-us/sql/t-sql/statements/create-login-transact-sql?view=sql-server-ver16#check_policy---on--off-
2024-08-21 10:51:46 +02:00
Badlop 15569d0b13 Add links in top-level options documentation to their Docs website sections 2024-08-12 16:25:42 +02:00
Badlop 918806006c Update fast_xml to use use_maps and remove obsolete elixir files 2024-08-09 12:31:37 +02:00
Badlop d5e030a638 CI: Tell sqlcmd to trust server self-signed certificate
As explained in
https://techcommunity.microsoft.com/t5/sql-server-blog/odbc-driver-18-0-for-sql-server-released/ba-p/3169228

Version 18.0 of the Microsoft ODBC Driver 18 for SQL Server has been released.
BREAKING CHANGE - Default Encrypt to Yes/Mandatory.
2024-08-09 12:31:35 +02:00
Badlop 47f1beca0c CI: Update path to sqlcmd command in the mssql container
As mentioned in
https://learn.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker

Starting with SQL Server 2022 (16.x) CU 14 and SQL Server 2019 (15.x)
CU 28, the container images include the new mssql-tools18 package.
The previous directory /opt/mssql-tools/bin is being phased out.
The new directory for Microsoft ODBC 18 tools is /opt/mssql-tools18/bin,
aligning with the latest tools offering.
2024-08-09 12:31:34 +02:00
Badlop a565b0e4c1 ext_mod: Handle info message when contrib module transfers table ownership 2024-08-09 12:31:29 +02:00
Badlop 10d1704899 mod_muc_rtbl: Fix call to gen_server:stop (#4260) 2024-07-22 13:28:47 +02:00
Badlop bc7c8e3952 Handle case when elixir support is enabled but not available
This happens when:
./configure --with-rebar=rebar3 --enable-elixir
make
rebar3 ct
2024-07-19 18:08:02 +02:00
Paweł Chmielowski 4e35515a8c Also change mysql.new.sql in similar way 2024-07-18 17:55:37 +02:00
Paweł Chmielowski d2a3fe3ed2 Fix column type in comment with schema update 2024-07-18 17:13:45 +02:00
Badlop 9bd1b39f9f Set version to 24.07
Container / Container (push) Failing after 41s
Installers / Binaries (push) Failing after 50s
Runtime / Rebars (20, rebar) (push) Failing after 3s
Runtime / Rebars (20, rebar3) (push) Failing after 3s
Runtime / Rebars (25, rebar) (push) Failing after 3s
Runtime / Rebars (25, rebar3) (push) Failing after 3s
Runtime / Rebars (26, rebar) (push) Failing after 2s
Runtime / Rebars (26, rebar3) (push) Failing after 3s
Runtime / Rebars (27, rebar3) (push) Failing after 2s
Installers / Release (push) Has been skipped
CI / Tests (20.0) (push) Has been cancelled
CI / Tests (25) (push) Has been cancelled
CI / Tests (26) (push) Has been cancelled
CI / Tests (27) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.13, 23.0) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.13, 25) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.15, 25) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.15, 26) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.16, 25) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.16, 26) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.17, 25) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.17, 26) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.17, 27) (push) Has been cancelled
Runtime / Mix (1.13, 23.0) (push) Has been cancelled
Runtime / Mix (1.13, 25) (push) Has been cancelled
Runtime / Mix (1.15, 25) (push) Has been cancelled
Runtime / Mix (1.15, 26) (push) Has been cancelled
Runtime / Mix (1.16, 25) (push) Has been cancelled
Runtime / Mix (1.16, 26) (push) Has been cancelled
Runtime / Mix (1.17, 25) (push) Has been cancelled
Runtime / Mix (1.17, 26) (push) Has been cancelled
Runtime / Mix (1.17, 27) (push) Has been cancelled
2024-07-18 11:55:10 +02:00
Badlop 20a01a25e4 Update changelog 2024-07-18 11:55:07 +02:00
Badlop 68e69debff Update man page to 24.07 2024-07-18 11:55:05 +02:00
Badlop 7a333eecbe Update more translations translation 2024-07-18 11:11:55 +02:00
Badlop e274bcc87d Update Portuguese (Brazil) translation (thanks to Wellington Uemura) 2024-07-18 11:11:54 +02:00
Badlop c42cb2bbac Update Italian translation (thanks to Ermete Melchiorre) 2024-07-18 11:11:52 +02:00
Badlop 9ee7054823 Update Chinese translation (thanks to Sketch6580) 2024-07-18 11:11:51 +02:00
Badlop 65e16dcac1 make format 2024-07-18 11:11:48 +02:00
Paweł Chmielowski 97c2d6a29d Merge pull request #4259 from heyanyanchina123/fix_mysql
[fix] fix mysql.sql archive origin_id
2024-07-18 09:40:25 +02:00
haha 93cdee80ed [fix] fix mysql.sql archive origin_id 2024-07-18 15:14:39 +08:00
Holger Weiss 11055f61a6 make-installers: Don't edit too much
The init script and systemd units don't refer to "/opt/ejabberd", and
ejabberdctl doesn't refer to "/opt/ejabberd-$version".

Fixes #4258.
2024-07-17 13:33:46 +02:00
Paweł Chmielowski af99799e8a Use tagged deps 2024-07-17 11:11:00 +02:00
Paweł Chmielowski 926f60b2ed Output muc#roominfo_avatarhash in room disco info as per updated xep-0486
This should fix issue #4234.
2024-07-16 18:55:02 +02:00
Badlop 0fdbb03f54 Don't add iex to included_applications
- iex is unnecessary for ejabberd in OTP release
- adding iex breaks dialyzer when --enable-elixir
2024-07-16 17:16:35 +02:00
Badlop bd0332c716 ext_mod: Fix typo in log message 2024-07-16 17:16:33 +02:00
Badlop 45007809f6 CHANGELOG.md: Only include URLs at the end of line for plaintext readability 2024-07-16 17:16:31 +02:00
Badlop 0e0fdb440c CHANGELOG.md: Fix Issues URLs 2024-07-16 17:16:29 +02:00
Paweł Chmielowski 2016cf547f Make dialyzer happy 2024-07-16 15:56:41 +02:00
Paweł Chmielowski ead87e3727 Add option update_sql_schema_timeout to allow schema update use longer timeouts
This also makes batch of schema updates to single table use transaction,
which should help in not leaving table in inconsistent state if some update
steps fails (unless you use mysql where you can't rollback changes to
table schemas).
2024-07-16 15:42:00 +02:00
Paweł Chmielowski f56739fd9f Make any uncatched exception inside transaction trigger rollback 2024-07-16 15:42:00 +02:00
Paweł Chmielowski c5f2b389c3 Allow to configure number of restart in sql_transaction() 2024-07-16 15:42:00 +02:00
dependabot[bot] 4cc95dda42 Bump ex_doc from 0.34.1 to 0.34.2
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.34.1 to 0.34.2.
- [Release notes](https://github.com/elixir-lang/ex_doc/releases)
- [Changelog](https://github.com/elixir-lang/ex_doc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/elixir-lang/ex_doc/compare/v0.34.1...v0.34.2)

---
updated-dependencies:
- dependency-name: ex_doc
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-16 11:31:42 +02:00
Badlop 0bfbe3e154 Add ejabberd example config files to the hex package 2024-07-16 11:31:39 +02:00
Badlop 9bd6b11007 Use proper format depending on the formatter (#4256)
This fixes recent commmit 090a8e3
2024-07-16 11:31:35 +02:00
Paweł Chmielowski c013a59d16 Restore args conversion of {"k":"v"} to tuple lists in mod_http_api
Switching to json compatible output did broke this, which caused issues in
for example create_rooms_with_opts command.
2024-07-15 21:58:41 +02:00
Paweł Chmielowski aa02c4de1e Move logger app to included_applications
We don't particularly need this to start with ejabberd, and by having
it always started we will change logger to always use elixir formating.
2024-07-15 21:26:16 +02:00
badlop fb9e2b9603 Merge pull request #4256 from slezakattack/elixir_logger
Fix template error for elixir-enabled applications.
2024-07-15 11:00:07 +02:00
Badlop a70bdc0776 WebAdmin: Fix number of accounts shown in the online-users page 2024-07-15 10:59:16 +02:00
Badlop 936460212f Fix bug in 8a3344e when Elixir enabled but no need to compile elixir files 2024-07-15 10:59:14 +02:00
Holger Weiss 8ac51e63b5 node_pep: Add missing feature
Publishers may specify item identifiers for PEP nodes as well.

(Greetings to Thilo!)
2024-07-14 17:42:40 +02:00
Michael Slezak 090a8e3c95 Fix template error for elixir-enabled applications. 2024-07-12 14:39:42 -06:00
Badlop 101cce0c1e ext_mod: Fetch dependencies from hex.pm when mix is available
This doesn't work when running an OTP release build using mix,
which means it doesn't work in binary installers or containers;
only when using relive, or compiled with rebar3.

Set the desired hex package version in the module's rebar.config
For example, to fetch hex package recon 2.5.5 when mix is available,
and otherwise download using git: in the file
  ejabberd-contrib/ejabberd_observer_cli/rebar.config
set both the hex version and git details:
{deps, [
        {recon, "2.5.5", {git, "https://github.com/ferd/recon"}}
       ]}.
2024-07-12 15:47:10 +02:00
Badlop a935302a19 ejabberd.yml.example: Add api_permissions group for webadmin (#4249) 2024-07-12 15:46:01 +02:00
Badlop 9a0ff13cc2 mod_register: Send welcome message as 'chat' too (#4246)
Apparently, some clients don't display 'normal' messages to the user.
2024-07-12 15:45:59 +02:00
Badlop ef933c07cc WebAdmin: Support groupid with spaces when making shared roster result (#4245) 2024-07-12 15:45:57 +02:00
Badlop df5291e4bd ext_mod: Improve error result when problem compiling elixir file 2024-07-11 16:35:24 +02:00
Badlop 7a8c0331c1 mix.exs: Include Elixir's Logger in the OTP release, useful for libcluster 2024-07-11 16:35:23 +02:00
Badlop 28e37bcaad ext_mod: files_to_path is deprecated, use compile_to_path
As recommended in
https://github.com/elixir-lang/elixir/blob/d9cf285d7104db5a61607afe2ae4322220681a51/lib/elixir/lib/kernel/parallel_compiler.ex#L240
2024-07-11 16:35:21 +02:00
Badlop 8a3344e78a ext_mod: Compile all Elixir files in a library with one function call
Some Elixir libraries have files with dependencies between them.
Compiler can detect and solve those internal dependency if
we call Compile with a list of all the files
https://hexdocs.pm/elixir/1.17.2/Kernel.ParallelCompiler.html#compile/2

This is useful to compile libcluster
2024-07-11 16:35:18 +02:00
Badlop ce95f1f25a WebAdmin: Fix crash when viewing SRG created using ejabberd 24.02 (#4245) 2024-07-11 16:35:16 +02:00
Badlop f1739ce34d mod_register: Add example configuration of welcome_message option 2024-07-11 16:35:12 +02:00
Holger Weiss 1add1de23b ejabberd_options: Add trailing @ to @VERSION@
Thanks to Marc Schink for reporting the issue.
2024-07-05 22:41:18 +02:00
Paweł Chmielowski e25bdba16d Use error_logger when printing startup failure message 2024-07-05 10:25:59 +02:00
Paweł Chmielowski 7c63cd1000 Print message when starting ejabberd application fails 2024-07-05 09:57:21 +02:00
Badlop 4192190a96 Fix problem parsing tuples when using OTP 27 json library (#4242) 2024-07-04 16:55:28 +02:00
Badlop a733ba311c New tests for API commands
Only mod_http_api is tested right now; support to test also
ejabberdctl, ejabberd_xmlrpc and web_admin would be great.

This uses mod_example from ejabberd-contrib

How to run only those tests:
  CT_BACKENDS=no_db rebar3 ct --suite=test/ejabberd_SUITE --group=commands_single
2024-07-04 16:55:14 +02:00
Paweł Chmielowski fe472a63a0 Improve cross version handling of muc retractions 2024-07-04 13:57:25 +02:00
Paweł Chmielowski 25b78b73d0 Add ability to specify custom timeout for sql operations 2024-07-04 11:21:26 +02:00
Paweł Chmielowski b978a47925 Fix unused variable warning 2024-07-03 15:55:48 +02:00
Paweł Chmielowski b44b1304b8 Fix typo in last commit 2024-07-03 15:55:29 +02:00
Paweł Chmielowski a4fd756eae Add misc:json_encode_With_kv_lists and use it in matrix sign function
R27 json module doesn't recognize list of tuples as object specification,
so this creates wrapper that offer this functionality.
2024-07-03 15:20:48 +02:00
Paweł Chmielowski 8d4c1e3617 One more fix for pg91 in test suite 2024-07-03 13:44:48 +02:00
Paweł Chmielowski 54f5db851d Don't use host from url in webadmin, prefer host used for authentication 2024-07-03 13:15:33 +02:00
Paweł Chmielowski 35042ebc6a Make sql query in testsuite compatible with pg9.1 2024-07-03 12:38:48 +02:00
Mickaël Rémond 6c2dfd3d31 Update CODE_OF_CONDUCT.md
Try to limit the number of ping comments in the community. This can get into the way of efficient work and be considered a bit offensive for some users or maintainers.
2024-07-02 15:42:41 +02:00
Badlop 543b874a10 ext_mod: Handle case when contrib module has no *.ex and no *.erl 2024-07-02 13:43:37 +02:00
Badlop 4258d3dc24 Update rebar.lock 2024-07-02 13:43:35 +02:00
Badlop 949649e3a9 Fix typos (thanks to Jerome Sautret) 2024-07-02 13:43:33 +02:00
Pouriya 82d95ac81d feat: Hook subscribers 2024-07-02 12:38:54 +02:00
Alexey Shchepin 3124644315 Fix matrix_id_as_jid option documentation 2024-06-28 05:31:16 +03:00
368 changed files with 11913 additions and 4014 deletions
+55 -41
View File
@@ -1,20 +1,22 @@
#' Define default build variables
## specifc ARGs for METHOD='direct'
ARG OTP_VSN='26.2'
ARG ELIXIR_VSN='1.16.2'
## specifc ARGs for METHOD='package'
ARG ALPINE_VSN='3.19'
## general ARGs
ARG OTP_VSN='27.3.2'
ARG ELIXIR_VSN='1.18.3'
ARG UID='9000'
ARG USER='ejabberd'
ARG HOME="opt/$USER"
ARG METHOD='direct'
ARG BUILD_DIR="/$USER"
ARG VERSION='master'
################################################################################
#' METHOD='direct' - build and install ejabberd directly from source
FROM docker.io/erlang:${OTP_VSN}-alpine AS direct
#' Compile ejabberdapi
FROM docker.io/golang:1.24-alpine AS api
RUN go install -v \
github.com/processone/ejabberd-api/cmd/ejabberd@master \
&& mv bin/ejabberd bin/ejabberdapi
################################################################################
#' build and install ejabberd directly from source
FROM docker.io/erlang:${OTP_VSN}-alpine AS ejabberd
RUN apk -U add --no-cache \
autoconf \
@@ -39,7 +41,8 @@ ARG ELIXIR_VSN
RUN wget -O - https://github.com/elixir-lang/elixir/archive/v$ELIXIR_VSN.tar.gz \
| tar -xzf -
WORKDIR elixir-$ELIXIR_VSN
WORKDIR /elixir-$ELIXIR_VSN
ENV ERL_FLAGS="+JPperf true"
RUN make install clean
RUN mix local.hex --force \
@@ -50,6 +53,7 @@ COPY / $BUILD_DIR/
WORKDIR $BUILD_DIR
RUN mv .github/container/ejabberdctl.template . \
&& mv .github/container/ejabberd.yml.example . \
&& ./autogen.sh \
&& ./configure --with-rebar=mix --enable-all \
&& make deps \
@@ -67,36 +71,18 @@ RUN cp -p $BUILD_DIR/tools/captcha*.sh $HOME-$VERSION/lib
RUN find "$HOME-$VERSION/bin" -name 'ejabberd' -delete \
&& find "$HOME-$VERSION/releases" -name 'COOKIE' -delete
RUN wget -O "$HOME/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' \
&& sed -i '/^loglevel:/a \ \
\nca_file: /opt/ejabberd/conf/cacert.pem \
\ncertfiles: \
\n - /opt/ejabberd/conf/server.pem' "$HOME/conf/ejabberd.yml"
RUN wget -O "$HOME/conf/cacert.pem" 'https://curl.se/ca/cacert.pem'
################################################################################
#' METHOD='package' - install ejabberd from binary tarball package
FROM docker.io/alpine:${ALPINE_VSN} AS package
COPY tarballs/ejabberd-*-linux-musl-*.tar.gz /tmp/
WORKDIR /rootfs
ARG HOME
RUN home_root_dir=$(echo $HOME | sed 's|\(.*\)/.*|\1 |') \
&& mkdir -p $home_root_dir \
&& ARCH=$(uname -m | sed -e 's/x86_64/x64/;s/aarch64/arm64/') \
&& tar -xzf /tmp/ejabberd-*-linux-musl-$ARCH.tar.gz -C $home_root_dir
################################################################################
#' Prepare ejabberd for runtime
FROM ${METHOD} AS ejabberd
RUN apk -U add --no-cache \
git \
libcap \
openssl
WORKDIR /rootfs
ARG HOME
RUN mkdir -p usr/local/bin $HOME/conf $HOME/database $HOME/logs $HOME/upload
ARG BUILD_DIR
COPY --from=api /go/bin/ejabberdapi usr/local/bin/
RUN if [ ! -d $HOME/.ejabberd-modules ]; \
then \
if [ -d $BUILD_DIR/.ejabberd-modules ]; \
@@ -116,11 +102,35 @@ RUN export PEM=$HOME/conf/server.pem \
-days 3650 \
-subj "/CN=localhost"
RUN sed -i 's|^#CTL_OVER_HTTP=|CTL_OVER_HTTP=../|' "$HOME/conf/ejabberdctl.cfg"
RUN home_root_dir=$(echo $HOME | sed 's|\(.*\)/.*|\1 |') \
&& setcap 'cap_net_bind_service=+ep' $(find $home_root_dir -name beam.smp) \
&& echo -e \
"#!/bin/sh \
\n[ -z \$ERLANG_NODE_ARG ] && export ERLANG_NODE_ARG=ejabberd@localhost \
\nexport EMA=\"\$EJABBERD_MACRO_ADMIN\" \
\nexport HOST=\"\${EJABBERD_MACRO_HOST:-localhost}\" \
\nif [ -n \"\$EMA\" ] \
\nthen \
\n if [ \"\$EMA\" != \"\${EMA%%@*}\" ] \
\n then \
\n export USERNAME=\"\${EMA%%@*}\" \
\n export HOST=\"\${EMA##*@}\" \
\n else \
\n export USERNAME=\"\$EMA\" \
\n export SHOW_WARNING=\"true\" \
\n fi \
\nelif [ -n \"\$REGISTER_ADMIN_PASSWORD\" ] \
\nthen \
\n export USERNAME=\"admin\" \
\nelse \
\n export USERNAME=\"\$(od -A n -N 8 -t x8 /dev/urandom)\" \
\nfi \
\nexport EJABBERD_MACRO_ADMIN=\"\$USERNAME@\$HOST\" \
\n[ -n \"\$SHOW_WARNING\" ] && echo \"WARNING: The EJABBERD_MACRO_ADMIN environment variable was set to '\$EMA', but it should include the host... I'll overwrite it to become '\$EJABBERD_MACRO_ADMIN'.\" \
\n[ -n \"\$CTL_ON_CREATE\" ] && export SEPARATOR=\";\" \
\n[ -n \"\$REGISTER_ADMIN_PASSWORD\" ] && export CTL_ON_CREATE=\"register \${EJABBERD_MACRO_ADMIN%%@*} \${EJABBERD_MACRO_ADMIN##*@} \$REGISTER_ADMIN_PASSWORD \$SEPARATOR \$CTL_ON_CREATE\" \
\nexport CONFIG_DIR=/$HOME/conf \
\nexport LOGS_DIR=/$HOME/logs \
\nexport SPOOL_DIR=/$HOME/database \
@@ -137,28 +147,28 @@ RUN home_root_dir=$(echo $HOME | sed 's|\(.*\)/.*|\1 |') \
ARG UID
RUN chown -R $UID:$UID $HOME
RUN cp /rootfs/$HOME-$VERSION/lib/captcha*.sh usr/local/bin/
RUN mkdir $HOME/sql \
&& find /rootfs/$HOME-$VERSION/lib/ -name *.sql -exec cp {} $HOME/sql \; -exec cp {} $HOME/database \;
################################################################################
#' METHOD='direct' - Remove erlang/OTP & rebar3
FROM docker.io/erlang:${OTP_VSN}-alpine AS runtime-direct
#' Remove erlang/OTP & rebar3
FROM docker.io/erlang:${OTP_VSN}-alpine AS runtime
RUN apk del .erlang-rundeps \
&& rm -f $(which rebar3) \
&& find /usr -type d -name 'erlang' -exec rm -rf {} + \
&& find /usr -type l -exec test ! -e {} \; -delete
################################################################################
#' METHOD='package' - define runtime base image
FROM docker.io/alpine:${ALPINE_VSN} AS runtime-package
################################################################################
#' Update alpine, finalize runtime environment
FROM runtime-${METHOD} AS runtime
COPY --from=ejabberd /tmp/runDeps /tmp/runDeps
RUN apk -U upgrade --available --no-cache \
&& apk add --no-cache \
$(cat /tmp/runDeps) \
so:libcap.so.2 \
so:libtdsodbc.so.0 \
curl \
tini \
&& rm /tmp/runDeps \
&& ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so
ARG USER
@@ -167,9 +177,13 @@ ARG HOME
RUN addgroup $USER -g $UID \
&& adduser -s /sbin/nologin -D -u $UID -h /$HOME -G $USER $USER
RUN ln -fs /usr/local/bin/ /opt/ejabberd/bin
RUN rm -rf /home \
&& ln -fs /opt /home
################################################################################
#' Build together production image
FROM scratch AS prod
FROM scratch
ARG USER
ARG HOME
@@ -186,7 +200,7 @@ HEALTHCHECK \
WORKDIR /$HOME
USER $USER
VOLUME ["/$HOME"]
EXPOSE 1883 4369-4399 5210 5222 5269 5280 5443
EXPOSE 1880 1883 4369-4399 5210 5222 5269 5280 5443
ENTRYPOINT ["/sbin/tini","--","ejabberdctl"]
CMD ["foreground"]
+278
View File
@@ -0,0 +1,278 @@
###
### ejabberd configuration file
###
### The parameters used in this configuration file are explained at
###
### https://docs.ejabberd.im/admin/configuration
###
### The configuration file is written in YAML.
### *******************************************************
### ******* !!! WARNING !!! *******
### ******* YAML IS INDENTATION SENSITIVE *******
### ******* MAKE SURE YOU INDENT SECTIONS CORRECTLY *******
### *******************************************************
### Refer to http://en.wikipedia.org/wiki/YAML for the brief description.
###
define_macro:
HOST: localhost
## ADMIN: ... # set by /usr/local/bin/ejabberdctl
PORT_C2S: 5222
PORT_C2S_TLS: 5223
PORT_S2S: 5269
PORT_HTTP_TLS: 5443
PORT_HTTP: 5280
PORT_BROWSER: 1880
PORT_STUN: 5478
PORT_MQTT: 1883
PORT_PROXY65: 7777
hosts:
- HOST
loglevel: info
## If you already have certificates, list them here
# certfiles:
# - /etc/letsencrypt/live/domain.tld/fullchain.pem
# - /etc/letsencrypt/live/domain.tld/privkey.pem
ca_file: /opt/ejabberd/conf/cacert.pem
certfiles:
- /opt/ejabberd/conf/server.pem
listen:
-
port: PORT_C2S
ip: "::"
module: ejabberd_c2s
max_stanza_size: 262144
shaper: c2s_shaper
access: c2s
starttls_required: true
-
port: PORT_C2S_TLS
ip: "::"
module: ejabberd_c2s
max_stanza_size: 262144
shaper: c2s_shaper
access: c2s
tls: true
-
port: PORT_S2S
ip: "::"
module: ejabberd_s2s_in
max_stanza_size: 524288
shaper: s2s_shaper
-
port: PORT_HTTP_TLS
ip: "::"
module: ejabberd_http
tls: true
request_handlers:
/admin: ejabberd_web_admin
/api: mod_http_api
/bosh: mod_bosh
/captcha: ejabberd_captcha
/upload: mod_http_upload
/ws: ejabberd_http_ws
-
port: PORT_HTTP
ip: "::"
module: ejabberd_http
request_handlers:
/admin: ejabberd_web_admin
/.well-known/acme-challenge: ejabberd_acme
-
port: PORT_BROWSER
ip: "::"
module: ejabberd_http
request_handlers:
/: ejabberd_web_admin
-
port: "unix:../sockets/ctl_over_http.sock"
module: ejabberd_http
unix_socket:
mode: '0600'
request_handlers:
/ctl: ejabberd_ctl
-
port: PORT_STUN
ip: "::"
transport: udp
module: ejabberd_stun
use_turn: true
## The server's public IPv4 address:
# turn_ipv4_address: "203.0.113.3"
## The server's public IPv6 address:
# turn_ipv6_address: "2001:db8::3"
-
port: PORT_MQTT
ip: "::"
module: mod_mqtt
backlog: 1000
s2s_use_starttls: optional
acl:
local:
user_regexp: ""
loopback:
ip:
- 127.0.0.0/8
- ::1/128
admin:
user:
- ADMIN
access_rules:
local:
allow: local
c2s:
deny: blocked
allow: all
announce:
allow: admin
configure:
allow: admin
muc_create:
allow: local
pubsub_createnode:
allow: local
trusted_network:
allow: loopback
api_permissions:
"console commands":
from: ejabberd_ctl
who: all
what: "*"
"webadmin commands":
from: ejabberd_web_admin
who: admin
what: "*"
"admin access":
who:
access:
allow:
- acl: loopback
- acl: admin
oauth:
scope: "ejabberd:admin"
access:
allow:
- acl: loopback
- acl: admin
what:
- "*"
- "!stop"
- "!start"
"public commands":
who:
ip: 127.0.0.1/8
what:
- status
- connected_users_number
shaper:
normal:
rate: 3000
burst_size: 20000
fast: 100000
shaper_rules:
max_user_sessions: 10
max_user_offline_messages:
5000: admin
100: all
c2s_shaper:
none: admin
normal: all
s2s_shaper: fast
modules:
mod_adhoc: {}
mod_admin_extra: {}
mod_announce:
access: announce
mod_avatar: {}
mod_blocking: {}
mod_bosh: {}
mod_caps: {}
mod_carboncopy: {}
mod_client_state: {}
mod_configure: {}
mod_disco: {}
mod_fail2ban: {}
mod_http_api: {}
mod_http_upload:
put_url: https://@HOST@:5443/upload
custom_headers:
"Access-Control-Allow-Origin": "https://@HOST@"
"Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
"Access-Control-Allow-Headers": "Content-Type"
mod_last: {}
mod_mam:
## Mnesia is limited to 2GB, better to use an SQL backend
## For small servers SQLite is a good fit and is very easy
## to configure. Uncomment this when you have SQL configured:
## db_type: sql
assume_mam_usage: true
default: always
mod_mqtt: {}
mod_muc:
access:
- allow
access_admin:
- allow: admin
access_create: muc_create
access_persistent: muc_create
access_mam:
- allow
default_room_options:
mam: true
mod_muc_admin: {}
mod_offline:
access_max_user_messages: max_user_offline_messages
mod_ping: {}
mod_privacy: {}
mod_private: {}
mod_proxy65:
access: local
max_connections: 5
port: PORT_PROXY65
mod_pubsub:
access_createnode: pubsub_createnode
plugins:
- flat
- pep
force_node_config:
## Avoid buggy clients to make their bookmarks public
storage:bookmarks:
access_model: whitelist
mod_push: {}
mod_push_keepalive: {}
mod_register:
## Only accept registration requests from the "trusted"
## network (see access_rules section above).
## Think twice before enabling registration from any
## address. See the Jabber SPAM Manifesto for details:
## https://github.com/ge0rg/jabber-spam-fighting-manifesto
ip_access: trusted_network
mod_roster:
versioning: true
mod_s2s_bidi: {}
mod_s2s_dialback: {}
mod_shared_roster: {}
mod_stream_mgmt:
resend_on_timeout: if_offline
mod_stun_disco: {}
mod_vcard: {}
mod_vcard_xupdate: {}
mod_version:
show_os: false
### Local Variables:
### mode: yaml
### End:
### vim: set filetype=yaml tabstop=8
+56 -11
View File
@@ -71,6 +71,10 @@ done
: "${SPOOL_DIR:="{{spool_dir}}"}"
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
# backward support for old mnesia spool dir path
: "${SPOOL_DIR_OLD:="$SPOOL_DIR/$ERLANG_NODE"}"
[ -r "$SPOOL_DIR_OLD/schema.DAT" ] && [ ! -r "$SPOOL_DIR/schema.DAT" ] && SPOOL_DIR="$SPOOL_DIR_OLD"
# define erl parameters
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
if [ -n "$FIREWALL_WINDOW" ] ; then
@@ -265,7 +269,7 @@ help()
# dynamic node name helper
uid() {
ERTSVERSION="$("$ERL" -version 2>&1 | sed 's|.*\([0-9][0-9]\).*|\1|g')"
ERTSVERSION="$("$ERL" -version 2>&1 | sed 's|.* \([0-9]*[0-9]\).*|\1|g')"
if [ $ERTSVERSION -lt 11 ] ; then # otp 23.0 includes erts 11.0
# Erlang/OTP lower than 23, which doesn's support dynamic node code
N=1
@@ -305,6 +309,8 @@ stop_epmd()
# if all ok, ensure runtime directory exists and make it current directory
check_start()
{
ECSIMAGE_DBPATH=$HOME/database/$ERLANG_NODE
[ ! -d "$ECSIMAGE_DBPATH" ] && ln -s $HOME/database $HOME/database/$ERLANG_NODE
[ -n "$ERL_DIST_PORT" ] && return
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
pgrep -f "$ERLANG_NODE" >/dev/null && {
@@ -377,6 +383,54 @@ wait_status()
[ $timeout -gt 0 ]
}
exec_other_command()
{
if [ -z "$CTL_OVER_HTTP" ] || [ ! -S "$CTL_OVER_HTTP" ] \
|| [ ! -x "$(command -v curl)" ] || [ -z "$1" ] || [ "$1" = "help" ] \
|| [ "$1" = "mnesia_info_ctl" ]|| [ "$1" = "print_sql_schema" ] ; then
run_erl "$(uid ctl)" -hidden -noinput \
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
-s ejabberd_ctl \
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
result=$?
case $result in
3) help;;
*) :;;
esac
exit $result
else
exec_ctl_over_http_socket "$@"
fi
}
exec_ctl_over_http_socket()
{
COMMAND=${1}
CARGS=""
while [ $# -gt 0 ]; do
[ -z "$CARGS" ] && CARGS="[" || CARGS="${CARGS}, "
CARGS="${CARGS}\"$1\""
shift
done
CARGS="${CARGS}]"
TEMPHEADERS=temp-headers.log
curl \
--unix-socket ${CTL_OVER_HTTP} \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "${CARGS}" \
--dump-header ${TEMPHEADERS} \
--no-progress-meter \
"http://localhost/ctl/${COMMAND}"
result=$(sed -n 's/.*status-code: \([0-9]*\).*/\1/p' < $TEMPHEADERS)
rm ${TEMPHEADERS}
case $result in
2|3) exec_other_command help ${COMMAND};;
*) :;;
esac
exit $result
}
# ensure we can change current directory to SPOOL_DIR
[ -f "$SPOOL_DIR/schema.DAT" ] || FIRST_RUN=true
[ -d "$SPOOL_DIR" ] || run_cmd mkdir -p "$SPOOL_DIR"
@@ -452,15 +506,6 @@ case $1 in
;;
*)
set_dist_client
run_erl "$(uid ctl)" -hidden -noinput \
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
-s ejabberd_ctl \
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
result=$?
case $result in
2|3) help;;
*) :;;
esac
exit $result
exec_other_command "$@"
;;
esac
+37 -46
View File
@@ -25,11 +25,11 @@ jobs:
strategy:
fail-fast: false
matrix:
otp: ['20.0', '25', '26', '27']
runs-on: ubuntu-20.04
otp: ['25', '26', '27']
runs-on: ubuntu-24.04
services:
redis:
image: redis
image: public.ecr.aws/docker/library/redis
ports:
- 6379:6379
@@ -38,7 +38,7 @@ jobs:
- uses: actions/checkout@v4
- name: Test shell scripts
if: matrix.otp == '26'
if: matrix.otp == '27'
run: |
shellcheck test/ejabberd_SUITE_data/gencerts.sh
shellcheck tools/captcha.sh
@@ -50,13 +50,6 @@ jobs:
with:
otp-version: ${{ matrix.otp }}
- name: Get a compatible Rebar3
if: matrix.otp < 24
run: |
rm rebar3
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
chmod +x rebar3
- name: Install MS SQL Server
run: |
docker run -d -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=ejabberd_Test1" \
@@ -68,8 +61,8 @@ jobs:
- name: Prepare databases
run: |
docker exec ejabberd-mssql /opt/mssql-tools/bin/sqlcmd -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
docker exec ejabberd-mssql /opt/mssql-tools/bin/sqlcmd -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.sql
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.sql
sudo systemctl start mysql.service
sudo systemctl start postgresql.service
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
@@ -83,6 +76,8 @@ jobs:
WITH PASSWORD 'ejabberd_test';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
ON DATABASE ejabberd_test TO ejabberd_test;"
sudo -u postgres psql -c "GRANT ALL ON SCHEMA public TO ejabberd_test;"
sudo -u postgres psql -c "ALTER DATABASE ejabberd_test OWNER TO ejabberd_test;"
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
TABLES IN SCHEMA public
TO ejabberd_test;"
@@ -100,22 +95,13 @@ jobs:
- name: Remove syntax_tools from release
run: sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
- name: Cache rebar
- name: Cache Hex.pm
uses: actions/cache@v4
with:
path: |
~/.cache/rebar3/
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
- name: Download test logs
if: matrix.otp == '26' && github.repository == 'processone/ejabberd'
continue-on-error: true
run: |
mkdir -p _build/test
curl -sSL https://github.com/processone/ecil/tarball/gh-pages |
tar -C _build/test --strip-components=1 --wildcards -xzf -
rm -rf _build/test/logs/last/
- name: Compile
run: |
./autogen.sh
@@ -133,6 +119,7 @@ jobs:
- run: make xref
- run: make dialyzer
- run: make test-eunit
- run: make elvis
- name: Check Production Release
run: |
@@ -145,12 +132,30 @@ jobs:
cat $RE/logs/ejabberd.log
grep -q "is stopped in" $RE/logs/ejabberd.log
- name: Check Development Release
- name: Start Development Release
run: |
make dev
RE=_build/dev/rel/ejabberd
sed -i 's/starttls_required: true/starttls_required: false/g' $RE/conf/ejabberd.yml
$RE/bin/ejabberdctl start
$RE/bin/ejabberdctl started
$RE/bin/ejabberdctl register admin localhost admin
grep -q "is started in" $RE/logs/ejabberd.log
- name: Run XMPP Interoperability Tests against CI server.
if: matrix.otp == '27'
continue-on-error: true
uses: XMPP-Interop-Testing/xmpp-interop-tests-action@v1.5.0
with:
domain: 'localhost'
adminAccountUsername: 'admin'
adminAccountPassword: 'admin'
disabledSpecifications: RFC6121,XEP-0030,XEP-0045,XEP-0054,XEP-0060,XEP-0080,XEP-0115,XEP-0118,XEP-0215,XEP-0347,XEP-0363,XEP-0384
- name: Stop Development Release
if: always()
run: |
RE=_build/dev/rel/ejabberd
$RE/bin/ejabberdctl stop
$RE/bin/ejabberdctl stopped
cat $RE/logs/ejabberd.log
@@ -170,7 +175,7 @@ jobs:
./rebar3 cover
- name: Check results
if: always() && (steps.ct.outcome != 'skipped' || steps.ct2.outcome != 'skipped')
if: always() && (steps.ct.outcome != 'skipped')
id: ctresults
run: |
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
@@ -188,7 +193,7 @@ jobs:
find logs/ -name exunit.log -exec cat '{}' ';'
- name: Send to coveralls
if: matrix.otp == '26'
if: matrix.otp == '27'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
@@ -200,22 +205,6 @@ jobs:
"payload":{"build_num":$GITHUB_RUN_ID,
"status":"done"}}'
- name: Upload test logs
if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd'
uses: peaceiris/actions-gh-pages@v4
with:
publish_dir: _build/test
exclude_assets: '.github,lib,plugins'
external_repository: processone/ecil
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
keep_files: true
- name: View ECIL address
if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd'
run: |
CTRUN=`ls -la _build/test/logs/last | sed 's|.*-> ||'`
echo "::notice::View CT results: https://processone.github.io/ecil/logs/$CTRUN/"
- name: Check for changes to trigger schema upgrade test
uses: dorny/paths-filter@v3
id: filter
@@ -256,18 +245,20 @@ jobs:
run: |
[[ -d logs ]] && rm -rf logs
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
docker exec ejabberd-mssql /opt/mssql-tools/bin/sqlcmd -U SA -P ejabberd_Test1 -S localhost -Q "drop database [ejabberd_test];"
docker exec ejabberd-mssql /opt/mssql-tools/bin/sqlcmd -U SA -P ejabberd_Test1 -S localhost -Q "drop login [ejabberd_test];"
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -Q "drop database [ejabberd_test];"
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -Q "drop login [ejabberd_test];"
mysql -u root -proot -e "DROP DATABASE ejabberd_test;"
sudo -u postgres psql -c "DROP DATABASE ejabberd_test;"
docker exec ejabberd-mssql /opt/mssql-tools/bin/sqlcmd -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
docker exec ejabberd-mssql /opt/mssql-tools/bin/sqlcmd -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.new.sql
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.new.sql
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
TO 'ejabberd_test'@'localhost';"
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
ON DATABASE ejabberd_test TO ejabberd_test;"
sudo -u postgres psql -c "GRANT ALL ON SCHEMA public TO ejabberd_test;"
sudo -u postgres psql -c "ALTER DATABASE ejabberd_test OWNER TO ejabberd_test;"
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
TABLES IN SCHEMA public
TO ejabberd_test;"
-49
View File
@@ -1,8 +1,6 @@
name: Container
on:
schedule:
- cron: '22 2 */6 * *' # every 6 days to avoid gha cache being evicted
push:
paths-ignore:
- '.devcontainer/**'
@@ -28,52 +26,6 @@ jobs:
with:
fetch-depth: 0
- name: Cache build directory
uses: actions/cache@v4
with:
path: ~/build/
key: ${{runner.os}}-ctr-ct-ng-1.26.0
- name: Get erlang/OTP version for bootstrapping
run: |
echo "OTP_VSN=$(awk '/^otp_vsn=/ {{gsub(/[^0-9.rc-]/, ""); print}}' tools/make-binaries)" >> $GITHUB_ENV
echo "ELIXIR_VSN=$(awk '/^elixir_vsn=/ {{gsub(/[^0-9.]/, ""); print}}' tools/make-binaries)" >> $GITHUB_ENV
- name: Install prerequisites
run: |
sudo apt-get -qq update
sudo apt-get -qq install makeself
# https://github.com/crosstool-ng/crosstool-ng/blob/master/testing/docker/ubuntu21.10/Dockerfile
sudo apt-get -qq install build-essential autoconf bison flex gawk
sudo apt-get -qq install help2man libncurses5-dev libtool libtool-bin
sudo apt-get -qq install python3-dev texinfo unzip
- name: Install erlang/OTP
uses: erlef/setup-beam@v1
with:
otp-version: ${{ env.OTP_VSN }}
elixir-version: ${{ env.ELIXIR_VSN }}
version-type: strict
- name: Remove Elixir Matchers
run: |
echo "::remove-matcher owner=elixir-mixCompileWarning::"
echo "::remove-matcher owner=elixir-credoOutputDefault::"
echo "::remove-matcher owner=elixir-mixCompileError::"
echo "::remove-matcher owner=elixir-mixTestFailure::"
echo "::remove-matcher owner=elixir-dialyzerOutputDefault::"
- name: Build musl-libc based binary archives
run: |
sed -i "s|targets='.*'|targets='x86_64-linux-musl aarch64-linux-musl'|" tools/make-binaries
mv .github/container/ejabberdctl.template .
CHECK_DEPS=false tools/make-binaries
- name: Collect packages
run: |
mkdir tarballs
mv ejabberd-*.tar.gz tarballs
- name: Checkout ejabberd-contrib
uses: actions/checkout@v4
with:
@@ -111,7 +63,6 @@ jobs:
uses: docker/build-push-action@v6
with:
build-args: |
METHOD=package
VERSION=${{ steps.gitdescribe.outputs.ver }}
cache-from: type=gha
cache-to: type=gha,mode=max
+1 -1
View File
@@ -27,7 +27,7 @@ jobs:
uses: actions/cache@v4
with:
path: ~/build/
key: ${{runner.os}}-ct-ng-1.26.0
key: ${{runner.os}}-ct-ng-1.27.0
- name: Install prerequisites
run: |
sudo apt-get -qq update
+66 -81
View File
@@ -36,9 +36,9 @@ jobs:
exclude:
- otp: '27'
rebar: 'rebar'
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
container:
image: erlang:${{ matrix.otp }}
image: public.ecr.aws/docker/library/erlang:${{ matrix.otp }}
steps:
@@ -61,6 +61,17 @@ jobs:
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
- name: Cache Hex.pm
uses: actions/cache@v4
with:
path: |
~/.cache/rebar3/
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
- name: Get compatible Rebar binaries
if: matrix.rebar == 'rebar3' && matrix.otp < 21
run: rebar3 unlock eredis
- name: Compile
run: |
./autogen.sh
@@ -74,6 +85,8 @@ jobs:
- run: make xref
- run: make dialyzer
- name: Prepare rel (rebar2)
if: matrix.rebar == 'rebar'
run: |
@@ -151,59 +164,42 @@ jobs:
strategy:
fail-fast: false
matrix:
otp: ['23.0', '25', '26', '27']
elixir: ['1.13', '1.15', '1.16', '1.17']
exclude:
- otp: '23.0'
elixir: '1.15'
- otp: '23.0'
elixir: '1.16'
- otp: '23.0'
elixir: '1.17'
- otp: '26'
elixir: '1.13'
- otp: '27'
elixir: '1.13'
- otp: '27'
elixir: '1.15'
- otp: '27'
elixir: '1.16'
runs-on: ubuntu-20.04
elixir: ['1.13', '1.14', '1.15', '1.16', '1.17', '1.18']
runs-on: ubuntu-24.04
container:
image: public.ecr.aws/docker/library/elixir:${{ matrix.elixir }}
steps:
- uses: actions/checkout@v4
- name: Get specific Erlang/OTP
uses: erlef/setup-beam@v1
with:
otp-version: ${{matrix.otp}}
elixir-version: ${{matrix.elixir}}
- name: Get compatible Rebar binaries
if: matrix.otp < 24
run: |
rm rebar
rm rebar3
wget https://github.com/processone/ejabberd/raw/21.12/rebar
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
chmod +x rebar
chmod +x rebar3
- name: Prepare libraries
run: |
sudo apt-get -qq update
sudo apt-get -y purge libgd3 nginx
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
apt-get -qq update
apt-get -y purge libgd3 nginx
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
- name: Enable ModPresenceDemo and an Elixir dependency
- name: Enable Module.Example and an Elixir dependency
run: |
sed -i "s|^modules:|modules:\n 'ModPresenceDemo': {}|g" ejabberd.yml.example
sed -i "s|^modules:|modules:\n 'Ejabberd.Module.Example': {}|g" ejabberd.yml.example
cat ejabberd.yml.example
sed -i 's|^{deps, \[\(.*\)|{deps, [{decimal, ".*", {git, "https://github.com/ericmj/decimal", {branch, "main"}}},\n \1|g' rebar.config
cat rebar.config
- name: Cache Hex.pm
uses: actions/cache@v4
with:
path: |
~/.cache/rebar3/
key: ${{matrix.elixir}}-${{hashFiles('rebar.config')}}
- name: Install Hex and Rebar3 manually on older Elixir
if: matrix.elixir <= '1.14'
run: |
mix local.hex --force
mix local.rebar --force
- name: Compile
run: |
./autogen.sh
@@ -265,15 +261,15 @@ jobs:
grep -q '^user3$' registered.log
grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
grep -q 'module Presence Demo' _build/prod/rel/ejabberd/logs/ejabberd.log
grep -q 'Stopping Ejabberd.Module.Example' _build/prod/rel/ejabberd/logs/ejabberd.log
test $(find _build/prod/ -empty -name error.log)
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
grep -q 'module Presence Demo' _build/dev/rel/ejabberd/logs/ejabberd.log
grep -q 'Stopping Ejabberd.Module.Example' _build/dev/rel/ejabberd/logs/ejabberd.log
test $(find _build/dev/ -empty -name error.log)
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
grep -q 'module Presence Demo' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
grep -q 'Stopping Ejabberd.Module.Example' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
- name: View logs failures
@@ -291,41 +287,21 @@ jobs:
strategy:
fail-fast: false
matrix:
otp: ['23.0', '25', '26', '27']
elixir: ['1.13', '1.15', '1.16', '1.17']
exclude:
- otp: '23.0'
elixir: '1.15'
- otp: '23.0'
elixir: '1.16'
- otp: '23.0'
elixir: '1.17'
- otp: '26'
elixir: '1.13'
- otp: '27'
elixir: '1.13'
- otp: '27'
elixir: '1.15'
- otp: '27'
elixir: '1.16'
runs-on: ubuntu-20.04
elixir: ['1.13', '1.14', '1.15', '1.16', '1.17', '1.18']
runs-on: ubuntu-24.04
container:
image: public.ecr.aws/docker/library/elixir:${{ matrix.elixir }}
steps:
- uses: actions/checkout@v4
- name: Get specific Erlang/OTP
uses: erlef/setup-beam@v1
with:
otp-version: ${{matrix.otp}}
elixir-version: ${{matrix.elixir}}
- name: Prepare libraries
run: |
sudo apt-get -qq update
sudo apt-get -y purge libgd3 nginx
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
apt-get -qq update
apt-get -y purge libgd3 nginx
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
- name: Remove Elixir Matchers
run: |
@@ -335,17 +311,25 @@ jobs:
echo "::remove-matcher owner=elixir-mixTestFailure::"
echo "::remove-matcher owner=elixir-dialyzerOutputDefault::"
- name: Enable ModPresenceDemo and an Elixir dependency
- name: Enable Module.Example and an Elixir dependency
run: |
sed -i "s|^modules:|modules:\n 'ModPresenceDemo': {}|g" ejabberd.yml.example
sed -i "s|^modules:|modules:\n 'Ejabberd.Module.Example': {}|g" ejabberd.yml.example
cat ejabberd.yml.example
sed -i 's|^{deps, \(.*\)|{deps, \1\n {decimal, ".*", {git, "https://github.com/ericmj/decimal", {branch, "main"}}}, |g' rebar.config
cat rebar.config
- name: Unlock Jose dependency on older Erlang
if: matrix.otp < 24
- name: Cache Hex.pm
uses: actions/cache@v4
with:
path: |
~/.hex/
key: ${{matrix.elixir}}-${{hashFiles('mix.exs')}}
- name: Install Hex and Rebar3 manually on older Elixir
if: matrix.elixir <= '1.14'
run: |
mix deps.unlock jose
mix local.hex --force
mix local.rebar --force
- name: Compile
run: |
@@ -360,6 +344,7 @@ jobs:
- run: make dialyzer
- run: make edoc
if: matrix.elixir >= '1.14'
- name: Run rel
run: |
@@ -411,15 +396,15 @@ jobs:
grep -q '^user3$' registered.log
grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
grep -q 'module Presence Demo' _build/prod/rel/ejabberd/logs/ejabberd.log
grep -q 'Stopping Ejabberd.Module.Example' _build/prod/rel/ejabberd/logs/ejabberd.log
test $(find _build/prod/ -empty -name error.log)
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
grep -q 'module Presence Demo' _build/dev/rel/ejabberd/logs/ejabberd.log
grep -q 'Stopping Ejabberd.Module.Example' _build/dev/rel/ejabberd/logs/ejabberd.log
test $(find _build/dev/ -empty -name error.log)
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
grep -q 'module Presence Demo' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
grep -q 'Stopping Ejabberd.Module.Example' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
- name: View logs failures
+18 -1
View File
@@ -2,7 +2,24 @@
"version": "0.2.0",
"configurations": [
{
"name": "Relive",
"name": "Relive (Vim)",
"type": "erlang",
"request": "launch",
"runinterminal": [
"./rebar3", "shell",
"--apps", "ejabberd",
"--config", "rel/relive.config",
"--script", "rel/relive.escript",
"--name", "ejabberd@localhost",
"--setcookie", "COOKIE"
],
"projectnode": "ejabberd@localhost",
"cookie": "COOKIE",
"timeout": 900,
"cwd": "."
},
{
"name": "Relive (VSCode)",
"type": "erlang",
"request": "launch",
"runinterminal": [
+2 -2
View File
@@ -1,6 +1,6 @@
[ ! -f Makefile ] \
&& ./autogen.sh \
&& ./configure --with-rebar=./rebar3 \
&& make deps
&& ./configure --with-rebar=rebar3 \
&& make
make relive
+350 -31
View File
@@ -1,3 +1,322 @@
## Version 25.04
#### Security fixes
- Fixes issue with handling of user provided occupant-id in messages and presences sent to muc room. Server was replacing
just first instance of occupant-id with its own version, leaving other ones untouched. That would mean that depending
on order in which clients send occupant-id, they could see value provided by sender, and that could be used to spoof
as different sender.
#### Commands API
- `kick_users`: New command to kick all logged users for a given host
#### Bugfixes
- Fix issue with sql schema auto upgrade when using `sqlite` database
- Fix problem with container update, that could ignore previous data stored in `mnesia` database
- Revert limit of allowed characters in shared roster group names, that will again allow using symbols like `:`
## Version 25.03
#### Commands API
- `ejabberdctl`: New option `CTL_OVER_HTTP` ([#4340](https://github.com/processone/ejabberd/issues/4340))
- `ejabberd_web_admin`: Support commands with tuple arguments
- `mod_adhoc_api`: New module to execute API Commands using Ad-Hoc Commands ([#4357](https://github.com/processone/ejabberd/issues/4357))
- `mod_http_api`: Sort list elements in a command result
- Show warning when registering command with an existing name
- Fix commands unregistration
- `change_room_option`: Add forgotten support to set `enable_hats` room option
- `change_room_option`: Verify room option value before setting it ([#4337](https://github.com/processone/ejabberd/issues/4337))
- `create_room_with_opts`: Recommend using `;` and `=` separators
- `list_cluster_detailed`: Fix crash when a node is down
- `mnesia_list_tables`: Allow using this internal command
- `mnesia_table_change_storage`: Allow using this internal command
- `status`: Separate command result with newline
- `update_sql`: Fix updating tables created by ejabberd internally
- `update_sql`: Fix MySQL support
#### Configuration
- `acl`: Fix bug matching the acl `shared_group: NAME`
- `define_keyword`: New option to define keywords ([#4350](https://github.com/processone/ejabberd/issues/4350))
- `define_macro`: Add option to `globals()` because it's useless inside `host_config`
- `ejabberd.yml.example`: Enable `mod_muc_occupantid` by default
- Add support to use keywords in toplevel, listener and modules
- Show warning also when deprecated listener option is set as disabled ([#4345](https://github.com/processone/ejabberd/issues/4345))
#### Container
- Bump versions to Erlang/OTP 27.3 and Elixir 1.18.3
- Add `ERL_FLAGS` to compile elixir on qemu cross-platform
- Copy files to stable path, add ecs backwards compatibility
- Fix warning about relative workdir
- Improve entrypoint script: register account, or set random
- Link path to Mnesia spool dir for backwards compatibility
- Place `sockets/` outside `database/`
- Use again direct METHOD, qemu got fixed ([#4280](https://github.com/processone/ejabberd/issues/4280))
- `ejabberd.yml.example`: Copy main example configuration file
- `ejabberd.yml.example`: Define and use macros in the default configuration file
- `ejabberd.yml.example`: Enable `CTL_OVER_HTTP` by default
- `ejabberd.yml.example`: Listen for webadmin in a port number lower than any other
- `ejabberdapi`: Compile during build
- `CONTAINER.md`: Include documentation for ecs container image
#### Core and Modules
- `ejabberd_auth`: Add support for `auth_stored_password_types`
- `ejabberd_router`: Don't rewrite "self-addressed" privileged IQs as results ([#4348](https://github.com/processone/ejabberd/issues/4348))
- `misc`: Fix json version of `json_encode_with_kv_list` for nested kv lists ([#4338](https://github.com/processone/ejabberd/issues/4338))
- OAuth: Fix crashes when oauth is feed with invalid jid ([#4355](https://github.com/processone/ejabberd/issues/4355))
- PubSub: Bubble up db errors in `nodetree_tree_sql:set_node`
- `mod_configure`: Add option `access` to let configure the access name
- `mod_mix_pam`: Remove `Channels` roster group of mix channels ([#4297](https://github.com/processone/ejabberd/issues/4297))
- `mod_muc`: Document MUC room option vcard_xupdate
- `mod_privilege`: Accept non-privileged IQs from privileged components ([#4341](https://github.com/processone/ejabberd/issues/4341))
- `mod_private`: Improve exception handling
- `mod_private`: Don't warn on conversion errors
- `mod_private`: Handle invalid PEP-native bookmarks
- `mod_private`: Don't crash on invalid bookmarks
- `mod_s2s_bidi`: Stop processing other handlers in s2s_in_handle_info ([#4344](https://github.com/processone/ejabberd/issues/4344))
- `mod_s2s_bidi`: Fix issue with wrong namespace
#### Dependencies
- `ex_doc`: Bump to 0.37.2
- `stringprep`: Bump to 1.0.31
- `provider_asn1`: Bump to 0.4.1
- `xmpp` Bump to bring fix for ssdp hash calculation
- `xmpp` Bump to get support for webchat_url ([#3041](https://github.com/processone/ejabberd/issues/3041))
- `xmpp` Bump to get XEP-0317 Hats namespaces version 0.2.0
- `xmpp` Bump to bring SSDP to XEP version 0.4
- `yconf` Bump to support macro inside string
#### Development and Testing
- `mix.exs`: Keep debug info when building `dev` release
- `mix.exs`: The `ex_doc` dependency is only relevant for the `edoc` Mix environment
- `ext_mod`: add `$libdir/include` to include path
- `ext_mod`: fix greedy include path ([#4359](https://github.com/processone/ejabberd/issues/4359))
- `gen_mod`: Support registering commands and `hook_subscribe` in `start/2` result
- `c2s_handle_bind`: New event in `ejabberd_c2s` ([#4356](https://github.com/processone/ejabberd/issues/4356))
- `muc_disco_info_extras`: New event `mod_muc_room` useful for `mod_muc_webchat_url` ([#3041](https://github.com/processone/ejabberd/issues/3041))
- VSCode: Fix compiling support
- Add tests for config features `define_macro` and `define_keyword`
- Allow test to run using `ct_run`
- Fixes to handle re-running test after `update_sql`
- Uninstall `mod_example` when the tests has finished
#### Documentation
- Add XEPs that are indirectly supported and required by XEP-0479
- Document that XEP-0474 0.4.0 was recently upgraded
- Don't use backtick quotes for ejabberd name
- Fix values allowed in db_type of mod_auth_fast documentation
- Reword explanation about ACL names and definitions
- Update moved or broken URLs in documentation
#### Installers
- Bump Erlang/OTP 27.3 and Elixir 1.18.3
- Bump OpenSSL 3.4.1
- Bump crosstool-NG 1.27.0
- Fix building Termcap and Linux-PAM
#### Matrix Gateway
- Preserve XMPP message IDs in Matrix rooms
- Better Matrix room topic and room roles to MUC conversion, support room aliases in invites
- Add `muc#user` element to presences and an initial empty subject
- Fix `gen_iq_handler:remove_iq_handler` call
- Properly handle IQ requests
- Support Matrix room aliases
- Fix handling of 3PI events
#### Unix Domain Socket
- Add support for socket relative path
- Use `/tmp` for temporary socket, as path is restricted to 107 chars
- Handle unix socket when logging remote client
- When stopping listener, delete Unix Domain Socket file
- `get_auto_url` option: Don't build auto URL if port is unix domain socket ([#4345](https://github.com/processone/ejabberd/issues/4345))
## Version 24.12
#### Miscelanea
- Elixir: support loading Elixir modules for auth ([#4315](https://github.com/processone/ejabberd/issues/4315))
- Environment variables `EJABBERD_MACRO` to define macros
- Fix problem starting ejabberd when first host uses SQL, other one mnesia
- HTTP Websocket: Enable `allow_unencrypted_sasl2` on websockets ([#4323](https://github.com/processone/ejabberd/issues/4323))
- Relax checks for channels bindings for connections using external encryption
- Redis: Add support for unix domain socket ([#4318](https://github.com/processone/ejabberd/issues/4318))
- Redis: Use eredis 1.7.1 from Nordix when using mix/rebar3 and Erlang 21+
- `mod_auth_fast`: New module with support XEP-0484: Fast Authentication Streamlining Tokens
- `mod_http_api`: Fix crash when module not enabled (for example, in CT tests)
- `mod_http_api`: New option `default_version`
- `mod_muc`: Make rsm handling in disco items, correctly count skipped rooms
- `mod_offline`: Only delete offline msgs when user has MAM enabled ([#4287](https://github.com/processone/ejabberd/issues/4287))
- `mod_priviled`: Handle properly roster iq
- `mod_pubsub`: Send notifications on PEP item retract
- `mod_s2s_bidi`: Catch extra case in check for s2s bidi element
- `mod_scram_upgrade`: Don't abort the upgrade
- `mod_shared_roster`: The name of a new group is lowercased
- `mod_shared_roster`: Get back support for `groupid@vhost` in `displayed`
- `mod_stun_disco`: Fix syntax of credentials response
#### Commands API
- Change arguments and result to consistent names (API v3)
- `create_rooms_file`: Improve to support vhosts with different config
- `evacuate_kindly`: New command to kick users and prevent login ([#4309](https://github.com/processone/ejabberd/issues/4309))
- `join_cluster`: Explain that this returns immediately (since 5a34020, 24.06)
- `mod_muc_admin`: Rename argument `name` to `room` for consistency
#### Documentation
- Fix some documentation syntax, add links to toplevel, modules and API
- `CONTAINER.md`: Add kubernetes yaml examples to use with podman
- `SECURITY.md`: Add security policy and reporting guidelines
- `ejabberd.service`: Disable the systemd watchdog by default
- `ejabberd.yml.example`: Use non-standard STUN port
#### WebAdmin
- Shared group names are case sensitive, use original case instead of lowercase
- Use lowercase username and server authentication credentials
- Fix calculation of node's uptime days
- Fix link to displayed group when it is from another vhost
## Version 24.10
#### Miscelanea
- `ejabberd_c2s`: Optionally allow unencrypted SASL2
- `ejabberd_system_monitor`: Handle call by `gen_event:swap_handler` ([#4233](https://github.com/processone/ejabberd/issues/4233))
- `ejabberd_http_ws`: Remove support for old websocket connection protocol
- `ejabberd_stun`: Omit `auth_realm` log message
- `ext_mod`: Handle `info` message when contrib module transfers table ownership
- `mod_block_strangers`: Add feature announcement to disco-info ([#4039](https://github.com/processone/ejabberd/issues/4039))
- `mod_mam`: Advertise XEP-0424 feature in server disco-info ([#3340](https://github.com/processone/ejabberd/issues/3340))
- `mod_muc_admin`: Better handling of malformed jids in `send_direct_invitation` command
- `mod_muc_rtbl`: Fix call to `gen_server:stop` ([#4260](https://github.com/processone/ejabberd/issues/4260))
- `mod_privilege`: Support "IQ permission" from XEP-0356 0.4.1 ([#3889](https://github.com/processone/ejabberd/issues/3889))
- `mod_pubsub`: Don't blindly echo PEP notification
- `mod_pubsub`: Skip non-delivery errors for local pubsub generated notifications
- `mod_pubsub`: Fall back to default plugin options
- `mod_pubsub`: Fix choice of node config defaults
- `mod_pubsub`: Fix merging of default node options
- `mod_pubsub`: Fix default node config parsing
- `mod_register`: Support to block IPs in a vhost using `append_host_config` ([#4038](https://github.com/processone/ejabberd/issues/4038))
- `mod_s2s_bidi`: Add support for S2S Bidirectional
- `mod_scram_upgrade`: Add support for SCRAM upgrade tasks
- `mod_vcard`: Return error stanza when storage doesn't support vcard update ([#4266](https://github.com/processone/ejabberd/issues/4266))
- `mod_vcard`: Return explicit error stanza when user attempts to modify other's vcard
- Minor improvements to support `mod_tombstones` (#2456)
- Update `fast_xml` to use `use_maps` and remove obsolete elixir files
- Update `fast_tls` and `xmpp` to improve s2s fallback for invalid direct tls connections
- `make-binaries`: Bump dependency versions: Elixir 1.17.2, OpenSSL 3.3.2, ...
#### Administration
- `ejabberdctl`: If `ERLANG_NODE` lacks host, add hostname ([#4288](https://github.com/processone/ejabberd/issues/4288))
- `ejabberd_app`: At server start, log Erlang and Elixir versions
- MySQL: Fix column type in the schema update of `archive` table in schema update
#### Commands API
- `get_mam_count`: New command to get number of archived messages for an account
- `set_presence`: Return error when session not found
- `update`: Fix command output
- Add `mam` and `offline` tags to the related purge commands
#### Code Quality
- Fix warnings about unused macro definitions reported by Erlang LS
- Fix Elvis report: Fix dollar space syntax
- Fix Elvis report: Remove spaces in weird places
- Fix Elvis report: Don't use ignored variables
- Fix Elvis report: Remove trailing whitespace characters
- Define the types of options that `opt_type.sh` cannot derive automatically
- `ejabberd_http_ws`: Fix dialyzer warnings
- `mod_matrix_gw`: Remove useless option `persist`
- `mod_privilege`: Replace `try...catch` with a clean alternative
#### Development Help
- `elvis.config`: Fix file syntax, set vim mode, disable many tests
- `erlang_ls.config`: Let it find paths, update to Erlang 26, enable crossref
- `hooks_deps`: Hide false-positive warnings about `gen_mod`
- `Makefile`: Add support for `make elvis` when using rebar3
- `.vscode/launch.json`: Experimental support for debugging with Neovim
- CI: Add Elvis tests
- CI: Add XMPP Interop tests
- Runtime: Cache hex.pm archive from rebar3 and mix
#### Documentation
- Add links in top-level options documentation to their Docs website sections
- Document which SQL servers can really use `update_sql_schema`
- Improve documentation of `ldap_servers` and `ldap_backups` options ([#3977](https://github.com/processone/ejabberd/issues/3977))
- `mod_register`: Document behavior when `access` is set to `none` ([#4078](https://github.com/processone/ejabberd/issues/4078))
#### Elixir
- Handle case when elixir support is enabled but not available
- Start ExSync manually to ensure it's started if (and only if) Relive
- `mix.exs`: Fix `mix release` error: `logger` being regular and included application ([#4265](https://github.com/processone/ejabberd/issues/4265))
- `mix.exs`: Remove from `extra_applications` the apps already defined in `deps` ([#4265](https://github.com/processone/ejabberd/issues/4265))
#### WebAdmin
- Add links in user page to offline and roster pages
- Add new "MAM Archive" page to webadmin
- Improve many pages to handle when modules are disabled
- `mod_admin_extra`: Move some webadmin pages to their modules
## Version 24.07
#### Core
- `ejabberd_options`: Add trailing `@` to `@VERSION@` parsing
- `mod_http_api`: Fix problem parsing tuples when using OTP 27 json library ([#4242](https://github.com/processone/ejabberd/issues/4242))
- `mod_http_api`: Restore args conversion of `{"k":"v"}` to tuple lists
- `mod_matrix_gw`: Add misc:json_encode_With_kv_lists and use it in matrix sign function
- `mod_muc`: Output `muc#roominfo_avatarhash` in room disco info as per updated XEP-0486 ([#4234](https://github.com/processone/ejabberd/issues/4234))
- `mod_muc`: Improve cross version handling of muc retractions
- `node_pep`: Add missing feature `item-ids` to node_pep
- `mod_register`: Send welcome message as `chat` too ([#4246](https://github.com/processone/ejabberd/issues/4246))
- `ejabberd_hooks`: Support for ejabberd hook subscribers, useful for [mod_prometheus](https://github.com/processone/ejabberd-contrib/tree/master/mod_prometheus)
- `ejabberd.app`: Don't add `iex` to included_applications
- `make-installers`: Fix path in scripts in regular user install ([#4258](https://github.com/processone/ejabberd/issues/4258))
- Test: New tests for API commands
#### Documentation
- `mod_matrix_gw`: Fix `matrix_id_as_jid` option documentation
- `mod_register`: Add example configuration of `welcome_message` option
- `mix.exs`: Add ejabberd example config files to the hex package
- Update `CODE_OF_CONDUCT.md`
#### ext_mod
- Fetch dependencies from hex.pm when mix is available
- files_to_path is deprecated, use compile_to_path
- Compile all Elixir files in a library with one function call
- Improve error result when problem compiling elixir file
- Handle case when contrib module has no `*.ex` and no `*.erl`
- `mix.exs`: Include Elixir's Logger in the OTP release, useful for [mod_libcluster](https://github.com/processone/ejabberd-contrib/tree/master/mod_libcluster)
#### Logs
- Print message when starting ejabberd application fails
- Use error_logger when printing startup failure message
- Use proper format depending on the formatter ([#4256](https://github.com/processone/ejabberd/issues/4256))
#### SQL
- Add option `update_sql_schema_timeout` to allow schema update use longer timeouts
- Add ability to specify custom timeout for sql operations
- Allow to configure number of restart in `sql_transaction()`
- Make sql query in testsuite compatible with pg9.1
- In `mysql.sql`, fix update instructions for the `archive` table, `origin_id` column ([#4259](https://github.com/processone/ejabberd/issues/4259))
#### WebAdmin
- `ejabberd.yml.example`: Add `api_permissions` group for webadmin ([#4249](https://github.com/processone/ejabberd/issues/4249))
- Don't use host from url in webadmin, prefer host used for authentication
- Fix number of accounts shown in the online-users page
- Fix crash when viewing old shared roster groups ([#4245](https://github.com/processone/ejabberd/issues/4245))
- Support groupid with spaces when making shared roster result ([#4245](https://github.com/processone/ejabberd/issues/4245))
## Version 24.06
#### Core
@@ -5,49 +324,49 @@
- `econf`: Add ability to use additional custom errors when parsing options
- `ejabberd_logger`: Reloading configuration will update logger settings
- `gen_mod`: Add support to specify a hook global, not vhost-specific
- [`mod_configure`](https://docs.ejabberd.im/admin/configuration/modules/#mod_configure): Retract `Get User Password` command to update [XEP-0133](https://xmpp.org/extensions/xep-0133.html) 1.3.0
- [`mod_conversejs`](https://docs.ejabberd.im/admin/configuration/modules/#mod_conversejs): Simplify support for `@HOST@` in `default_domain` option ([#4167](https://github.com/processone/issues/4167))
- [`mod_mam`](https://docs.ejabberd.im/admin/configuration/modules/#mod_mam): Document that [XEP-0441](https://xmpp.org/extensions/xep-0441.html) is implemented as well
- [`mod_mam`](https://docs.ejabberd.im/admin/configuration/modules/#mod_mam): Update support for [XEP-0425](https://xmpp.org/extensions/xep-0425.html) version 0.3.0, keep supporting 0.2.1 ([#4193](https://github.com/processone/issues/4193))
- [`mod_matrix_gw`](https://docs.ejabberd.im/admin/configuration/modules/#mod_matrix_gw): Fix support for `@HOST@` in `matrix_domain` option ([#4167](https://github.com/processone/issues/4167))
- [`mod_muc_log`](https://docs.ejabberd.im/admin/configuration/modules/#mod_muc_log): Hide join/leave lines, add method to show them
- [`mod_muc_log`](https://docs.ejabberd.im/admin/configuration/modules/#mod_muc_log): Support `allowpm` introduced in 2bd61ab
- [`mod_muc_room`](https://docs.ejabberd.im/admin/configuration/modules/#mod_muc_room): Use ejabberd hooks instead of function calls to `mod_muc_log` ([#4191](https://github.com/processone/issues/4191))
- [`mod_private`](https://docs.ejabberd.im/admin/configuration/modules/#mod_private): Cope with bookmark decoding errors
- [`mod_vcard_xupdate`](https://docs.ejabberd.im/admin/configuration/modules/#mod_vcard_xupdate): Send hash after avatar get set for first time
- `prosody2ejabberd`: Handle the `approved` attribute. As feature isn't implemented, discard it ([#4188](https://github.com/processone/issues/4188))
- `mod_configure`: Retract `Get User Password` command to update XEP-0133 1.3.0
- `mod_conversejs`: Simplify support for `@HOST@` in `default_domain` option ([#4167](https://github.com/processone/ejabberd/issues/4167))
- `mod_mam`: Document that XEP-0441 is implemented as well
- `mod_mam`: Update support for XEP-0425 version 0.3.0, keep supporting 0.2.1 ([#4193](https://github.com/processone/ejabberd/issues/4193))
- `mod_matrix_gw`: Fix support for `@HOST@` in `matrix_domain` option ([#4167](https://github.com/processone/ejabberd/issues/4167))
- `mod_muc_log`: Hide join/leave lines, add method to show them
- `mod_muc_log`: Support `allowpm` introduced in 2bd61ab
- `mod_muc_room`: Use ejabberd hooks instead of function calls to `mod_muc_log` ([#4191](https://github.com/processone/ejabberd/issues/4191))
- `mod_private`): Cope with bookmark decoding errors
- `mod_vcard_xupdate`: Send hash after avatar get set for first time
- `prosody2ejabberd`: Handle the `approved` attribute. As feature isn't implemented, discard it ([#4188](https://github.com/processone/ejabberd/issues/4188))
#### SQL
- [`update_sql_schema`](https://docs.ejabberd.im/admin/configuration/toplevel/#update_sql_schema): Enable this option by default
- `update_sql_schema`: Enable this option by default
- CI: Don't load database schema files for mysql and pgsql
- Support Unix Domain Socket with updated p1_pgsql and p1_mysql ([#3716](https://github.com/processone/issues/3716))
- Support Unix Domain Socket with updated p1_pgsql and p1_mysql ([#3716](https://github.com/processone/ejabberd/issues/3716))
- Fix handling of `mqtt_pub` table definition from `mysql.sql` and fix `should_update_schema/1` in `ejabberd_sql_schema.erl`
- Don't start sql connection pools for unknown hosts
- Add `update_primary_key` command to sql schema updater
- Fix crash running [`export2sql`](https://docs.ejabberd.im/developer/ejabberd-api/admin-api/#export2sql) when MAM enabled but MUC disabled
- Fix crash running `export2sql` when MAM enabled but MUC disabled
- Improve detection of types in odbc
#### Commands API
- New ban commands use private storage to keep ban information ([#4201](https://github.com/processone/issues/4201))
- [`join_cluster_here`](https://docs.ejabberd.im/developer/ejabberd-api/admin-api/#join_cluster_here): New command to join a remote node into our local cluster
- Don't name integer and string results in API examples ([#4198](https://github.com/processone/issues/4198))
- [`get_user_subscriptions`](https://docs.ejabberd.im/developer/ejabberd-api/admin-api/#get_user_subscriptions): Fix validation of user field in that command
- [`mod_admin_extra`](https://docs.ejabberd.im/admin/configuration/modules/#mod_admin_extra): Handle case when `mod_private` is not enabled ([#4201](https://github.com/processone/issues/4201))
- [`mod_muc_admin`](https://docs.ejabberd.im/admin/configuration/modules/#mod_muc_admin): Improve validation of arguments in several commands
- New ban commands use private storage to keep ban information ([#4201](https://github.com/processone/ejabberd/issues/4201))
- `join_cluster_here`: New command to join a remote node into our local cluster
- Don't name integer and string results in API examples ([#4198](https://github.com/processone/ejabberd/issues/4198))
- `get_user_subscriptions`: Fix validation of user field in that command
- `mod_admin_extra`: Handle case when `mod_private` is not enabled ([#4201](https://github.com/processone/ejabberd/issues/4201))
- `mod_muc_admin`: Improve validation of arguments in several commands
#### Compile
- `ejabberdctl`: Comment ERTS_VSN variable when not used ([#4194](https://github.com/processone/issues/4194))
- `ejabberdctl`: Comment ERTS_VSN variable when not used ([#4194](https://github.com/processone/ejabberd/issues/4194))
- `ejabberdctl`: Fix iexlive after `make prod` when using Elixir
- `ejabberdctl`: If `INET_DIST_INTERFACE` is IPv6, set required option ([#4189](https://github.com/processone/issues/4189))
- `ejabberdctl`: If `INET_DIST_INTERFACE` is IPv6, set required option ([#4189](https://github.com/processone/ejabberd/issues/4189))
- `ejabberdctl`: Make native dynamic node names work when using fully qualified domain names
- `rebar.config.script`: Support relaxed dependency version ([#4192](https://github.com/processone/issues/4192))
- `rebar.config.script`: Support relaxed dependency version ([#4192](https://github.com/processone/ejabberd/issues/4192))
- `rebar.config`: Update deps version to rebar3's relaxed versioning
- `rebar.lock`: Track file, now that rebar3 uses loose dependency versioning
- `configure.ac`: When using rebar3, unlock dependencies that are disabled ([#4212](https://github.com/processone/issues/4212))
- `configure.ac`: When using rebar3 with old Erlang, unlock some dependencies ([#4213](https://github.com/processone/issues/4213))
- `configure.ac`: When using rebar3, unlock dependencies that are disabled ([#4212](https://github.com/processone/ejabberd/issues/4212))
- `configure.ac`: When using rebar3 with old Erlang, unlock some dependencies ([#4213](https://github.com/processone/ejabberd/issues/4213))
- `mix:exs`: Move `xmpp` from `included_applications` to `applications`
#### Dependencies
@@ -57,7 +376,7 @@
- Jiffy: Use Json module when Erlang/OTP 27, jiffy with older ones
- Jose: Update to the new 1.11.10 for Erlang/OTP higher than 23
- Luerl: Update to 1.2.0 when OTP same or higher than 20, simplifies commit a09f222
- P1_acme: Update to support Jose 1.11.10 and Ipv6 support ([#4170](https://github.com/processone/issues/4170))
- P1_acme: Update to support Jose 1.11.10 and Ipv6 support ([#4170](https://github.com/processone/ejabberd/issues/4170))
- P1_acme: Update to use Erlang's json library instead of jiffy when OTP 27
- Port_compiler: Update to 1.15.0 that supports Erlang/OTP 27.0
@@ -89,7 +408,7 @@
- make-binaries: Bump OpenSSL to 3.3.1
- make-binaries: Bump Linux-PAM to 1.6.1
- make-binaries: Bump Expat to 2.6.2
- make-binaries: Revert temporarily an OTP commit that breaks MSSQL ([#4178](https://github.com/processone/issues/4178))
- make-binaries: Revert temporarily an OTP commit that breaks MSSQL ([#4178](https://github.com/processone/ejabberd/issues/4178))
- CONTAINER.md: Invalid `CTL_ON_CREATE` usage in docker-compose example
#### WebAdmin
@@ -116,8 +435,8 @@
- Support tls-exporter channel binding
- Support XEP-0474: SASL SCRAM Downgrade Protection
- Fix presenting features and returning results of inline bind2 elements
- [`disable_sasl_scram_downgrade_protection`](https://docs.ejabberd.im/admin/configuration/toplevel/#disable-sasl-scram-downgrade-protection): New option to disable XEP-0474
- [`negotiation_timeout`](https://docs.ejabberd.im/admin/configuration/toplevel/#negotiation-timeout): Increase default value from 30s to 2m
- `disable_sasl_scram_downgrade_protection`: New option to disable XEP-0474
- `negotiation_timeout`: Increase default value from 30s to 2m
- mod_carboncopy: Teach how to interact with bind2 inline requests
#### Other:
@@ -155,10 +474,10 @@
- ejabberdctl: Rework temporary node name generation
- ejabberdctl: Print argument description, examples and note in help
- ejabberdctl: Document exclusive ejabberdctl commands like all the others
- Commands: Add a new [`muc_sub`](https://docs.ejabberd.im/developer/ejabberd-api/admin-tags/#muc-sub) tag to all the relevant commands
- Commands: Add a new `muc_sub` tag to all the relevant commands
- Commands: Improve syntax of many commands documentation
- Commands: Use list arguments in many commands that used separators
- Commands: [`set_presence`](https://docs.ejabberd.im/developer/ejabberd-api/admin-api/#set-presence): switch priority argument from string to integer
- Commands: `set_presence`: switch priority argument from string to integer
- ejabberd_commands: Add the command API version as [a tag `vX`](https://docs.ejabberd.im/developer/ejabberd-api/admin-tags/#v1)
- ejabberd_ctl: Add support for list and tuple arguments
- ejabberd_xmlrpc: Fix support for restuple error response
+18 -3
View File
@@ -22,6 +22,21 @@ Examples of unacceptable behavior by participants include:
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Guidelines for Respectful and Efficient Communication on Issues, Discussions, and PRs
To ensure that our maintainers can efficiently manage issues and provide timely updates, we kindly ask that all comments on GitHub tickets remain relevant to the topic of the issue. Please avoid posting comments solely to ping maintainers or ask for updates. If you need information on the status of an issue, consider the following:
- **Check the Issue Timeline:** Review the existing comments and updates on the issue before posting.
- **Use Reactions:** If you want to show that you are interested in an issue, use GitHub's reaction feature (e.g., thumbs up) instead of commenting.
- **Be Patient:** Understand that maintainers may be working on multiple tasks and will provide updates as soon as possible.
Additionally, please be aware that:
- **User Responses:** Users who report issues may no longer be using the software, may have switched to other projects, or may simply be busy. It is their right not to respond to follow-up questions or comments.
- **Maintainer Priorities:** Maintainers have the right to define their own priorities and schedule. They will address issues based on their availability and the project's needs.
By following these guidelines, you help us maintain a productive and respectful environment for everyone involved.
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
@@ -40,7 +55,7 @@ Project maintainers who do not follow or enforce the Code of Conduct in good fai
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
[homepage]: https://www.contributor-covenant.org/
[version]: https://www.contributor-covenant.org/version/1/4/
+1 -1
View File
@@ -44,7 +44,7 @@ There are several ways to obtain the ejabberd source code:
- Source code package from [ejabberd GitHub Releases][ghr]
- Latest development code from [ejabberd Git repository][gitrepo]
[p1dl]: https://www.process-one.net/en/ejabberd/downloads/
[p1dl]: https://www.process-one.net/download/ejabberd/
[ghr]: https://github.com/processone/ejabberd/releases
[gitrepo]: https://github.com/processone/ejabberd
+606 -114
View File
@@ -1,41 +1,44 @@
[![GitHub tag (latest SemVer)](https://img.shields.io/github/v/tag/processone/ejabberd?sort=semver&logo=embarcadero&label=&color=49c0c4)](https://github.com/processone/ejabberd/tags)
[![GitHub Container](https://img.shields.io/github/v/tag/processone/ejabberd?label=ejabberd&sort=semver&logo=docker)](https://github.com/processone/ejabberd/pkgs/container/ejabberd)
[![ejabberd Container on GitHub](https://img.shields.io/github/v/tag/processone/ejabberd?label=ejabberd&sort=semver&logo=opencontainersinitiative&logoColor=2094f3)](https://github.com/processone/ejabberd/pkgs/container/ejabberd)
[![ecs Container on Docker](https://img.shields.io/docker/v/ejabberd/ecs?label=ecs&sort=semver&logo=docker)](https://hub.docker.com/r/ejabberd/ecs/)
`ejabberd` Container Image
==========================
ejabberd Container Images
=========================
[ejabberd][home] is an open-source,
robust, scalable and extensible realtime platform built using [Erlang/OTP][erlang],
that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service.
[home]: https://ejabberd.im/
[home]: https://www.ejabberd.im/
[erlang]: https://www.erlang.org/
[xmpp]: https://xmpp.org/
[mqtt]: https://mqtt.org/
[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol
This document explains how to use the `ejabberd` container image available in
[ghcr.io/processone/ejabberd](https://github.com/processone/ejabberd/pkgs/container/ejabberd),
built using the files in `.github/container/`.
This image is based in Alpine 3.19, includes Erlang/OTP 26.2 and Elixir 1.16.1.
This page documents those container images ([images comparison](#images-comparison)):
Alternatively, there is also the `ecs` container image available in
[docker.io/ejabberd/ecs](https://hub.docker.com/r/ejabberd/ecs/),
built using the
[docker-ejabberd/ecs](https://github.com/processone/docker-ejabberd/tree/master/ecs)
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).
- [![ejabberd Container](https://img.shields.io/badge/ejabberd-grey?logo=opencontainersinitiative&logoColor=2094f3)](https://github.com/processone/ejabberd/pkgs/container/ejabberd)
published in [ghcr.io/processone/ejabberd](https://github.com/processone/ejabberd/pkgs/container/ejabberd),
built using [ejabberd](https://github.com/processone/ejabberd/tree/master/.github/container) repository,
both for stable ejabberd releases and the `master` branch, in x64 and arm64 architectures.
If you are using a Windows operating system, check the tutorials mentioned in
[ejabberd Docs > Docker Image](https://docs.ejabberd.im/admin/install/container/#ejabberd-container-image).
- [![ecs Container](https://img.shields.io/badge/ecs-grey?logo=docker&logoColor=2094f3)](https://hub.docker.com/r/ejabberd/ecs/)
published in [docker.io/ejabberd/ecs](https://hub.docker.com/r/ejabberd/ecs/),
built using [docker-ejabberd/ecs](https://github.com/processone/docker-ejabberd/tree/master/ecs) repository
for ejabberd stable releases in x64 architectures.
For Microsoft Windows, see
[Docker Desktop for Windows 10](https://www.process-one.net/blog/install-ejabberd-on-windows-10-using-docker-desktop/),
and [Docker Toolbox for Windows 7](https://www.process-one.net/blog/install-ejabberd-on-windows-7-using-docker-toolbox/).
For Kubernetes Helm, see [help-ejabberd](https://github.com/sando38/helm-ejabberd).
Start ejabberd
--------------
### With default configuration
### daemon
Start ejabberd in a new container:
@@ -44,13 +47,7 @@ docker run --name ejabberd -d -p 5222:5222 ghcr.io/processone/ejabberd
```
That runs the container as a daemon,
using ejabberd default configuration file and XMPP domain "localhost".
Stop the running container:
```bash
docker stop ejabberd
```
using ejabberd default configuration file and XMPP domain `localhost`.
Restart the stopped ejabberd container:
@@ -58,60 +55,91 @@ Restart the stopped ejabberd container:
docker restart ejabberd
```
Stop the running container:
### Start with Erlang console attached
```bash
docker stop ejabberd
```
Start ejabberd with an Erlang console attached using the `live` command:
Remove the ejabberd container:
```bash
docker rm ejabberd
```
### with Erlang console
Start ejabberd with an interactive Erlang console attached using the `live` command:
```bash
docker run --name ejabberd -it -p 5222:5222 ghcr.io/processone/ejabberd live
```
That uses the default configuration file and XMPP domain "localhost".
That uses the default configuration file and XMPP domain `localhost`.
### Start with your configuration and database
### with your data
Pass a configuration file as a volume
and share the local directory to store database:
```bash
mkdir database
chown ejabberd database
mkdir conf && cp ejabberd.yml.example conf/ejabberd.yml
cp ejabberd.yml.example ejabberd.yml
mkdir database && chown ejabberd database
docker run --name ejabberd -it \
-v $(pwd)/ejabberd.yml:/opt/ejabberd/conf/ejabberd.yml \
-v $(pwd)/conf/ejabberd.yml:/opt/ejabberd/conf/ejabberd.yml \
-v $(pwd)/database:/opt/ejabberd/database \
-p 5222:5222 ghcr.io/processone/ejabberd live
```
Notice that ejabberd runs in the container with an account named `ejabberd`,
Notice that ejabberd runs in the container with an account named `ejabberd`
with UID 9000 and group `ejabberd` with GID 9000,
and the volumes you mount must grant proper rights to that account.
Next steps
----------
### Register the administrator account
### Register admin account
The default ejabberd configuration does not grant admin privileges
to any account,
you may want to register a new account in ejabberd
and grant it admin rights.
#### [![ejabberd Container](https://img.shields.io/badge/ejabberd-grey?logo=opencontainersinitiative&logoColor=2094f3)](https://github.com/processone/ejabberd/pkgs/container/ejabberd) [:orange_circle:](#images-comparison)
Register an account using the `ejabberdctl` script:
If you set the `REGISTER_ADMIN_PASSWORD` environment variable,
an account is automatically registered with that password,
and admin privileges are granted to it.
The account created depends on what variables you have set:
- `EJABBERD_MACRO_ADMIN=juliet@example.org` -> `juliet@example.org`
- `EJABBERD_MACRO_HOST=example.org` -> `admin@example.org`
- None of those variables are set -> `admin@localhost`
The account registration is shown in the container log:
```
:> ejabberdctl register admin example.org somePassw0rd
User admin@example.org successfully registered
```
Alternatively, you can register the account manually yourself
and edit `conf/ejabberd.yml` and add the ACL as explained in
[ejabberd Docs: Administration Account](https://docs.ejabberd.im/admin/install/next-steps/#administration-account).
---
#### [![ecs Container](https://img.shields.io/badge/ecs-grey?logo=docker&logoColor=2094f3)](https://hub.docker.com/r/ejabberd/ecs/)
The default ejabberd configuration has already granted admin privilege
to an account that would be called `admin@localhost`,
so you just need to register it, for example:
```bash
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/install/next-steps/#administration-account)
### Check ejabberd log files
### Check ejabberd log
Check the content of the log files inside the container,
even if you do not put it on a shared persistent drive:
@@ -121,7 +149,7 @@ docker exec -it ejabberd tail -f logs/ejabberd.log
```
### Inspect the container files
### Inspect container files
The container uses Alpine Linux. Start a shell inside the container:
@@ -130,7 +158,7 @@ docker exec -it ejabberd sh
```
### Open ejabberd debug console
### Open debug console
Open an interactive debug Erlang console attached to a running ejabberd in a running container:
@@ -155,7 +183,7 @@ docker exec -it ejabberd vi conf/ejabberd.yml
and add this option:
```yaml
captcha_cmd: /opt/ejabberd-22.04/lib/captcha.sh
captcha_cmd: "$HOME/bin/captcha.sh"
```
Finally, reload the configuration file or restart the container:
@@ -176,20 +204,22 @@ For more details about CAPTCHA options, please check the
documentation section.
Advanced Container Configuration
--------------------------------
Advanced
--------
### Ports
This container image exposes the ports:
The container image exposes several ports
(check also [Docs: Firewall Settings](https://docs.ejabberd.im/admin/guide/security/#firewall-settings)):
- `5222`: The default port for XMPP clients.
- `5269`: For XMPP federation. Only needed if you want to communicate with users on other servers.
- `5280`: For admin interface.
- `5280`: For admin interface (URL is `admin/`).
- `1880`: For admin interface (URL is `/`, useful for [podman-desktop](https://podman-desktop.io/) and [docker-desktop](https://www.docker.com/products/docker-desktop/)) [:orange_circle:](#images-comparison)
- `5443`: With encryption, used for admin interface, API, CAPTCHA, OAuth, Websockets and XMPP BOSH.
- `1883`: Used for MQTT
- `4369-4399`: EPMD and Erlang connectivity, used for `ejabberdctl` and clustering
- `5210`: Erlang connectivity when `ERL_DIST_PORT` is set, alternative to EPMD
- `5210`: Erlang connectivity when `ERL_DIST_PORT` is set, alternative to EPMD [:orange_circle:](#images-comparison)
### Volumes
@@ -206,11 +236,26 @@ You should back up or export the content of the directory to persistent storage
- `/opt/ejabberd/logs/`: Directory containing log files
- `/opt/ejabberd/upload/`: Directory containing uploaded files. This should also be backed up.
All these files are owned by `ejabberd` user inside the container.
All these files are owned by an account named `ejabberd` with group `ejabberd` in the container.
Its corresponding `UID:GID` is `9000:9000`.
If you prefer bind mounts instead of volumes, then
you need to map this to valid `UID:GID` on your host to get read/write access on
mounted directories.
It's possible to install additional ejabberd modules using volumes,
[this comment](https://github.com/processone/docker-ejabberd/issues/81#issuecomment-1036115146)
explains how to install an additional module using docker-compose.
If using Docker, try:
```bash
mkdir database
sudo chown 9000:9000 database
```
If using Podman, try:
```bash
mkdir database
podman unshare chown 9000:9000 database
```
It's possible to install additional ejabberd modules using volumes, check
[this Docs tutorial](https://docs.ejabberd.im/developer/extending-ejabberd/modules/#your-module-in-ejabberd-modules-with-ejabberd-container).
### Commands on start
@@ -221,19 +266,93 @@ and reads `CTL_ON_START` every time the container is started.
Those variables can contain one ejabberdctl command,
or several commands separated with the blankspace and `;` characters.
By default failure of any of commands executed that way would
abort start, this can be disabled by prefixing commands with `!`
If any of those commands returns a failure, the container starting gets aborted.
If there is a command with a result that can be ignored,
prefix that command with `!`
Example usage (or check the [full example](#customized-example)):
This example, registers an `admin@localhost` account when the container is first created.
Everytime the container starts, it shows the list of registered accounts,
checks that the admin account exists and password is valid,
changes the password of an account if it exists (ignoring any failure),
and shows the ejabberd starts (check also the [full example](#customized-example)):
```yaml
environment:
- CTL_ON_CREATE=! register admin localhost asd
- CTL_ON_CREATE=register admin localhost asd
- CTL_ON_START=stats registeredusers ;
check_password admin localhost asd ;
! change_password bot123 localhost qqq ;
status
```
### Macros in environment [:high_brightness:](#images-comparison)
ejabberd reads `EJABBERD_MACRO_*` environment variables
and uses them to define the corresponding
[macros](https://docs.ejabberd.im/admin/configuration/file-format/#macros-in-configuration-file),
overwriting the corresponding macro definition if it was set in the configuration file.
This is supported since ejabberd 24.12.
For example, if you configure this in `ejabberd.yml`:
```yaml
acl:
admin:
user: ADMIN
```
now you can define the admin account JID using an environment variable:
```yaml
environment:
- EJABBERD_MACRO_ADMIN=admin@localhost
```
Check the [full example](#customized-example) for other example.
### ejabberdapi
When the container is running (and thus ejabberd), you can exec commands inside the container
using `ejabberdctl` or any other of the available interfaces, see
[Understanding ejabberd "commands"](https://docs.ejabberd.im/developer/ejabberd-api/#understanding-ejabberd-commands)
Additionally, the container image includes the `ejabberdapi` executable.
Please check the [ejabberd-api homepage](https://github.com/processone/ejabberd-api)
for configuration and usage details.
For example, if you configure ejabberd like this:
```yaml
listen:
-
port: 5282
module: ejabberd_http
request_handlers:
"/api": mod_http_api
acl:
loopback:
ip:
- 127.0.0.0/8
- ::1/128
- ::FFFF:127.0.0.1/128
api_permissions:
"admin access":
who:
access:
allow:
acl: loopback
what:
- "register"
```
Then you could register new accounts with this query:
```bash
docker exec -it ejabberd ejabberdapi register --endpoint=http://127.0.0.1:5282/ --jid=admin@localhost --password=passw0rd
```
### Clustering
When setting several containers to form a
@@ -244,18 +363,22 @@ and the same
[Erlang Cookie](https://docs.ejabberd.im/admin/guide/security/#erlang-cookie).
For this you can either:
- edit `conf/ejabberdctl.cfg` and set variables `ERLANG_NODE` and `ERLANG_COOKIE`
- set the environment variables `ERLANG_NODE_ARG` and `ERLANG_COOKIE`
---
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 \
ghcr.io/processone/ejabberd
```
2. Set `ERL_DIST_PORT=5210` in ejabberdctl.cfg of container and local ejabberd
```sh
docker run --name ejabberd -it \
-e ERLANG_COOKIE=`cat $HOME/.erlang.cookie` \
-p 5210:5210 -p 5222:5222 \
ghcr.io/processone/ejabberd
```
2. Set `ERL_DIST_PORT=5210` in `ejabberdctl.cfg` of container and local ejabberd
3. Restart the container
4. Now use `ejabberdctl` in your local ejabberd deployment
@@ -271,19 +394,175 @@ Example using environment variables (see full example [docker-compose.yml](https
- ERLANG_COOKIE=dummycookie123
```
---
Build a Container Image
-----------------------
Once you have the ejabberd nodes properly set and running,
you can tell the secondary nodes to join the master node using the
[`join_cluster`](https://docs.ejabberd.im/developer/ejabberd-api/admin-api/#join-cluster)
API call.
This container image includes ejabberd as a standalone OTP release built using Elixir.
That OTP release is configured with:
Example using environment variables (see the full
[`docker-compose.yml` clustering example](#clustering-example)):
```yaml
environment:
- ERLANG_NODE_ARG=ejabberd@replica
- ERLANG_COOKIE=dummycookie123
- CTL_ON_CREATE=join_cluster ejabberd@main
```
### Change Mnesia Node Name
To use the same Mnesia database in a container with a different hostname,
it is necessary to change the old hostname stored in Mnesia.
This section is equivalent to the ejabberd Documentation
[Change Computer Hostname](https://docs.ejabberd.im/admin/guide/managing/#change-computer-hostname),
but particularized to containers that use this
ecs container image from ejabberd 23.01 or older.
#### Setup Old Container
Let's assume a container running ejabberd 23.01 (or older) from
this ecs container image, with the database directory binded
and one registered account.
This can be produced with:
```bash
OLDCONTAINER=ejaold
NEWCONTAINER=ejanew
mkdir database
sudo chown 9000:9000 database
docker run -d --name $OLDCONTAINER -p 5222:5222 \
-v $(pwd)/database:/opt/ejabberd/database \
ghcr.io/processone/ejabberd:23.01
docker exec -it $OLDCONTAINER ejabberdctl started
docker exec -it $OLDCONTAINER ejabberdctl register user1 localhost somepass
docker exec -it $OLDCONTAINER ejabberdctl registered_users localhost
```
Methods to know the Erlang node name:
```bash
ls database/ | grep ejabberd@
docker exec -it $OLDCONTAINER ejabberdctl status
docker exec -it $OLDCONTAINER grep "started in the node" logs/ejabberd.log
```
#### Change Mnesia Node
First of all let's store the Erlang node names and paths in variables.
In this example they would be:
```bash
OLDCONTAINER=ejaold
NEWCONTAINER=ejanew
OLDNODE=ejabberd@95145ddee27c
NEWNODE=ejabberd@localhost
OLDFILE=/opt/ejabberd/database/old.backup
NEWFILE=/opt/ejabberd/database/new.backup
```
1. Start your old container that can still read the Mnesia database correctly.
If you have the Mnesia spool files,
but don't have access to the old container anymore, go to
[Create Temporary Container](#create-temporary-container)
and later come back here.
2. Generate a backup file and check it was created:
```bash
docker exec -it $OLDCONTAINER ejabberdctl backup $OLDFILE
ls -l database/*.backup
```
3. Stop ejabberd:
```bash
docker stop $OLDCONTAINER
```
4. Create the new container. For example:
```bash
docker run \
--name $NEWCONTAINER \
-d \
-p 5222:5222 \
-v $(pwd)/database:/opt/ejabberd/database \
ghcr.io/processone/ejabberd:latest
```
5. Convert the backup file to new node name:
```bash
docker exec -it $NEWCONTAINER ejabberdctl mnesia_change_nodename $OLDNODE $NEWNODE $OLDFILE $NEWFILE
```
6. Install the backup file as a fallback:
```bash
docker exec -it $NEWCONTAINER ejabberdctl install_fallback $NEWFILE
```
7. Restart the container:
```bash
docker restart $NEWCONTAINER
```
8. Check that the information of the old database is available.
In this example, it should show that the account `user1` is registered:
```bash
docker exec -it $NEWCONTAINER ejabberdctl registered_users localhost
```
9. When the new container is working perfectly with the converted Mnesia database,
you may want to remove the unneeded files:
the old container, the old Mnesia spool files, and the backup files.
#### Create Temporary Container
In case the old container that used the Mnesia database is not available anymore,
a temporary container can be created just to read the Mnesia database
and make a backup of it, as explained in the previous section.
This method uses `--hostname` command line argument for docker,
and `ERLANG_NODE_ARG` environment variable for ejabberd.
Their values must be the hostname of your old container
and the Erlang node name of your old ejabberd node.
To know the Erlang node name please check
[Setup Old Container](#setup-old-container).
Command line example:
```bash
OLDHOST=${OLDNODE#*@}
docker run \
-d \
--name $OLDCONTAINER \
--hostname $OLDHOST \
-p 5222:5222 \
-v $(pwd)/database:/opt/ejabberd/database \
-e ERLANG_NODE_ARG=$OLDNODE \
ghcr.io/processone/ejabberd:latest
```
Check the old database content is available:
```bash
docker exec -it $OLDCONTAINER ejabberdctl registered_users localhost
```
Now that you have ejabberd running with access to the Mnesia database,
you can continue with step 2 of previous section
[Change Mnesia Node](#change-mnesia-node).
Build Container Image
----------------
The container image includes ejabberd as a standalone OTP release built using Elixir.
### Build `ejabberd` [![ejabberd Container](https://img.shields.io/badge/ejabberd-grey?logo=opencontainersinitiative&logoColor=2094f3)](https://github.com/processone/ejabberd/pkgs/container/ejabberd)
The ejabberd Erlang/OTP release is configured with:
- `mix.exs`: Customize ejabberd release
- `vars.config`: ejabberd compilation configuration options
- `config/runtime.exs`: Customize ejabberd paths
- `ejabberd.yml.template`: ejabberd default config file
### Direct build
#### Direct build
Build ejabberd Community Server container image from ejabberd master git repository:
@@ -294,12 +573,14 @@ docker buildx build \
.
```
### Podman build
#### Podman build
To build the image using Podman, please notice:
It's also possible to use podman instead of docker, just notice:
- `EXPOSE 4369-4399` port range is not supported, remove that in Dockerfile
- It mentions that `healthcheck` is not supported by the Open Container Initiative image format
- to start with command `live`, you may want to add environment variable `EJABBERD_BYPASS_WARNINGS=true`
```bash
podman build \
-t ejabberd \
@@ -317,30 +598,27 @@ podman stop eja1
podman run --name eja1 -it -e EJABBERD_BYPASS_WARNINGS=true -p 5222:5222 localhost/ejabberd live
```
### Package build for `arm64`
### Build `ecs` [![ecs Container](https://img.shields.io/badge/ecs-grey?logo=docker&logoColor=2094f3)](https://hub.docker.com/r/ejabberd/ecs/)
By default, `.github/container/Dockerfile` builds this container by directly compiling ejabberd,
it is a fast and direct method.
However, a problem with QEMU prevents building the container in QEMU using Erlang/OTP 25
for the `arm64` architecture.
The ejabberd Erlang/OTP release is configured with:
Providing `--build-arg METHOD=package` is an alternate method to build the container
used by the Github Actions workflow that provides `amd64` and `arm64` container images.
It first builds an ejabberd binary package, and later installs it in the image.
That method avoids using QEMU, so it can build `arm64` container images, but is extremely
slow the first time it's used, and consequently not recommended for general use.
- `rel/config.exs`: Customize ejabberd release
- `rel/dev.exs`: ejabberd environment configuration for development release
- `rel/prod.exs`: ejabberd environment configuration for production release
- `vars.config`: ejabberd compilation configuration options
- `conf/ejabberd.yml`: ejabberd default config file
In this case, to build the ejabberd container image for arm64 architecture:
Build ejabberd Community Server base image from ejabberd master on Github:
```bash
docker buildx build \
--build-arg METHOD=package \
--platform linux/arm64 \
-t personal/ejabberd:$VERSION \
-f .github/container/Dockerfile \
.
docker build -t personal/ejabberd .
```
Build ejabberd Community Server base image for a given ejabberd version:
```bash
./build.sh 18.03
```
Composer Examples
-----------------
@@ -348,7 +626,9 @@ Composer Examples
### Minimal Example
This is the barely minimal file to get a usable ejabberd.
Store it as `docker-compose.yml`:
If using Docker, write this `docker-compose.yml` file
and start it with `docker-compose up`:
```yaml
services:
@@ -362,32 +642,62 @@ services:
- "5443:5443"
```
Create and start the container with the command:
```bash
docker-compose up
If using Podman, write this `minimal.yml` file
and start it with `podman kube play minimal.yml`:
```yaml
apiVersion: v1
kind: Pod
metadata:
name: ejabberd
spec:
containers:
- name: ejabberd
image: ghcr.io/processone/ejabberd
ports:
- containerPort: 5222
hostPort: 5222
- containerPort: 5269
hostPort: 5269
- containerPort: 5280
hostPort: 5280
- containerPort: 5443
hostPort: 5443
```
### Customized Example
This example shows the usage of several customizations:
it uses a local configuration file,
defines a configuration macro using an environment variable,
stores the mnesia database in a local path,
registers an account when it's created,
and checks the number of registered accounts every time it's started.
Download or copy the ejabberd configuration file:
Prepare an ejabberd configuration file:
```bash
wget https://raw.githubusercontent.com/processone/ejabberd/master/ejabberd.yml.example
mv ejabberd.yml.example ejabberd.yml
mkdir conf && cp ejabberd.yml.example conf/ejabberd.yml
```
Create the database directory and allow the container access to it:
```bash
mkdir database
sudo chown 9000:9000 database
```
Now write this `docker-compose.yml` file:
- Docker:
```bash
mkdir database && sudo chown 9000:9000 database
```
- Podman:
```bash
mkdir database && podman unshare chown 9000:9000 database
```
If using Docker, write this `docker-compose.yml` file
and start it with `docker-compose up`:
```yaml
version: '3.7'
@@ -397,8 +707,10 @@ services:
image: ghcr.io/processone/ejabberd
container_name: ejabberd
environment:
- CTL_ON_CREATE=register admin localhost asd
- CTL_ON_START=registered_users localhost ;
- EJABBERD_MACRO_HOST=example.com
- EJABBERD_MACRO_ADMIN=admin@example.com
- REGISTER_ADMIN_PASSWORD=somePassw0rd
- CTL_ON_START=registered_users example.com ;
status
ports:
- "5222:5222"
@@ -406,10 +718,64 @@ services:
- "5280:5280"
- "5443:5443"
volumes:
- ./ejabberd.yml:/opt/ejabberd/conf/ejabberd.yml:ro
- ./conf/ejabberd.yml:/opt/ejabberd/conf/ejabberd.yml:ro
- ./database:/opt/ejabberd/database
```
If using Podman, write this `custom.yml` file
and start it with `podman kube play custom.yml`:
```yaml
apiVersion: v1
kind: Pod
metadata:
name: ejabberd
spec:
containers:
- name: ejabberd
image: ghcr.io/processone/ejabberd
env:
- name: EJABBERD_MACRO_HOST
value: example.com
- name: EJABBERD_MACRO_ADMIN
value: admin@example.com
- name: REGISTER_ADMIN_PASSWORD
value: somePassw0rd
- name: CTL_ON_START
value: registered_users example.com ;
status
ports:
- containerPort: 5222
hostPort: 5222
- containerPort: 5269
hostPort: 5269
- containerPort: 5280
hostPort: 5280
- containerPort: 5443
hostPort: 5443
volumeMounts:
- mountPath: /opt/ejabberd/conf/ejabberd.yml
name: config
readOnly: true
- mountPath: /opt/ejabberd/database
name: db
volumes:
- name: config
hostPath:
path: ./conf/ejabberd.yml
type: File
- name: db
hostPath:
path: ./database
type: DirectoryOrCreate
```
### Clustering Example
In this example, the main container is created first.
@@ -418,12 +784,15 @@ and once ejabberd is started in it, it joins the first one.
An account is registered in the first node when created (and
we ignore errors that can happen when doing that - for example
whenn account already exists),
when account already exists),
and it should exist in the second node after join.
Notice that in this example the main container does not have access
to the exterior; the replica exports the ports and can be accessed.
If using Docker, write this `docker-compose.yml` file
and start it with `docker-compose up`:
```yaml
version: '3.7'
@@ -431,11 +800,17 @@ services:
main:
image: ghcr.io/processone/ejabberd
container_name: ejabberd
container_name: main
environment:
- ERLANG_NODE_ARG=ejabberd@main
- ERLANG_COOKIE=dummycookie123
- CTL_ON_CREATE=! register admin localhost asd
healthcheck:
test: netstat -nl | grep -q 5222
start_period: 5s
interval: 5s
timeout: 5s
retries: 120
replica:
image: ghcr.io/processone/ejabberd
@@ -443,15 +818,132 @@ services:
depends_on:
main:
condition: service_healthy
ports:
- "5222:5222"
- "5269:5269"
- "5280:5280"
- "5443:5443"
environment:
- ERLANG_NODE_ARG=ejabberd@replica
- ERLANG_COOKIE=dummycookie123
- CTL_ON_CREATE=join_cluster ejabberd@main
- CTL_ON_START=registered_users localhost ;
status
ports:
- "5222:5222"
- "5269:5269"
- "5280:5280"
- "5443:5443"
```
If using Podman, write this `cluster.yml` file
and start it with `podman kube play cluster.yml`:
```yaml
apiVersion: v1
kind: Pod
metadata:
name: cluster
spec:
containers:
- name: first
image: ghcr.io/processone/ejabberd
env:
- name: ERLANG_NODE_ARG
value: main@cluster
- name: ERLANG_COOKIE
value: dummycookie123
- name: CTL_ON_CREATE
value: register admin localhost asd
- name: CTL_ON_START
value: stats registeredusers ;
status
- name: EJABBERD_MACRO_PORT_C2S
value: 6222
- name: EJABBERD_MACRO_PORT_C2S_TLS
value: 6223
- name: EJABBERD_MACRO_PORT_S2S
value: 6269
- name: EJABBERD_MACRO_PORT_HTTP_TLS
value: 6443
- name: EJABBERD_MACRO_PORT_HTTP
value: 6280
- name: EJABBERD_MACRO_PORT_MQTT
value: 6883
- name: EJABBERD_MACRO_PORT_PROXY65
value: 6777
volumeMounts:
- mountPath: /opt/ejabberd/conf/ejabberd.yml
name: config
readOnly: true
- name: second
image: ghcr.io/processone/ejabberd
env:
- name: ERLANG_NODE_ARG
value: replica@cluster
- name: ERLANG_COOKIE
value: dummycookie123
- name: CTL_ON_CREATE
value: join_cluster main@cluster ;
started ;
list_cluster
- name: CTL_ON_START
value: stats registeredusers ;
check_password admin localhost asd ;
status
ports:
- containerPort: 5222
hostPort: 5222
- containerPort: 5280
hostPort: 5280
volumeMounts:
- mountPath: /opt/ejabberd/conf/ejabberd.yml
name: config
readOnly: true
volumes:
- name: config
hostPath:
path: ./conf/ejabberd.yml
type: File
```
Images Comparison
-----------------
Let's summarize the differences between both container images. Legend:
- :sparkle: is the recommended alternative
- :orange_circle: added in the latest release (ejabberd 25.03)
- :high_brightness: added in the previous release (ejabberd 24.12)
- :low_brightness: added in the pre-previous release (ejabberd 24.10)
| | [![ejabberd Container](https://img.shields.io/badge/ejabberd-grey?logo=opencontainersinitiative&logoColor=2094f3)](https://github.com/processone/ejabberd/pkgs/container/ejabberd) | [![ecs Container](https://img.shields.io/badge/ecs-grey?logo=docker&logoColor=2094f3)](https://hub.docker.com/r/ejabberd/ecs/) |
|:----------------------|:------------------|:-----------------------|
| Source code | [ejabberd/.github/container](https://github.com/processone/ejabberd/tree/master/.github/container) | [docker-ejabberd/ecs](https://github.com/processone/docker-ejabberd/tree/master/ecs) |
| Generated by | [container.yml](https://github.com/processone/ejabberd/blob/master/.github/workflows/container.yml) | [tests.yml](https://github.com/processone/docker-ejabberd/blob/master/.github/workflows/tests.yml) |
| Built for | stable releases <br /> `master` branch | stable releases <br /> [`master` branch zip](https://github.com/processone/docker-ejabberd/actions/workflows/tests.yml) |
| Architectures | `linux/amd64` <br /> `linux/arm64` | `linux/amd64` |
| Software | Erlang/OTP 27.3.2-alpine <br /> Elixir 1.18.3 | Alpine 3.19 <br /> Erlang/OTP 26.2 <br /> Elixir 1.15.7 |
| Published in | [ghcr.io/processone/ejabberd](https://github.com/processone/ejabberd/pkgs/container/ejabberd) | [docker.io/ejabberd/ecs](https://hub.docker.com/r/ejabberd/ecs/) <br /> [ghcr.io/processone/ecs](https://github.com/processone/docker-ejabberd/pkgs/container/ecs) |
| :black_square_button: **Additional content** |
| [ejabberd-contrib](https://docs.ejabberd.im/admin/guide/modules/#ejabberd-contrib) | included | not included |
| [ejabberdapi](#ejabberdapi) | included :orange_circle: | included |
| :black_square_button: **Ports** |
| [1880](#ports) for WebAdmin | yes :orange_circle: | yes :orange_circle: |
| [5210](#ports) for `ERL_DIST_PORT` | supported | supported :orange_circle: |
| :black_square_button: **Paths** |
| `$HOME` | `/opt/ejabberd/` | `/home/ejabberd/` |
| User data | `$HOME` :sparkle: <br /> `/home/ejabberd/` :orange_circle: | `$HOME` <br /> `/opt/ejabberd/` :sparkle: :low_brightness: |
| `ejabberdctl` | `ejabberdctl` :sparkle: <br /> `bin/ejabberdctl` :orange_circle: | `bin/ejabberdctl` <br /> `ejabberdctl` :sparkle: :low_brightness: |
| [`captcha.sh`](#captcha) | `$HOME/bin/captcha.sh` :orange_circle: | `$HOME/bin/captcha.sh` :orange_circle: |
| `*.sql` files | `$HOME/sql/*.sql` :sparkle: :orange_circle: <br /> `$HOME/database/*.sql` :orange_circle: | `$HOME/database/*.sql` <br /> `$HOME/sql/*.sql` :sparkle: :orange_circle: |
| Mnesia spool files | `$HOME/database/` :sparkle: <br /> `$HOME/database/NODENAME/` :orange_circle: | `$HOME/database/NODENAME/` <br /> `$HOME/database/` :sparkle: :orange_circle: |
| :black_square_button: **Variables** |
| [`EJABBERD_MACRO_*`](#macros-in-environment) | supported :high_brightness: | supported :high_brightness: |
| Macros used in `ejabberd.yml` | yes :orange_circle: | yes :orange_circle: |
| [`EJABBERD_MACRO_ADMIN`](#register-admin-account) | Grant admin rights :orange_circle: <br /> (default `admin@localhost`) <br /> | Hardcoded `admin@localhost` |
| [`REGISTER_ADMIN_PASSWORD`](#register-admin-account) | Register admin account :orange_circle: | unsupported |
| `CTL_OVER_HTTP` | enabled :orange_circle: | unsupported |
+11 -11
View File
@@ -25,18 +25,18 @@ support platforms, the best being [Stack Overflow][stackoverflow].
Stack Overflow is a much better place to ask questions since:
- there are thousands of people willing to help on Stack Overflow
- questions and answers stay available for public viewing so your question / answer might help
* there are thousands of people willing to help on Stack Overflow
* questions and answers stay available for public viewing so your question / answer might help
someone else
- Stack Overflow's voting system assures that the best answers are prominently visible.
* Stack Overflow's voting system assures that the best answers are prominently visible.
To save your and our time, we will systematically close all issues that are requests for general
support and redirect people to the section you are reading right now.
Other channels for support are:
- ejabberd XMPP room: [ejabberd@conference.process-one.net][muc]
- [ejabberd XMPP room logs][logs]
- [ejabberd Mailing List][list]
* ejabberd XMPP room: [ejabberd@conference.process-one.net][muc]
* [ejabberd Mailing List][list]
### Found an Issue or Bug?
@@ -80,6 +80,7 @@ Before you submit your pull request consider the following guidelines:
```shell
git checkout -b my-fix-branch master
```
* Test your changes and, if relevant, expand the automated test suite.
* Create your patch commit, including appropriate test cases.
* If the changes affect public APIs, change or add relevant [documentation][doc-repo].
@@ -88,6 +89,7 @@ Before you submit your pull request consider the following guidelines:
```shell
git commit -a
```
Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files.
* Push your branch to GitHub:
@@ -128,22 +130,20 @@ That's it! Thank you for your contribution!
Upon submitting a Pull Request, we will ask you to sign our CLA if you haven't done
so before. It's a quick process, we promise, and you will be able to do it all online
You can read [ProcessOne Contribution License Agreement][cla] in PDF.
Here's a link to the [ProcessOne Contribution License Agreement][cla].
This is part of the legal framework of the open-source ecosystem that adds some red tape,
but protects both the contributor and the company / foundation behind the project. It also
gives us the option to relicense the code with a more permissive license in the future.
[coc]: https://github.com/processone/ejabberd/blob/master/CODE_OF_CONDUCT.md
[stackoverflow]: https://stackoverflow.com/questions/tagged/ejabberd?sort=newest
[list]: https://lists.jabber.ru/mailman/listinfo/ejabberd
[list]: https://web.archive.org/web/20230319174915/http://lists.jabber.ru/mailman/listinfo/ejabberd
[muc]: xmpp:ejabberd@conference.process-one.net
[logs]: https://process-one.net/logs/ejabberd@conference.process-one.net/
[github]: https://github.com/processone/ejabberd
[github-issues]: https://github.com/processone/ejabberd/issues
[github-new-issue]: https://github.com/processone/ejabberd/issues/new
[github-pr]: https://github.com/processone/ejabberd/pulls
[doc-repo]: https://github.com/processone/docs.ejabberd.im
[developer-setup]: https://docs.ejabberd.im/developer/
[cla]: https://www.process-one.net/resources/ejabberd-cla.pdf
[cla]: https://cla.process-one.net/
+12 -3
View File
@@ -3,7 +3,8 @@
#
ESCRIPT = @ESCRIPT@
REBAR = @rebar@
REBAR = @rebar@ # rebar|rebar3|mix binary (or path to binary)
REBAR3 = @REBAR3@ # path to rebar3 binary
MIX = @rebar@
AWK = @AWK@
INSTALL = @INSTALL@
@@ -266,7 +267,7 @@ _build/edoc/logo.png: edoc_compile
#
format:
tools/rebar3-format.sh $(REBAR)
tools/rebar3-format.sh $(REBAR3)
indent:
tools/emacs-indent.sh
@@ -642,6 +643,13 @@ dialyzer: erlang_plt deps_plt ejabberd_plt
endif
endif
#.
#' elvis
#
elvis:
$(REBAR) lint
#.
#' test
#
@@ -695,10 +703,11 @@ help:
@echo " translations Extract translation files"
@echo " TAGS Generate tags file for text editors"
@echo ""
@echo " format Format source code using rebar3_format [rebar3]"
@echo " format Format source code using rebar3_format"
@echo " indent Indent source code using erlang-mode [emacs]"
@echo ""
@echo " dialyzer Run Dialyzer static analyzer"
@echo " elvis Run Elvis source code style reviewer [rebar3]"
@echo " hooks Run hooks validator"
@echo " test Run Common Tests suite [rebar3]"
@echo " test-eunit Run EUnit suite [rebar3]"
+19 -15
View File
@@ -24,7 +24,6 @@
<img src="https://img.shields.io/github/v/tag/processone/docs.ejabberd.im?sort=semver&logo=&label=docs&logoWidth=0" /></a>
</p>
[ejabberd][im] is an open-source,
robust, scalable and extensible realtime platform built using [Erlang/OTP][erlang],
that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service.
@@ -39,12 +38,16 @@ Installation
There are several ways to install ejabberd:
- Source code: compile yourself, see [COMPILE](COMPILE.md)
- Installers: [ProcessOne Download][p1download] and [GitHub Releases][releases] for releases, [GitHub Actions](https://github.com/processone/ejabberd/actions/workflows/installers.yml) for master branch (run/deb/rpm for x64 and arm64)
- `ecs` container image: [Docker Hub][hubecs] and [Github Packages][packagesecs], see [ecs README][docker-ecs-readme] (for x64)
- `ejabberd` container image: [Github Packages][packages] for releases and master branch, see [CONTAINER](CONTAINER.md) (for x64 and arm64)
- Installers:
- [ProcessOne Download Page][p1download] or [GitHub Releases][releases] for releases.
- [GitHub Actions](https://github.com/processone/ejabberd/actions/workflows/installers.yml) for master branch (`run`/`deb`/`rpm` for `x64` and `arm64`)
- Docker Containers:
- `ecs` container image: [Docker Hub][hubecs] and [Github Packages][packagesecs], see [ecs README][docker-ecs-readme] (for `x64`)
- `ejabberd` container image: [Github Packages][packages] for releases and master branch, see [CONTAINER](CONTAINER.md) (for `x64` and `arm64`)
- Using your [Operating System package][osp]
- Using the [Homebrew][homebrew] package manager
More info can be found in the `Installation` part of [ejabberd Docs](https://docs.ejabberd.im/admin/install/).
Documentation
-------------
@@ -61,7 +64,6 @@ Once ejabberd is installed, try:
ejabberdctl help
man ejabberd.yml
Development
-----------
@@ -74,6 +76,7 @@ or in your local machine as explained in [Localization][localization].
Documentation for developers is available in [ejabberd docs: Developers][docs-dev].
There are nightly builds of ejabberd, both for `master` branch and for Pull Requests:
- Installers: go to [GitHub Actions: Installers](https://github.com/processone/ejabberd/actions/workflows/installers.yml), open the most recent commit, on the bottom of that commit page, download the `ejabberd-packages.zip` artifact.
- `ejabberd` container image: go to [ejabberd Github Packages][packages]
@@ -84,6 +87,10 @@ or some other method from [ProcessOne Contact][p1contact].
For commercial offering and support, including [ejabberd Business Edition][p1home]
and [Fluux (ejabberd in the Cloud)][fluux], please check [ProcessOne ejabberd page][p1home].
Security
--------
For information on how to report security vulnerabilities, please refer to the [SECURITY.md](SECURITY.md) file. It contains guidelines on how to report vulnerabilities privately and securely, ensuring that any issues are addressed in a timely and confidential manner.
Community
---------
@@ -94,13 +101,11 @@ There are several places to get in touch with other ejabberd developers and admi
- [GitHub Discussions][discussions]
- [Stack Overflow][stackoverflow]
License
-------
ejabberd is released under the GNU General Public License v2 (see [COPYING](COPYING)),
and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MIT License.
- ejabberd is released under the __GNU General Public License v2__ (see [COPYING](COPYING))
- [ejabberd translations](https://github.com/processone/ejabberd-po/) under __MIT License__.
[discussions]: https://github.com/processone/ejabberd/discussions
[docker-ecs-readme]: https://github.com/processone/docker-ejabberd/tree/master/ecs#readme
@@ -111,22 +116,21 @@ and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MI
[fluux]: https://fluux.io/
[homebrew]: https://docs.ejabberd.im/admin/install/homebrew/
[hubecs]: https://hub.docker.com/r/ejabberd/ecs/
[im]: https://ejabberd.im/
[im]: https://www.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/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/
[p1contact]: https://www.process-one.net/contact/
[p1download]: https://www.process-one.net/download/ejabberd/
[p1home]: https://www.process-one.net/ejabberd/
[packages]: https://github.com/processone/ejabberd/pkgs/container/ejabberd
[packagesecs]: https://github.com/processone/docker-ejabberd/pkgs/container/ecs
[releases]: https://github.com/processone/ejabberd/releases
[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol
[stackoverflow]: https://stackoverflow.com/questions/tagged/ejabberd?sort=newest
[weblate]: https://hosted.weblate.org/projects/ejabberd/ejabberd-po/
[xeps]: https://www.process-one.net/en/ejabberd/protocols/
[xeps]: https://www.process-one.net/ejabberd-features/
[xmpp]: https://xmpp.org/
[xmppej]: https://xmpp.org/software/servers/ejabberd/
+45
View File
@@ -0,0 +1,45 @@
# Security Policy
## Supported Versions
We recommend that all users always use the latest version of ejabberd.
To ensure the best experience and security, upgrade to the latest version available on [this repo](https://github.com/processone/ejabberd).
## Reporting a Vulnerability
### Private Reporting
**Preferred Method**: Use GitHub's private vulnerability reporting system by clicking the "Report a Vulnerability" button in the [Security tab of this repository](https://github.com/processone/ejabberd/security). This ensures your report is securely transmitted and tracked.
**Alternative**: If you cannot use the GitHub system, send an email to **`contact@process-one.net`** with the following details:
- A clear description of the vulnerability.
- Steps to reproduce the issue.
- Any potential impact or exploitation scenarios.
### Response Time
We aim to acknowledge receipt of your report within 72 hours. You can expect regular updates on the status of your report.
### Resolution
If the vulnerability is confirmed, we will work on a patch or mitigation strategy.
We will notify you once the issue is resolved and coordinate a public disclosure if needed.
### Acknowledgements
We value and appreciate the contributions of security researchers and community members.
If you wish, we are happy to acknowledge your efforts publicly by listing your name (or alias) below in this document.
Please let us know if you would like to be recognized when reporting the vulnerability.
## Public Discussion
For general inquiries or discussions about the projects security, feel free to chat with us here:
- XMPP room: `ejabberd@conference.process-one.net`
- [GitHub Discussions](https://github.com/processone/ejabberd/discussions)
However, please note that if the issue is **critical** or potentially exploitable, **do not share it publicly**. Instead, we strongly recommend you contact the maintainers directly via the private reporting methods outlined above to ensure a secure and timely response.
Thank you for helping us improve the security of ejabberd!
+1 -1
View File
@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 24.06` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 25.04` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
REQUIRE_ERLANG_MIN="9.0.5 (Erlang/OTP 20.0)"
REQUIRE_ERLANG_MAX="100.0.0 (No Max)"
+209 -182
View File
@@ -19,7 +19,7 @@
<category rdf:resource="https://linkmauve.fr/ns/xmpp-doap#category-xmpp"/>
<homepage rdf:resource="https://www.ejabberd.im"/>
<download-page rdf:resource="https://www.process-one.net/en/ejabberd/downloads/"/>
<download-page rdf:resource="https://www.process-one.net/download/ejabberd/"/>
<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/assets/img/footer_logo_e@2x.png"/>
@@ -48,8 +48,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0004.html"/>
<xmpp:version>2.9</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -57,8 +57,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0012.html"/>
<xmpp:version>2.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_last</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -67,7 +67,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0013.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:since>16.02</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_offline</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -75,8 +75,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0016.html"/>
<xmpp:version>1.6</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_privacy</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -84,8 +84,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0022.html"/>
<xmpp:version>1.4</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_offline</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -93,8 +93,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0023.html"/>
<xmpp:version>1.3</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.7.5</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_offline</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -102,8 +102,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0030.html"/>
<xmpp:version>2.4</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_disco</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -112,7 +112,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0033.html"/>
<xmpp:version>1.1</xmpp:version>
<xmpp:since>15.04</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_multicast</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -120,8 +120,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0039.html"/>
<xmpp:version>0.6.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_stats</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -129,17 +129,26 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0045.html"/>
<xmpp:version>1.25</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_muc</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0048.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_pubsub</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0049.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_private</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -147,8 +156,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0050.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>1.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_adhoc</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -156,8 +165,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0054.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_vcard</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -165,8 +174,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0055.html"/>
<xmpp:version>1.3</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_vcard</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -174,8 +183,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0059.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -183,8 +192,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0060.html"/>
<xmpp:version>1.14</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>partial</xmpp:status>
<xmpp:note>mod_pubsub</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -192,8 +201,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0065.html"/>
<xmpp:version>1.8</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.0.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_proxy65</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -201,8 +210,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0077.html"/>
<xmpp:version>2.4</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_register</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -210,17 +219,26 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0078.html"/>
<xmpp:version>2.5</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>17.03</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_legacy_auth</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0082.html"/>
<xmpp:version>1.1.1</xmpp:version>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0085.html"/>
<xmpp:version>2.1</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_client_state</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -228,8 +246,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0086.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -237,8 +255,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0092.html"/>
<xmpp:version>1.1</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_version</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -246,8 +264,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0106.html"/>
<xmpp:version>1.1</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -255,8 +273,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0114.html"/>
<xmpp:version>1.6</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>ejabberd_service</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -264,8 +282,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0115.html"/>
<xmpp:version>1.5</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.4</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_caps</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -273,8 +291,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0124.html"/>
<xmpp:version>1.11</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>16.12</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>ejabberd_bosh</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -283,7 +301,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0133.html"/>
<xmpp:version>1.3.0</xmpp:version>
<xmpp:since>13.10</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:status>partial</xmpp:status>
<xmpp:note>mod_configure</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -291,8 +309,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0138.html"/>
<xmpp:version>2.1</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>1.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>ejabberd_c2s</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -300,8 +318,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0153.html"/>
<xmpp:version>1.1</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>17.09</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_vcard</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -310,7 +328,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0156.html"/>
<xmpp:version>1.4.0</xmpp:version>
<xmpp:since>22.05</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_host_meta</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -318,8 +336,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0157.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_disco</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -327,8 +345,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0158.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>ejabberd_captcha</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -336,8 +354,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0160.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>16.01</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_offline</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -345,8 +363,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0163.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.0.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_pubsub</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -354,8 +372,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0170.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>17.12</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -363,26 +381,26 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0175.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>1.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>ejabberd_auth_anonymous</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0176.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:note>ejabberd_stun</xmpp:note>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0178.html"/>
<xmpp:version>1.1</xmpp:version>
<xmpp:since>17.03</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0185.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>17.03</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_s2s_dialback</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -390,8 +408,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0191.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.7</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_blocking</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -400,7 +418,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0198.html"/>
<xmpp:version>1.5.2</xmpp:version>
<xmpp:since>14.05</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_stream_mgmt</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -408,8 +426,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0199.html"/>
<xmpp:version>2.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_ping</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -417,8 +435,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0202.html"/>
<xmpp:version>2.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_time</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -426,8 +444,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0203.html"/>
<xmpp:version>2.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_offline</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -435,8 +453,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0205.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>1.1.2</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -444,53 +462,44 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0206.html"/>
<xmpp:version>1.4</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>16.12</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>ejabberd_bosh</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0212.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0215.html"/>
<xmpp:version>0.7</xmpp:version>
<xmpp:since>20.04</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_stun_disco</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0216.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:note></xmpp:note>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0220.html"/>
<xmpp:version>1.1.1</xmpp:version>
<xmpp:since>17.03</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_s2s_dialback</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0220.html"/>
<xmpp:version>1.1</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:note>ejabberd_s2s, mod_s2s_dialback</xmpp:note>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0223.html"/>
<xmpp:version>1.1.1</xmpp:version>
<xmpp:since>2.0.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_pubsub</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0227.html"/>
<xmpp:version>1.1</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>partial</xmpp:status>
<xmpp:note>ejabberd_piefxis</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -498,8 +507,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0231.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>ejabberd_captcha</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -507,26 +516,17 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0237.html"/>
<xmpp:version>1.3</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_roster</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0243.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0248.html"/>
<xmpp:version>0.2</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_pubsub</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -534,54 +534,54 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0249.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_muc</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0270.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0279.html"/>
<xmpp:version>0.2</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>2.1.3</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_sic</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0280.html"/>
<xmpp:version>0.13.2</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:version>1.0.1</xmpp:version>
<xmpp:since>13.06</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_carboncopy</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0288.html"/>
<xmpp:version>1.0.1</xmpp:version>
<xmpp:since>24.10</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_s2s_bidi</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0313.html"/>
<xmpp:version>0.6.1</xmpp:version>
<xmpp:since>15.06</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_mam</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0317.html"/>
<xmpp:version>0.1</xmpp:version>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:since>21.12</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:note>mod_muc_room, conversejs/prosody compatible</xmpp:note>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_muc_room, 0.2.0 since 25.03</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
@@ -589,7 +589,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0328.html"/>
<xmpp:version>0.1</xmpp:version>
<xmpp:since>19.09</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_jidprep</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -597,8 +597,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0334.html"/>
<xmpp:version>0.2</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>16.01</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_mam, mod_muc_log, mod_offline</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -607,7 +607,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0352.html"/>
<xmpp:version>0.1</xmpp:version>
<xmpp:since>14.12</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_client_state</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -616,16 +616,16 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0355.html"/>
<xmpp:version>0.4.1</xmpp:version>
<xmpp:since>16.09</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_delegation</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0356.html"/>
<xmpp:version>0.2.1</xmpp:version>
<xmpp:since>16.09</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:version>0.4.1</xmpp:version>
<xmpp:since>24.10</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_privilege</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -634,7 +634,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0357.html"/>
<xmpp:version>0.2</xmpp:version>
<xmpp:since>17.08</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_push</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -642,17 +642,17 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0359.html"/>
<xmpp:version>0.5.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>15.09</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_mam</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0363.html"/>
<xmpp:version>0.2</xmpp:version>
<xmpp:version>0.3.0</xmpp:version>
<xmpp:since>15.10</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_http_upload</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -660,8 +660,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0368.html"/>
<xmpp:version>1.1.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>17.09</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -670,16 +670,25 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0369.html"/>
<xmpp:version>0.14.1</xmpp:version>
<xmpp:since>16.03</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_mix</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0384.html"/>
<xmpp:version>0.8.3</xmpp:version>
<xmpp:since>21.12</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>node_pep</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0386.html"/>
<xmpp:version>0.3.0</xmpp:version>
<xmpp:since>24.02</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -688,7 +697,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0388.html"/>
<xmpp:version>0.4.0</xmpp:version>
<xmpp:since>24.02</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -697,7 +706,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0398.html"/>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:since>18.03</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_avatar</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -706,7 +715,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0402.html"/>
<xmpp:version>1.1.3</xmpp:version>
<xmpp:since>23.10</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_private</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -714,8 +723,8 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0405.html"/>
<xmpp:version>0.3.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>19.02</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_mix_pam</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -724,7 +733,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0410.html"/>
<xmpp:version>1.1.0</xmpp:version>
<xmpp:since>18.12</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_muc_room</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -733,7 +742,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0411.html"/>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:since>18.12</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_private</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -742,17 +751,17 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0421.html"/>
<xmpp:version>0.1.0</xmpp:version>
<xmpp:since>23.10</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_muc_occupantid</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0424.html"/>
<xmpp:version>0.4.0</xmpp:version>
<xmpp:version>0.4.2</xmpp:version>
<xmpp:since>24.02</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:note></xmpp:note>
<xmpp:status>partial</xmpp:status>
<xmpp:note>mod_mam, Tombstones not implemented</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
@@ -760,7 +769,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0425.html"/>
<xmpp:version>0.3.0</xmpp:version>
<xmpp:since>24.06</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_mam</xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -769,7 +778,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0440.html"/>
<xmpp:version>0.4.0</xmpp:version>
<xmpp:since>24.02</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
@@ -777,18 +786,36 @@
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0441.html"/>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:since></xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:since>15.06</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_mam</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0474.html"/>
<xmpp:version>0.3.0</xmpp:version>
<xmpp:version>0.4.0</xmpp:version>
<xmpp:since>24.02</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:note></xmpp:note>
<xmpp:status>complete</xmpp:status>
<xmpp:note>, 0.4.0 since 25.03</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0480.html"/>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:since>24.10</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_scram_upgrade</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0484.html"/>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:since>24.12</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_auth_fast</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
@@ -796,7 +823,7 @@
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0485.html"/>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:since>24.02</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:status>complete</xmpp:status>
<xmpp:note>, mod_pubsub_serverinfo in ejabberd-contrib.git</xmpp:note>
</xmpp:SupportedXep>
</implements>
-1
View File
@@ -9,7 +9,6 @@ Group=@installuser@
LimitNOFILE=65536
Restart=on-failure
RestartSec=5
WatchdogSec=30
ExecStart=@ctlscriptpath@/ejabberdctl foreground
ExecStop=/bin/sh -c '@ctlscriptpath@/ejabberdctl stop && @ctlscriptpath@/ejabberdctl stopped'
ExecReload=@ctlscriptpath@/ejabberdctl reload_config
+15 -4
View File
@@ -67,7 +67,7 @@ listen:
/admin: ejabberd_web_admin
/.well-known/acme-challenge: ejabberd_acme
-
port: 3478
port: 5478
ip: "::"
transport: udp
module: ejabberd_stun
@@ -111,11 +111,19 @@ access_rules:
api_permissions:
"console commands":
from:
- ejabberd_ctl
from: ejabberd_ctl
who: all
what: "*"
"admin access":
"webadmin commands":
from: ejabberd_web_admin
who: admin
what: "*"
"adhoc commands":
from: mod_adhoc_api
who: admin
what: "*"
"http access":
from: mod_http_api
who:
access:
allow:
@@ -156,6 +164,7 @@ shaper_rules:
modules:
mod_adhoc: {}
mod_adhoc_api: {}
mod_admin_extra: {}
mod_announce:
access: announce
@@ -196,6 +205,7 @@ modules:
default_room_options:
mam: true
mod_muc_admin: {}
mod_muc_occupantid: {}
mod_offline:
access_max_user_messages: max_user_offline_messages
mod_ping: {}
@@ -224,6 +234,7 @@ modules:
ip_access: trusted_network
mod_roster:
versioning: true
mod_s2s_bidi: {}
mod_s2s_dialback: {}
mod_shared_roster: {}
mod_stream_mgmt:
+11
View File
@@ -198,6 +198,17 @@
#
#CONTRIB_MODULES_CONF_DIR=/etc/ejabberd/modules
#.
#' CTL_OVER_HTTP: Path to ejabberdctl HTTP listener socket
#
# To speedup ejabberdctl execution time for ejabberd commands,
# you can setup an ejabberd_http listener with ejabberd_ctl handling requests,
# listening in a unix domain socket.
#
# Default: disabled
#
#CTL_OVER_HTTP=sockets/ctl_over_http.sock
#.
#'
# vim: foldmarker=#',#. foldmethod=marker:
+58 -12
View File
@@ -66,10 +66,15 @@ done
# shellcheck source=ejabberdctl.cfg.example
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
[ "$ERLANG_NODE" = "${ERLANG_NODE%@*}" ] && ERLANG_NODE="$ERLANG_NODE@$(hostname -s)"
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
: "${SPOOL_DIR:="{{spool_dir}}"}"
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
# backward support for old mnesia spool dir path
: "${SPOOL_DIR_OLD:="$SPOOL_DIR/$ERLANG_NODE"}"
[ -r "$SPOOL_DIR_OLD/schema.DAT" ] && [ ! -r "$SPOOL_DIR/schema.DAT" ] && SPOOL_DIR="$SPOOL_DIR_OLD"
# define erl parameters
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
if [ -n "$FIREWALL_WINDOW" ] ; then
@@ -178,7 +183,9 @@ livewarning()
echo "Please be extremely cautious with your actions,"
echo "and exit immediately if you are not completely sure."
echo ""
echo "To exit and detach this shell from ejabberd, press:"
echo "To stop ejabberd gracefully:"
echo " ejabberd:stop()."
echo "To quit erlang immediately, press:"
echo " control+g and then q"
echo ""
echo "--------------------------------------------------------------------"
@@ -252,7 +259,7 @@ help()
# dynamic node name helper
uid() {
ERTSVERSION="$("$ERL" -version 2>&1 | sed 's|.*\([0-9][0-9]\).*|\1|g')"
ERTSVERSION="$("$ERL" -version 2>&1 | sed 's|.* \([0-9]*[0-9]\).*|\1|g')"
if [ $ERTSVERSION -lt 11 ] ; then # otp 23.0 includes erts 11.0
# Erlang/OTP lower than 23, which doesn's support dynamic node code
N=1
@@ -331,6 +338,54 @@ wait_status()
[ $timeout -gt 0 ]
}
exec_other_command()
{
if [ -z "$CTL_OVER_HTTP" ] || [ ! -S "$CTL_OVER_HTTP" ] \
|| [ ! -x "$(command -v curl)" ] || [ -z "$1" ] || [ "$1" = "help" ] \
|| [ "$1" = "mnesia_info_ctl" ]|| [ "$1" = "print_sql_schema" ] ; then
exec_erl "$(uid ctl)" -hidden -noinput \
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
-s ejabberd_ctl \
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
result=$?
case $result in
3) help;;
*) :;;
esac
exit $result
else
exec_ctl_over_http_socket "$@"
fi
}
exec_ctl_over_http_socket()
{
COMMAND=${1}
CARGS=""
while [ $# -gt 0 ]; do
[ -z "$CARGS" ] && CARGS="[" || CARGS="${CARGS}, "
CARGS="${CARGS}\"$1\""
shift
done
CARGS="${CARGS}]"
TEMPHEADERS=temp-headers.log
curl \
--unix-socket ${CTL_OVER_HTTP} \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "${CARGS}" \
--dump-header ${TEMPHEADERS} \
--no-progress-meter \
"http://localhost/ctl/${COMMAND}"
result=$(sed -n 's/.*status-code: \([0-9]*\).*/\1/p' < $TEMPHEADERS)
rm ${TEMPHEADERS}
case $result in
2|3) exec_other_command help ${COMMAND};;
*) :;;
esac
exit $result
}
# ensure we can change current directory to SPOOL_DIR
[ -d "$SPOOL_DIR" ] || exec_cmd mkdir -p "$SPOOL_DIR"
cd "$SPOOL_DIR" || {
@@ -399,15 +454,6 @@ case $1 in
;;
*)
set_dist_client
exec_erl "$(uid ctl)" -hidden -noinput \
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
-s ejabberd_ctl \
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
result=$?
case $result in
2|3) help;;
*) :;;
esac
exit $result
exec_other_command "$@"
;;
esac
+37 -21
View File
@@ -5,38 +5,54 @@
{config,
[#{dirs => ["src"],
filter => "*.erl",
ignore => ['ELDAPv3', eldap_filter_yecc],
ruleset => erl_files,
rules => [{elvis_style, line_length, #{limit => 100,
skip_comments => false}},
rules => [{elvis_text_style, line_length, #{limit => 1000, skip_comments => false}},
{elvis_text_style, no_tabs, disable},
{elvis_style, no_debug_call, disable},
{elvis_style, operator_spaces, disable},
{elvis_style, atom_naming_convention, disable},
{elvis_style, consistent_variable_casing, disable},
{elvis_style, dont_repeat_yourself, #{min_complexity => 70}},
{elvis_style, export_used_types, disable},
{elvis_style, function_naming_convention, disable},
{elvis_style, god_modules, #{limit => 300}},
{elvis_style, invalid_dynamic_call, disable},
{elvis_style, variable_naming_convention, #{ regex => ".*" }},
{elvis_style, dont_repeat_yourself, #{min_complexity => 20}}
]
{elvis_style, macro_module_names, disable},
{elvis_style, macro_names, disable},
{elvis_style, max_function_arity, disable}, % #{max_arity => 15}},
{elvis_style, nesting_level, disable},
{elvis_style, no_author, disable},
{elvis_style, no_catch_expressions, disable},
{elvis_style, no_debug_call, disable},
{elvis_style, no_if_expression, disable},
{elvis_style, no_import, disable},
{elvis_style, no_match_in_condition, disable},
{elvis_style, no_nested_try_catch, disable},
{elvis_style, no_single_clause_case, disable},
{elvis_style, no_spec_with_records, disable},
{elvis_style, no_throw, disable},
{elvis_style, operator_spaces, disable},
{elvis_style, param_pattern_matching, disable},
{elvis_style, private_data_types, disable},
{elvis_style, variable_naming_convention, disable}
]
},
%#{dirs => ["include"],
% filter => "*.hrl",
% ruleset => hrl_files},
#{dirs => ["."],
filter => "Makefile.in",
ruleset => makefiles,
rules => [{elvis_style, line_length, #{limit => 100,
rules => [{elvis_text_style, line_length, #{limit => 400,
skip_comments => false}},
{elvis_style, no_tabs, disable},
{elvis_style, dont_repeat_yourself, #{min_complexity => 20}}
]
},
#{dirs => ["."],
filter => "rebar.config",
ruleset => rebar_config,
rules => [{elvis_style, line_length, #{limit => 100,
skip_comments => false}},
{elvis_style, no_tabs, disable},
{elvis_style, dont_repeat_yourself, #{min_complexity => 20}}
]
{elvis_style, dont_repeat_yourself, #{min_complexity => 20}}
]
}
}
]
}
]
}
].
%% vim: set filetype=erlang tabstop=8:
+5 -5
View File
@@ -1,5 +1,5 @@
otp_path: "/usr/lib/erlang"
plt_path: "_build/default/rebar3_24.3.3_plt"
#otp_path: "/usr/lib/erlang"
#plt_path: "_build/default/rebar3_24.3.3_plt"
#code_reload:
# node: ejabberd@localhost
apps_dirs:
@@ -14,12 +14,12 @@ macros:
- name: DEPRECATED_GET_STACKTRACE
- name: HAVE_ERL_ERROR
- name: HAVE_URI_STRING
- name: OTP_BELOW_25
- name: OTP_BELOW_27
- name: SIP
- name: STUN
diagnostics:
# enabled:
# - crossref
enabled:
- crossref
disabled:
# - dialyzer
- unused_includes # Otherwise it complains about unused logger.hrl
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+2 -2
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -18,5 +18,5 @@
%%%
%%%----------------------------------------------------------------------
-record(passwd, {us = {<<"">>, <<"">>} :: {binary(), binary()} | '$1',
-record(passwd, {us = {<<"">>, <<"">>} :: {binary(), binary()} | {binary(), binary(), atom()} | '$1',
password = <<"">> :: binary() | scram() | '_'}).
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+2 -2
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -44,7 +44,7 @@
allow_visitor_nickchange = true :: boolean(),
public = true :: boolean(),
public_list = true :: boolean(),
persistent = false :: boolean(),
persistent = false :: boolean() | {destroying, boolean()},
moderated = true :: boolean(),
captcha_protected = false :: boolean(),
members_by_default = true :: boolean(),
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -2,7 +2,7 @@
%%% RFC 1928 constants.
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,5 +1,5 @@
%%%----------------------------------------------------------------------
%%% ejabberd, Copyright (C) 2017-2024 ProcessOne
%%% ejabberd, Copyright (C) 2017-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1 -1
View File
@@ -1,6 +1,6 @@
%%%-------------------------------------------------------------------
%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
%%% @copyright (C) 2002-2024 ProcessOne, SARL. All Rights Reserved.
%%% @copyright (C) 2002-2025 ProcessOne, SARL. All Rights Reserved.
%%%
%%% Licensed under the Apache License, Version 2.0 (the "License");
%%% you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
-19
View File
@@ -1,19 +0,0 @@
defmodule Ejabberd.Module do
defmacro __using__(opts) do
logger_enabled = Keyword.get(opts, :logger, true)
quote do
@behaviour :gen_mod
import Ejabberd.Module
unquote(if logger_enabled do
quote do: import Ejabberd.Logger
end)
end
end
# gen_mod callbacks
def depends(_host, _opts), do: []
def mod_opt_type(_), do: []
end
+44
View File
@@ -0,0 +1,44 @@
defmodule Ejabberd.Auth.Example do
@moduledoc """
Example ejabberd auth method written in Elixir.
This is an example to demonstrate the usage of Elixir to
create ejabberd auth methods.
Example configuration:
auth_method: 'Ejabberd.Auth.Example'
"""
@behaviour :ejabberd_auth
import Ejabberd.Logger
@impl true
def start(host) do
info("Starting Ejabberd.Auth.Example to authenticate '#{host}' users")
nil
end
@impl true
def stop(host) do
info("Stopping Ejabberd.Auth.Example to authenticate '#{host}' users")
nil
end
@impl true
def check_password("alice", _authz_id, _host, "secret"), do: {:nocache, true}
def check_password(_username, _authz_id, _host, _secret), do: {:nocache, false}
@impl true
def user_exists("alice", _host), do: {:nocache, true}
def user_exists(_username, _host), do: {:nocache, false}
@impl true
def plain_password_required(_binary), do: true
@impl true
def store_type(_host), do: :external
@impl true
def use_cache(_host), do: false
end
@@ -1,14 +1,27 @@
defmodule ModPresenceDemo do
use Ejabberd.Module
defmodule Ejabberd.Module.Example do
@moduledoc """
Example ejabberd module written in Elixir.
This is an example to demonstrate the usage of Elixir to
create ejabberd modules.
Example configuration:
modules:
'Ejabberd.Module.Example': {}
"""
@behaviour :gen_mod
import Ejabberd.Logger
def start(host, _opts) do
info("Starting ejabberd module Presence Demo")
info("Starting Ejabberd.Module.Example for host '#{host}'")
Ejabberd.Hooks.add(:set_presence_hook, host, __MODULE__, :on_presence, 50)
:ok
end
def stop(host) do
info("Stopping ejabberd module Presence Demo")
info("Stopping Ejabberd.Module.Example for host '#{host}'")
Ejabberd.Hooks.delete(:set_presence_hook, host, __MODULE__, :on_presence, 50)
:ok
end
+804 -236
View File
File diff suppressed because it is too large Load Diff
+18 -30
View File
@@ -43,9 +43,8 @@ defmodule Ejabberd.MixProject do
def application do
[mod: {:ejabberd_app, []},
applications: [:idna, :inets, :kernel, :sasl, :ssl, :stdlib, :mix,
:fast_tls, :fast_xml, :fast_yaml, :jose,
:p1_utils, :stringprep, :syntax_tools, :yconf, :xmpp]
extra_applications: [:inets, :kernel, :sasl, :ssl, :stdlib, :syntax_tools,
:logger, :mix]
++ cond_apps(),
included_applications: [:mnesia, :os_mon,
:cache_tab, :eimp, :mqtree, :p1_acme,
@@ -80,20 +79,6 @@ defmodule Ejabberd.MixProject do
end
end
defp if_type_exported(module, typeDef, okResult) do
try do
{:ok, concrete} = :dialyzer_utils.get_core_from_beam(:code.which(module))
{:ok, types} = :dialyzer_utils.get_record_and_type_info(concrete)
if Map.has_key?(types, typeDef) do
okResult
else
[]
end
rescue
_ -> []
end
end
defp erlc_options do
# Use our own includes + includes from all dependencies
includes = ["include", deps_include()]
@@ -114,7 +99,7 @@ defmodule Ejabberd.MixProject do
if_version_below(~c"25", [{:d, :OTP_BELOW_25}]) ++
if_version_below(~c"26", [{:d, :OTP_BELOW_26}]) ++
if_version_below(~c"27", [{:d, :OTP_BELOW_27}]) ++
if_type_exported(:odbc, {:opaque, :connection_reference, 0}, [{:d, :ODBC_HAS_TYPES}])
if_version_below(~c"28", [{:d, :OTP_BELOW_28}])
defines = for {:d, value} <- result, do: {:d, value}
result ++ [{:d, :ALL_DEFS, defines}]
end
@@ -134,9 +119,9 @@ defmodule Ejabberd.MixProject do
[{:cache_tab, "~> 1.0"},
{:dialyxir, "~> 1.2", only: [:test], runtime: false},
{:eimp, "~> 1.0"},
{:ex_doc, "~> 0.31", only: [:dev, :edoc], runtime: false},
{:fast_tls, ">= 1.1.18"},
{:fast_xml, ">= 1.1.51"},
{:ex_doc, "~> 0.31", only: [:edoc], runtime: false},
{:fast_tls, "~> 1.1.22"},
{:fast_xml, "~> 1.1.53"},
{:fast_yaml, "~> 1.0"},
{:idna, "~> 6.0"},
{:mqtree, "~> 1.0"},
@@ -145,8 +130,8 @@ defmodule Ejabberd.MixProject do
{:p1_utils, "~> 1.0"},
{:pkix, "~> 1.0"},
{:stringprep, ">= 1.0.26"},
{:xmpp, ">= 1.8.2"},
{:yconf, "~> 1.0"}]
{:xmpp, "~> 1.10.0"},
{:yconf, ">= 1.0.18"}]
++ cond_deps()
end
@@ -166,8 +151,8 @@ defmodule Ejabberd.MixProject do
{Mix.env() == :translations,
{:ejabberd_po, git: "https://github.com/processone/ejabberd-po.git"}},
{Mix.env() == :dev,
{:exsync, "~> 0.2"}},
{config(:redis), {:eredis, "~> 1.2.0"}},
{:exsync, "~> 0.2", optional: true, runtime: false}},
{config(:redis), {:eredis, "~> 1.7.1"}},
{config(:sip), {:esip, "~> 1.0"}},
{config(:zlib), {:ezlib, "~> 1.0"}},
{if_version_above(~c"23", true), {:jose, "~> 1.11.10"}},
@@ -176,7 +161,7 @@ defmodule Ejabberd.MixProject do
{if_version_below(~c"22", true), {:lager, "~> 3.9.1"}},
{config(:lua), {:luerl, "~> 1.2.0"}},
{config(:mysql), {:p1_mysql, ">= 1.0.24"}},
{config(:pgsql), {:p1_pgsql, ">= 1.1.26"}},
{config(:pgsql), {:p1_pgsql, ">= 1.1.32"}},
{config(:sqlite), {:sqlite3, "~> 1.1"}},
{config(:stun), {:stun, "~> 1.0"}}], do:
dep
@@ -184,9 +169,10 @@ defmodule Ejabberd.MixProject do
defp cond_apps do
for {:true, app} <- [{config(:stun), :stun},
{Map.has_key?(System.get_env(), "RELIVE"), :exsync},
{if_version_below(~c"27", true), :jiffy},
{config(:tools), :observer}], do:
{config(:tools), :debugger},
{config(:tools), :observer},
{config(:tools), :wx}], do:
app
end
@@ -209,13 +195,14 @@ defmodule Ejabberd.MixProject do
[# These are the default files included in the package
files: ["include", "lib", "priv", "sql", "src",
"COPYING", "README.md",
"ejabberd.yml.example", "config/runtime.exs",
"mix.exs", "rebar.config", "rebar.config.script", "vars.config"],
maintainers: ["ProcessOne"],
licenses: ["GPL-2.0-or-later"],
links: %{"ejabberd.im" => "https://www.ejabberd.im",
"ejabberd Docs" => "http://docs.ejabberd.im",
"ejabberd Docs" => "https://docs.ejabberd.im",
"GitHub" => "https://github.com/processone/ejabberd",
"ProcessOne" => "http://www.process-one.net/"}]
"ProcessOne" => "https://www.process-one.net/"}]
end
defp vars do
@@ -280,6 +267,7 @@ defmodule Ejabberd.MixProject do
ejabberd: [
include_executables_for: [:unix],
# applications: [runtime_tools: :permanent]
strip_beams: Mix.env() != :dev,
steps: [&copy_extra_files/1, :assemble | maybe_tar]
]
]
+21 -21
View File
@@ -1,39 +1,39 @@
%{
"base64url": {:hex, :base64url, "1.0.1", "f8c7f2da04ca9a5d0f5f50258f055e1d699f0e8bf4cfdb30b750865368403cf6", [:rebar3], [], "hexpm", "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c"},
"cache_tab": {:hex, :cache_tab, "1.0.31", "e4097b50a6f373ab1e0a5f01bab0bef6626771a4cd6c93404ed6d54810e11fbc", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "8582b60a4a09b247ef86355ba9e07fce9e11edc0345a775c9171f971c72b6351"},
"dialyxir": {:hex, :dialyxir, "1.4.3", "edd0124f358f0b9e95bfe53a9fcf806d615d8f838e2202a9f430d59566b6b53b", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "bf2cfb75cd5c5006bec30141b131663299c661a864ec7fbbc72dfa557487a986"},
"earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"},
"eimp": {:hex, :eimp, "1.0.23", "aaf32efab061143403dadbaa63e699ef8e81702fbfa96fd436d5e9be4d6a8d3a", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "907c780023cb2893e4fc4bdbe6a4f02c355913862ac67f0ecc26605e816b628a"},
"dialyxir": {:hex, :dialyxir, "1.4.5", "ca1571ac18e0f88d4ab245f0b60fa31ff1b12cbae2b11bd25d207f865e8ae78a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b0fb08bb8107c750db5c0b324fa2df5ceaa0f9307690ee3c1f6ba5b9eb5d35c3"},
"earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"},
"eimp": {:hex, :eimp, "1.0.24", "853db317ba394d479d2f1181e0b0135a3cd3c2c7eb48ff6cfb035a28dd354b14", [:rebar3], [{:p1_utils, "~> 1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "7d61432eb8a45659c0be475f44e75eeb651743aa64a1de8adf785cdad81961ad"},
"epam": {:hex, :epam, "1.0.14", "aa0b85d27f4ef3a756ae995179df952a0721237e83c6b79d644347b75016681a", [:rebar3], [], "hexpm", "2f3449e72885a72a6c2a843f561add0fc2f70d7a21f61456930a547473d4d989"},
"eredis": {:hex, :eredis, "1.2.0", "0b8e9cfc2c00fa1374cd107ea63b49be08d933df2cf175e6a89b73dd9c380de4", [:rebar3], [], "hexpm", "d9b5abef2c2c8aba8f32aa018203e0b3dc8b1157773b254ab1d4c2002317f1e1"},
"eredis": {:hex, :eredis, "1.7.1", "39e31aa02adcd651c657f39aafd4d31a9b2f63c6c700dc9cece98d4bc3c897ab", [:mix, :rebar3], [], "hexpm", "7c2b54c566fed55feef3341ca79b0100a6348fd3f162184b7ed5118d258c3cc1"},
"erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"},
"esip": {:hex, :esip, "1.0.53", "482786a79d8f5b0aefc60ca68b8c6c7f074f6ede2653705e4206c6779edc5a56", [:rebar3], [{:fast_tls, "1.1.20", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.13", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "a9a1bd5ea52b0e2d1b1d1fec5fb7f0301e90610db1ecfeb205a18cc4e1cb3fc7"},
"ex_doc": {:hex, :ex_doc, "0.34.1", "9751a0419bc15bc7580c73fde506b17b07f6402a1e5243be9e0f05a68c723368", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "d441f1a86a235f59088978eff870de2e815e290e44a8bd976fe5d64470a4c9d2"},
"esip": {:hex, :esip, "1.0.57", "4b14e4832d08b9ffc10d855b5d10b3083232b1d53deb4c046679496ce85569c4", [:rebar3], [{:fast_tls, "1.1.22", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.17", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "19c357e1817b1e04792ef359bf900400f3e6d0e5ade929fd72f88ea9b44af2ed"},
"ex_doc": {:hex, :ex_doc, "0.37.3", "f7816881a443cd77872b7d6118e8a55f547f49903aef8747dbcb345a75b462f9", [:mix], [{:earmark_parser, "~> 1.4.42", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "e6aebca7156e7c29b5da4daa17f6361205b2ae5f26e5c7d8ca0d3f7e18972233"},
"exsync": {:hex, :exsync, "0.4.1", "0a14fe4bfcb80a509d8a0856be3dd070fffe619b9ba90fec13c58b316c176594", [:mix], [{:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "cefb22aa805ec97ffc5b75a4e1dc54bcaf781e8b32564bf74abbe5803d1b5178"},
"ezlib": {:hex, :ezlib, "1.0.13", "3c7f62862850a241159c10b218ecf580bce54d0890601b65144dacc2633be2b0", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "9ee62ab3f8ed55a0fd11a9569fcb8e458683f95575417272192b069f092abfbb"},
"fast_tls": {:hex, :fast_tls, "1.1.20", "d6f12d9ae4fe57e880b144b912e735af89343a8463d39b7eb4be3f6ca6163879", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "d09a12472a56a34c5eecaaed33ea283f00fcdf9dc2e8282ecbaae827f13fc21b"},
"fast_xml": {:hex, :fast_xml, "1.1.52", "0289daafbf1190b0e53b444d4885cccf41e4b05768d4b3acc76dd8d143668e10", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "795192390e06d2b65016a6990bbfa5727f4a26d2914808b1c3c9a32eedcd1bfd"},
"fast_tls": {:hex, :fast_tls, "1.1.22", "44356b256afad4399c2fc5059a3066669dafd8bd4e4e796c9c1cf8910ddd265e", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "e65779aefb7ab15c4755230fef8077e687d20cc5a3984a5974f9f657e8e2485b"},
"fast_xml": {:hex, :fast_xml, "1.1.55", "ace020f2521f2a484ac8467d2822af85534a346e2aae03ffcbc34f29318befaf", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "83f3e23a780ed5f567cdec73953f06c95b838d709dbfa86b59a98a8d23c99f85"},
"fast_yaml": {:hex, :fast_yaml, "1.0.37", "f71d472fbf787ccd161b914d1eb486116a0f4f2e835337a378fbd31b59d2e74b", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "8de868721bf7e2172414f7d3148ede0f3c922b496455cd625dd5c4429515a769"},
"file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"},
"file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"},
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
"jiffy": {:hex, :jiffy, "1.1.2", "a9b6c9a7ec268e7cf493d028f0a4c9144f59ccb878b1afe42841597800840a1b", [:rebar3], [], "hexpm", "bb61bc42a720bbd33cb09a410e48bb79a61012c74cb8b3e75f26d988485cf381"},
"jose": {:hex, :jose, "1.11.10", "a903f5227417bd2a08c8a00a0cbcc458118be84480955e8d251297a425723f83", [:mix, :rebar3], [], "hexpm", "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"},
"luerl": {:hex, :luerl, "1.2.0", "60f05f4240f0e7c148ddb79b67b8ff972734aad237aa74c83d0748b8214c8ef0", [:rebar3], [], "hexpm", "9cafd4f6094ff0f5a9d278fd81d60d3e026c820bdfb6cacd4b1bd909f21b525d"},
"makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"},
"makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"},
"makeup_erlang": {:hex, :makeup_erlang, "1.0.0", "6f0eff9c9c489f26b69b61440bf1b238d95badae49adac77973cbacae87e3c2e", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "ea7a9307de9d1548d2a72d299058d1fd2339e3d398560a0e46c27dab4891e4d2"},
"luerl": {:hex, :luerl, "1.2.3", "df25f41944e57a7c4d9ef09d238bc3e850276c46039cfc12b8bb42eccf36fcb1", [:rebar3], [], "hexpm", "1b4b9d0ca5d7d280d1d2787a6a5ee9f5a212641b62bff91556baa53805df3aed"},
"makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"},
"makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"},
"makeup_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"},
"mqtree": {:hex, :mqtree, "1.0.17", "82f54b8f2d22b4445db1d6cccb7fe9ead049d61410c29e32475f3ceb3ee62a89", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "5fe8b7cf8fbc4783d0fceb94654ac2bbf3242a58cd0397d249ded8ae021be2a3"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
"p1_acme": {:hex, :p1_acme, "1.0.23", "791aef0f79dc7f768b228808250c349fa9ce585cd8779da50ca93106eb3394d0", [:rebar3], [{:base64url, "~> 1.0", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "~> 6.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "~> 1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "~> 1.11.10", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "~> 1.0.15", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "8ce196f26e3d22ea10b7809122950465878c127f80767e325207aed7e8d0dd59"},
"p1_mysql": {:hex, :p1_mysql, "1.0.24", "0ed1e098c5a4525032448c65a2715f30980aae725615a4d255fd25f26bb22507", [:rebar3], [], "hexpm", "f058865f64257f507a2c6a5aff369b1375dbcb30b3d4258dad4f1b3eaffb655f"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
"p1_acme": {:hex, :p1_acme, "1.0.25", "db91f0d6c193cd1d5c0b0fa3939a898dbf56a6075db4347cde26e802715de50c", [:rebar3], [{:base64url, "~> 1.0", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "~> 6.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "~> 1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "~> 1.11.10", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "~> 1.0.17", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "a7b55b47495ddb4f98a15e65451ec3ad43f4637b955c74cd695d98e6a645d08c"},
"p1_mysql": {:hex, :p1_mysql, "1.0.26", "574d07c9936c53b1ec3556db3cf064cc14a6c39039835b3d940471bfa5ac8e2b", [:rebar3], [], "hexpm", "ea138083f2c54719b9cf549dbf5802a288b0019ea3e5449b354c74cc03fafdec"},
"p1_oauth2": {:hex, :p1_oauth2, "0.6.14", "1c5f82535574de87e2059695ac4b91f8f9aebacbc1c80287dae6f02552d47aea", [:rebar3], [], "hexpm", "1fd3ac474e43722d9d5a87c6df8d36f698ed87af7bb81cbbb66361451d99ae8f"},
"p1_pgsql": {:hex, :p1_pgsql, "1.1.26", "d3c3748c3638a1d7db5644e4fc63a6da7614b3009e172ef92a01d0217c3bec65", [:rebar3], [{:xmpp, "~> 1.8.0", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "85f230db530333106b8a1f9e5d5af032e6c3dd23b432e03d68e9d29013a6dcfc"},
"p1_pgsql": {:hex, :p1_pgsql, "1.1.32", "3f95d7e3413fc8f0be80abb4be1a0d7f67066a36905085cd5a423145598b0cb0", [:rebar3], [{:xmpp, "~> 1.10.0", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "268b01e8f4eb75c211a31495a25c2815c549aecce2f0df1a161c6e0a2cde061e"},
"p1_utils": {:hex, :p1_utils, "1.0.26", "67b0c4ac9fa3ba3ef563b31aa111b0a004439a37fac85e027f1c3617e1c7ec6c", [:rebar3], [], "hexpm", "d0379e8c1156b98bd64f8129c1de022fcca4f2fdb7486ce73bf0ed2c3376b04c"},
"pkix": {:hex, :pkix, "1.0.10", "d3bfadf7b7cfe2a3636f1b256c9cce5f646a07ce31e57ee527668502850765a0", [:rebar3], [], "hexpm", "e02164f83094cb124c41b1ab28988a615d54b9adc38575f00f19a597a3ac5d0e"},
"sqlite3": {:hex, :sqlite3, "1.1.15", "e819defd280145c328457d7af897d2e45e8e5270e18812ee30b607c99cdd21af", [:rebar3], [], "hexpm", "3c0ba4e13322c2ad49de4e2ddd28311366adde54beae8dba9d9e3888f69d2857"},
"stringprep": {:hex, :stringprep, "1.0.30", "46cf0ff631b3e7328f61f20b454d59428d87738f25d709798b5dcbb9b83c23f1", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "f6fc9b3384a03877830f89b2f38580caf3f4a27448a4a333d6a8c3975c220b9a"},
"stun": {:hex, :stun, "1.2.13", "c3e855f10f6b0c3ac150bce3d6c96c04a85207a3a5c7a7207876d8b36db2b0a4", [:rebar3], [{:fast_tls, "1.1.20", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "9cf4191491a60573ed6197e636530af1d25c9b064845aabed0c02f780d33ea3f"},
"stringprep": {:hex, :stringprep, "1.0.31", "fa1688c156dd271722aa18c423a4163e710d2f4f475ad0bc220910df669b53af", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "e9699c88e8db16b3a41f0e45ac6874a4da81a6e4854a77d76ede6d09b08e3530"},
"stun": {:hex, :stun, "1.2.17", "c54614a592812ea125a2e6827aac5a438571b591616426ec1419ba9b48252f54", [:rebar3], [{:fast_tls, "1.1.22", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "6b318244c21e8524a9aae3ac9a05cd8234ee994c1c2c815de68d306086ad768d"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
"xmpp": {:hex, :xmpp, "1.8.2", "7c26fae7ca83b307bab99624595dce706d427a17eed9c6305980550f8120a3a3", [:rebar3], [{:ezlib, "~> 1.0.12", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "~> 1.1.19", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "~> 1.1.51", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "~> 6.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "~> 1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "~> 1.0.29", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "53a9f85ad44103a358dc173225bc96d08076d4e78506f87d838337b2fa3b381f"},
"yconf": {:hex, :yconf, "1.0.16", "d59521d66ff89f219411b6e9277cd6feec7cc6fce11554e67de02a8d0a470479", [:rebar3], [{:fast_yaml, "1.0.37", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "e947813273f38711c7b2e5a8e4acc9a51c7bbe854f744a345f60300b38586c89"},
"xmpp": {:hex, :xmpp, "1.10.0", "68a6dff8db8987c4592b2d5dd71d3f947b4ebd15209c9acaca5909a642670630", [:rebar3], [{:ezlib, "~> 1.0.12", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "~> 1.1.19", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "~> 1.1.51", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "~> 6.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "~> 1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "~> 1.0.29", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "ceeae43b8fe97649d8f8546b3f7f2b38ecfc931c0cdd5c7445ffb3f80fcb7d85"},
"yconf": {:hex, :yconf, "1.0.18", "e565edc8aabb8164c3bebc86969095d296ad315dcbb46af65dccbc6c71eae0f6", [:rebar3], [{:fast_yaml, "1.0.37", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "fa950ec6503f92d6417fb8cc1d982403f041697e8e1bbf4d4588fb919b9562ea"},
}
+28 -2
View File
@@ -111,6 +111,11 @@
{"Dynamically specify a replyto of the item publisher","Динамично задаване на отговор към публикувалия елемента"}.
{"Edit Properties","Редактиране на свойства"}.
{"Either approve or decline the voice request.","Одобрете или отхвърлете заявката за гласова връзка."}.
{"ejabberd HTTP Upload service","ejabberd HTTP Upload услуга"}.
{"ejabberd MUC module","ejabberd MUC модул"}.
{"ejabberd Multicast service","ejabberd Multicast услуга"}.
{"ejabberd Publish-Subscribe module","ejabberd Publish-Subscribe модул"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams модул"}.
{"ejabberd vCard module","ejabberd vCard модул"}.
{"ejabberd Web Admin","Уеб администрация на ejabberd"}.
{"ejabberd","ejabberd"}.
@@ -156,8 +161,14 @@
{"Get Pending","Виж чакащи"}.
{"Get User Last Login Time","Покажи времето, когато потребителят е влязъл за последно"}.
{"Get User Statistics","Покажи статистика за потребителя"}.
{"Given Name","Име"}.
{"Given Name","Наименование"}.
{"Grant voice to this person?","Предоставяне на глас за потребителя?"}.
{"has been banned","е със забранен достъп"}.
{"has been kicked because of a system shutdown","е отстранен поради изключване на системата"}.
{"has been kicked because of an affiliation change","е отстранен поради промяна на принадлежността"}.
{"has been kicked because the room has been changed to members-only","е изгонен, защото стаята е променена и е само за членове"}.
{"has been kicked","е отстранен"}.
{"Hash of the vCard-temp avatar of this room","Хеш на временния vCard аватар на тази стая"}.
{"Hat title","Заглавие на шапката"}.
{"Hat URI","URI адрес за шапка"}.
{"Hats limit exceeded","Превишен е лимитът за шапка"}.
@@ -190,6 +201,7 @@
{"Invalid 'previd' value","Невалидна стойност на 'previd'"}.
{"Invitations are not allowed in this conference","Поканите не са разрешени в тази конференция"}.
{"IP addresses","IP адреси"}.
{"is now known as","е известен като"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Не е позволено да изпращате съобщения за грешки в стаята. Участникът (~s) е изпратил съобщение за грешка (~s) и е бил отстранен от стаята"}.
{"It is not allowed to send private messages of type \"groupchat\"","Изпращането на лични съобщения от тип \"групов чат\" не е разрешено"}.
{"It is not allowed to send private messages to the conference","Изпращането на лични съобщения до конференцията не е разрешено"}.
@@ -199,6 +211,7 @@
{"JID normalization failed","Нормализирането на JID е неуспешно"}.
{"Joined MIX channels of ~ts","Свързани MIX канали на ~ts"}.
{"Joined MIX channels:","Свързани MIX канали:"}.
{"joins the room","се присъединява към стаята"}.
{"July","Юли"}.
{"June","Юни"}.
{"Just created","Току що създаден"}.
@@ -208,8 +221,10 @@
{"Last month","Миналия месец"}.
{"Last year","Миналата година"}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Най-малко значимите битове SHA-256 хеш на текст трябва да са равни на шестнайсетичния етикет"}.
{"leaves the room","напуска стаята"}.
{"List of users with hats","Списък на потребителите с шапки"}.
{"List users with hats","Избройте потребителите с шапки"}.
{"Logged Out","Излязъл"}.
{"Logging","Регистриране на събития"}.
{"Make participants list public","Направи списъка с участниците публичен"}.
{"Make room CAPTCHA protected","Защити стаята с CAPTCHA"}.
@@ -360,6 +375,7 @@
{"Previous session PID has exited","Предишният PID на сесията е излязъл"}.
{"Previous session PID is dead","PID от предишната сесия не съществува"}.
{"Previous session timed out","Времето на предишната сесия изтече"}.
{"private, ","частна, "}.
{"Public","Публичен"}.
{"Publish model","Модел за публикуване"}.
{"Publish-Subscribe","Публикуване-Абониране"}.
@@ -423,6 +439,7 @@
{"Set message of the day on all hosts and send to online users","Задавай съобщение на деня на всички хостове и изпрати на онлайн потребителите"}.
{"Shared Roster Groups","Споделени групи от списъци с контакти"}.
{"Show Integral Table","Покажи интегрална таблица"}.
{"Show Occupants Join/Leave","Покажи участници Влязъл/Напускнал"}.
{"Show Ordinary Table","Покажи обикновена таблица"}.
{"Shut Down Service","Изключи услугата"}.
{"SOCKS5 Bytestreams","SOCKS5 байтови потоци"}.
@@ -482,6 +499,7 @@
{"The number of unread or undelivered messages","Броят непрочетени или недоставени съобщения"}.
{"The password contains unacceptable characters","Паролата съдържа недопустими символи"}.
{"The password is too weak","Паролата е твърде слаба"}.
{"the password is","паролата е"}.
{"The password of your XMPP account was successfully changed.","Паролата на вашия XMPP профил беше успешно променена."}.
{"The password was not changed","Паролата не е променена"}.
{"The passwords are different","Паролите са различни"}.
@@ -494,7 +512,7 @@
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Строфата ТРЯБВА да съдържа само един <active/> елемент, един <default/> елемент или един <list/> елемент"}.
{"The subscription identifier associated with the subscription request","Идентификаторът на абонамента, свързан със заявката за абонамент"}.
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","URL адрес на XSL трансформацията, която може да се приложи към прикачените данни, за да се генерира подходящ елемент от тялото на съобщението."}.
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","URL адрес на XSL трансформацията, която може да се приложи към формата на прикачените данни, за да се генерира валиден резултат от Data Forms, който клиентът може да покаже с помощта на общ механизъм за визуализация на Data Forms."}.
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","URL адрес на XSL трансформацията, която може да се приложи към формата на прикачените данни, за да се генерира валиден резултат от Data Forms, който клиентът може да покаже с помощта на общ механизъм за визуализация на Data Forms"}.
{"There was an error changing the password: ","Възникна грешка при промяна на паролата: "}.
{"There was an error creating the account: ","Възникна грешка при създаването на профила: "}.
{"There was an error deleting the account: ","Възникна грешка при изтриването на профила: "}.
@@ -519,6 +537,7 @@
{"Too many unacked stanzas","Твърде много непотвърдени строфи"}.
{"Too many users in this conference","Твърде много потребители в тази конференция"}.
{"Traffic rate limit is exceeded","Лимитът за трафик е надвишен"}.
{"~ts's MAM Archive","~ts's MAM архив"}.
{"~ts's Offline Messages Queue","Офлайн съобщения на ~ts"}.
{"Tuesday","Вторник"}.
{"Unable to generate a CAPTCHA","Не може да се генерира CAPTCHA"}.
@@ -535,12 +554,14 @@
{"Update message of the day on all hosts (don't send)","Актуализирай съобщението на деня на всички хостове (не изпращай)"}.
{"Update specs to get modules source, then install desired ones.","Актуализирайте спецификациите, за да получите източник на модули, след което инсталирайте желаните."}.
{"Update Specs","Актуализирай спецификациите"}.
{"Updating the vCard is not supported by the vCard storage backend","Актуализирането на vCard не се поддържа от настройката за съхранение на vCard"}.
{"Upgrade","Обнови"}.
{"URL for Archived Discussion Logs","URL адрес за дневници на архивирани дискусии"}.
{"User already exists","Потребителят вече съществува"}.
{"User (jid)","Потребител (jid)"}.
{"User JID","Потребител JID"}.
{"User Management","Управление на потребители"}.
{"User not allowed to perform an IQ set on another user's vCard.","Потребителят не може да извършва IQ настрийка на vCard на друг потребител."}.
{"User removed","Потребителят е премахнат"}.
{"User session not found","Потребителската сесия не е намерена"}.
{"User session terminated","Потребителската сесия е прекратена"}.
@@ -555,6 +576,7 @@
{"Value of '~s' should be datetime string","Стойността на '~s' трябва да бъде низ за дата и час"}.
{"Value of '~s' should be integer","Стойността на '~s' трябва да бъде цяло число"}.
{"Value 'set' of 'type' attribute is not allowed","Стойността 'set' на атрибут 'type' не е разрешена"}.
{"vCard User Search","vCard търсене на потребител"}.
{"View joined MIX channels","Вижте присъединените MIX канали"}.
{"Virtual Hosts","Виртуални хостове"}.
{"Visitors are not allowed to change their nicknames in this room","Посетителите нямат право да променят псевдонимите си в тази стая"}.
@@ -584,6 +606,7 @@
{"XMPP Show Value of Chat","XMPP покажи стойност на Чат"}.
{"XMPP Show Value of DND (Do Not Disturb)","XMPP покажи стойност на DND (Не ме безпокой)"}.
{"XMPP Show Value of XA (Extended Away)","XMPP покажи стойност на Продължително отсъствие"}.
{"XMPP URI of Associated Publish-Subscribe Node","XMPP URI на асоцииран Publish-Subscribe нод"}.
{"You are being removed from the room because of a system shutdown","Премахнати сте от стаята поради изключване на системата"}.
{"You are not allowed to send private messages","Нямате право да изпращате лични съобщения"}.
{"You are not joined to the channel","Не сте присъединени към канала"}.
@@ -594,6 +617,9 @@
{"You need a client that supports x:data and CAPTCHA to register","За да се регистрирате Ви е нужен клиент, който поддържа x:data и CAPTCHA"}.
{"You need a client that supports x:data to register the nickname","За да регистрирате псевдонима, Ви е необходим клиент, който поддържа x:data"}.
{"You need an x:data capable client to search","За да търсите, Ви е нужен клиент, който поддържа x:data"}.
{"Your active privacy list has denied the routing of this stanza.","Вашият активен списък за поверителност отказа маршрутизирането на тази строфа."}.
{"Your contact offline message queue is full. The message has been discarded.","Достигнат е максималният брой офлайн съобщения за вашия контакт. Съобщението е отхвърлено."}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Вашата заявка за абонамент и/или съобщения до ~s са блокирани. За да отблокирате заявката си за абонамент, посетете ~s"}.
{"Your XMPP account was successfully registered.","Вашият XMPP акаунт, беше регистриран успешно."}.
{"Your XMPP account was successfully unregistered.","Вашият XMPP акаунт, беше успешно дерегистриран."}.
{"You're not allowed to create nodes","Нямате право да създавате нодове"}.
+13 -2
View File
@@ -22,7 +22,7 @@
{"Administrator privileges required","Es necessita tenir privilegis d'administrador"}.
{"All activity","Tota l'activitat"}.
{"All Users","Tots els usuaris"}.
{"Allow subscription","Permetre subscripcions"}.
{"Allow subscription","Permetre subscripció"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Permetre que aquesta Jabber ID es puga subscriure a aquest node pubsub?"}.
{"Allow this person to register with the room?","Permetre a esta persona registrar-se a la sala?"}.
{"Allow users to change the subject","Permetre que els usuaris canviïn el tema"}.
@@ -46,7 +46,9 @@
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Qualsevol amb una subscripció de presencia de 'both' o 'from' pot subscriure's i publicar elements"}.
{"Anyone with Voice","Qualsevol amb Veu"}.
{"Anyone","Qualsevol"}.
{"API Commands","Comandaments API"}.
{"April","Abril"}.
{"Arguments","Arguments"}.
{"Attribute 'channel' is required for this request","L'atribut 'channel' és necessari per a aquesta petició"}.
{"Attribute 'id' is mandatory for MIX messages","L'atribut 'id' es necessari per a missatges MIX"}.
{"Attribute 'jid' is not allowed here","L'atribut 'jid' no està permès ací"}.
@@ -86,6 +88,7 @@
{"Choose whether to approve this entity's subscription.","Tria si aproves aquesta entitat de subscripció."}.
{"City","Ciutat"}.
{"Client acknowledged more stanzas than sent by server","El client ha reconegut més paquets dels que ha enviat el servidor"}.
{"Clustering","Clustering"}.
{"Commands","Comandaments"}.
{"Conference room does not exist","La sala de conferències no existeix"}.
{"Configuration of room ~s","Configuració de la sala ~s"}.
@@ -168,6 +171,7 @@
{"has been kicked because of an affiliation change","ha sigut expulsat a causa d'un canvi d'afiliació"}.
{"has been kicked because the room has been changed to members-only","ha sigut expulsat perquè la sala ara és només per a membres"}.
{"has been kicked","ha sigut expulsat"}.
{"Hash of the vCard-temp avatar of this room","Hash del avatar a vCard-temp d'esta sala"}.
{"Hat title","Títol del barret"}.
{"Hat URI","URI del barret"}.
{"Hats limit exceeded","El límit de tràfic ha sigut sobrepassat"}.
@@ -223,6 +227,7 @@
{"leaves the room","surt de la sala"}.
{"List of users with hats","Llista d'usuaris amb barrets"}.
{"List users with hats","Llista d'usuaris amb barrets"}.
{"Logged Out","Desconectat"}.
{"Logging","Registre"}.
{"Make participants list public","Crear una llista de participants pública"}.
{"Make room CAPTCHA protected","Crear una sala protegida per CAPTCHA"}.
@@ -406,6 +411,7 @@
{"Restore binary backup immediately:","Restaurar una còpia de seguretat binària ara mateix:"}.
{"Restore plain text backup immediately:","Restaurar una còpia de seguretat en format de text pla ara mateix:"}.
{"Restore","Restaurar"}.
{"Result","Resultat"}.
{"Roles and Affiliations that May Retrieve Member List","Rols i Afiliacions que poden recuperar la llista de membres"}.
{"Roles for which Presence is Broadcasted","Rols per als que sí se difon la seua presencia"}.
{"Roles that May Send Private Messages","Rols que poden enviar missatges privats"}.
@@ -437,6 +443,7 @@
{"Set message of the day on all hosts and send to online users","Escriure missatge del dia en tots els hosts i enviar-ho als usuaris connectats"}.
{"Shared Roster Groups","Grups de contactes compartits"}.
{"Show Integral Table","Mostrar Taula Integral"}.
{"Show Occupants Join/Leave","Mostrar Entrades/Eixides dels Ocupants"}.
{"Show Ordinary Table","Mostrar Taula Ordinaria"}.
{"Shut Down Service","Apager el Servei"}.
{"SOCKS5 Bytestreams","SOCKS5 Bytestreams"}.
@@ -534,6 +541,7 @@
{"Too many unacked stanzas","Massa missatges sense haver reconegut la seva recepció"}.
{"Too many users in this conference","N'hi ha massa usuaris en esta sala de conferència"}.
{"Traffic rate limit is exceeded","El límit de tràfic ha sigut sobrepassat"}.
{"~ts's MAM Archive","Arxiu MAM de ~ts"}.
{"~ts's Offline Messages Queue","~ts's cua de missatges offline"}.
{"Tuesday","Dimarts"}.
{"Unable to generate a CAPTCHA","No s'ha pogut generar un CAPTCHA"}.
@@ -550,12 +558,14 @@
{"Update message of the day on all hosts (don't send)","Actualitza el missatge del dia en tots els hosts (no enviar)"}.
{"Update specs to get modules source, then install desired ones.","Actualitza les especificacions per obtindre el codi font dels mòduls, després instal·la els que vulgues."}.
{"Update Specs","Actualitzar Especificacions"}.
{"Updating the vCard is not supported by the vCard storage backend","El sistema d'almacenament de vCard no te capacitat per a actualitzar la vCard"}.
{"Upgrade","Actualitza"}.
{"URL for Archived Discussion Logs","URL dels Arxius de Discussions"}.
{"User already exists","El usuari ja existeix"}.
{"User JID","JID del usuari"}.
{"User (jid)","Usuari (jid)"}.
{"User Management","Gestió d'Usuaris"}.
{"User not allowed to perform an IQ set on another user's vCard.","L'usuari no te permis per a modificar la vCard d'altre usuari."}.
{"User removed","Usuari borrat"}.
{"User session not found","Sessió d'usuari no trobada"}.
{"User session terminated","Sessió d'usuari terminada"}.
@@ -578,6 +588,7 @@
{"Visitor","Visitant"}.
{"Voice request","Petició de veu"}.
{"Voice requests are disabled in this conference","Les peticions de veu es troben desactivades en aquesta conferència"}.
{"Web client which allows to join the room anonymously","Client web que permet entrar a la sala anonimament"}.
{"Wednesday","Dimecres"}.
{"When a new subscription is processed and whenever a subscriber comes online","Quan es processa una nova subscripció i un subscriptor es connecta"}.
{"When a new subscription is processed","Quan es processa una nova subscripció"}.
@@ -587,7 +598,7 @@
{"Whether an entity wants to receive or disable notifications","Si una entitat vol rebre notificacions o no"}.
{"Whether owners or publisher should receive replies to items","Si el propietaris o publicadors deurien de rebre respostes als elements"}.
{"Whether the node is a leaf (default) or a collection","Si el node es fulla (per defecte) o es una col·lecció"}.
{"Whether to allow subscriptions","Permetre subscripcions"}.
{"Whether to allow subscriptions","Si s'hauria de permetre subscripcions"}.
{"Whether to make all subscriptions temporary, based on subscriber presence","Si fer totes les subscripcions temporals, basat en la presencia del subscriptor"}.
{"Whether to notify owners about new subscribers and unsubscribes","Si notificar als propietaris sobre noves subscripcions i desubscripcions"}.
{"Who can send private messages","Qui pot enviar missatges privats"}.
+9
View File
@@ -46,7 +46,9 @@
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Jeder mit einem Präsenzabonnement von beiden oder davon darf Items abonnieren oder abrufen"}.
{"Anyone with Voice","Jeder mit Stimme"}.
{"Anyone","Jeder"}.
{"API Commands","API Befehle"}.
{"April","April"}.
{"Arguments","Argumente"}.
{"Attribute 'channel' is required for this request","Attribut 'channel' ist für diese Anforderung erforderlich"}.
{"Attribute 'id' is mandatory for MIX messages","Attribut 'id' ist verpflichtend für MIX-Nachrichten"}.
{"Attribute 'jid' is not allowed here","Attribut 'jid' ist hier nicht erlaubt"}.
@@ -168,6 +170,7 @@
{"has been kicked because of an affiliation change","wurde wegen einer Änderung der Zugehörigkeit hinausgeworfen"}.
{"has been kicked because the room has been changed to members-only","wurde hinausgeworfen weil der Raum zu Nur-Mitglieder geändert wurde"}.
{"has been kicked","wurde hinausgeworfen"}.
{"Hash of the vCard-temp avatar of this room","Hash des vCard-temp Avatars dieses Raums"}.
{"Hat title","Funktionstitel"}.
{"Hat URI","Funktions-URI"}.
{"Hats limit exceeded","Funktionslimit wurde überschritten"}.
@@ -223,6 +226,7 @@
{"leaves the room","verlässt den Raum"}.
{"List of users with hats","Liste der Benutzer mit Funktionen"}.
{"List users with hats","Benutzer mit Funktionen auflisten"}.
{"Logged Out","Abgemeldet"}.
{"Logging","Protokollierung"}.
{"Make participants list public","Teilnehmerliste öffentlich machen"}.
{"Make room CAPTCHA protected","Raum mittels CAPTCHA schützen"}.
@@ -405,6 +409,7 @@
{"Restore binary backup immediately:","Stelle binäres Backup sofort wieder her:"}.
{"Restore plain text backup immediately:","Stelle Klartext-Backup sofort wieder her:"}.
{"Restore","Wiederherstellung"}.
{"Result","Ergebnis"}.
{"Roles and Affiliations that May Retrieve Member List","Rollen und Zugehörigkeiten die Mitgliederliste abrufen dürfen"}.
{"Roles for which Presence is Broadcasted","Rollen für welche die Präsenz übertragen wird"}.
{"Roles that May Send Private Messages","Rollen die Privatnachrichten senden dürfen"}.
@@ -532,6 +537,7 @@
{"Too many unacked stanzas","Zu viele unbestätigte Stanzas"}.
{"Too many users in this conference","Zu viele Benutzer in dieser Konferenz"}.
{"Traffic rate limit is exceeded","Datenratenlimit wurde überschritten"}.
{"~ts's MAM Archive","~ts's MAM Archiv"}.
{"~ts's Offline Messages Queue","Offline-Nachrichten-Warteschlange von ~ts"}.
{"Tuesday","Dienstag"}.
{"Unable to generate a CAPTCHA","Konnte kein CAPTCHA erstellen"}.
@@ -548,6 +554,7 @@
{"Update message of the day on all hosts (don't send)","Aktualisiere Nachricht des Tages auf allen Hosts (nicht senden)"}.
{"Update specs to get modules source, then install desired ones.","Aktualisieren Sie die Spezifikationen, um den Quellcode der Module zu erhalten und installieren Sie dann die gewünschten Module."}.
{"Update Specs","Spezifikationen aktualisieren"}.
{"Updating the vCard is not supported by the vCard storage backend","Aktualisierung der vCard wird vom vCard-Speicher-Backend nicht unterstützt"}.
{"Upgrade","Upgrade"}.
{"URL for Archived Discussion Logs","URL für archivierte Diskussionsprotokolle"}.
{"User already exists","Benutzer existiert bereits"}.
@@ -576,6 +583,7 @@
{"Visitors are not allowed to send messages to all occupants","Besucher dürfen nicht an alle Teilnehmer Nachrichten versenden"}.
{"Voice requests are disabled in this conference","Sprachrecht-Anforderungen sind in diesem Raum deaktiviert"}.
{"Voice request","Sprachrecht-Anforderung"}.
{"Web client which allows to join the room anonymously","Web-Client, der es ermöglicht, dem Raum anonym beizutreten"}.
{"Wednesday","Mittwoch"}.
{"When a new subscription is processed and whenever a subscriber comes online","Sobald ein neues Abonnement verarbeitet wird und wann immer ein Abonnent sich anmeldet"}.
{"When a new subscription is processed","Sobald ein neues Abonnement verarbeitet wird"}.
@@ -588,6 +596,7 @@
{"Whether to allow subscriptions","Ob Abonnements erlaubt sind"}.
{"Whether to make all subscriptions temporary, based on subscriber presence","Ob alle Abonnements temporär gemacht werden sollen, basierend auf der Abonnentenpräsenz"}.
{"Whether to notify owners about new subscribers and unsubscribes","Ob Besitzer über neue Abonnenten und Abbestellungen benachrichtigt werden sollen"}.
{"Who can send private messages","Wer kann private Nachrichten senden"}.
{"Who may associate leaf nodes with a collection","Wer Blattknoten mit einer Sammlung verknüpfen darf"}.
{"Wrong parameters in the web formulary","Falsche Parameter im Webformular"}.
{"Wrong xmlns","Falscher xmlns"}.
+12 -1
View File
@@ -46,7 +46,9 @@
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Cualquiera con una suscripción a la presencia de 'ambos' o 'de' puede suscribirse y recibir elementos"}.
{"Anyone with Voice","Cualquiera con Voz"}.
{"Anyone","Cualquiera"}.
{"API Commands","Comandos API"}.
{"April","Abril"}.
{"Arguments","Argumentos"}.
{"Attribute 'channel' is required for this request","El atributo 'channel' es necesario para esta petición"}.
{"Attribute 'id' is mandatory for MIX messages","El atributo 'id' es necesario para mensajes MIX"}.
{"Attribute 'jid' is not allowed here","El atributo 'jid' no está permitido aqui"}.
@@ -86,6 +88,7 @@
{"Choose whether to approve this entity's subscription.","Decidir si aprobar la subscripción de esta entidad."}.
{"City","Ciudad"}.
{"Client acknowledged more stanzas than sent by server","El cliente ha reconocido más paquetes de los que el servidor ha enviado"}.
{"Clustering","Clustering"}.
{"Commands","Comandos"}.
{"Conference room does not exist","La sala de conferencias no existe"}.
{"Configuration of room ~s","Configuración para la sala ~s"}.
@@ -161,13 +164,14 @@
{"Get Pending","Obtener pendientes"}.
{"Get User Last Login Time","Ver fecha de la última conexión de usuario"}.
{"Get User Statistics","Ver estadísticas de usuario"}.
{"Given Name","Nombre"}.
{"Given Name","Nombre de pila"}.
{"Grant voice to this person?","¿Conceder voz a esta persona?"}.
{"has been banned","ha sido bloqueado"}.
{"has been kicked because of a system shutdown","ha sido expulsado porque el sistema se va a detener"}.
{"has been kicked because of an affiliation change","ha sido expulsado por un cambio de su afiliación"}.
{"has been kicked because the room has been changed to members-only","ha sido expulsado porque la sala es ahora solo para miembros"}.
{"has been kicked","ha sido expulsado"}.
{"Hash of the vCard-temp avatar of this room","Hash del avatar vCard-temp de esta sala"}.
{"Hat title","Título del sombrero"}.
{"Hat URI","Dirección del sombrero"}.
{"Hats limit exceeded","Se ha excedido el límite de sombreros"}.
@@ -223,6 +227,7 @@
{"leaves the room","sale de la sala"}.
{"List of users with hats","Lista de usuarios con sombreros"}.
{"List users with hats","Listar usuarios con sombreros"}.
{"Logged Out","Desconectad@"}.
{"Logging","Histórico de mensajes"}.
{"Make participants list public","La lista de participantes es pública"}.
{"Make room CAPTCHA protected","Proteger la sala con CAPTCHA"}.
@@ -406,6 +411,7 @@
{"Restore binary backup immediately:","Restaurar inmediatamente copia de seguridad binaria:"}.
{"Restore plain text backup immediately:","Restaurar copias de seguridad de texto plano inmediatamente:"}.
{"Restore","Restaurar"}.
{"Result","Resultado"}.
{"Roles and Affiliations that May Retrieve Member List","Roles y Afiliaciones que pueden obtener la lista de miembros"}.
{"Roles for which Presence is Broadcasted","Roles para los que sí se difunde su Presencia"}.
{"Roles that May Send Private Messages","Roles que pueden enviar mensajes privados"}.
@@ -437,6 +443,7 @@
{"Set message of the day on all hosts and send to online users","Poner mensaje del día en todos los dominios y enviar a los usuarios conectados"}.
{"Shared Roster Groups","Grupos Compartidos"}.
{"Show Integral Table","Mostrar Tabla Integral"}.
{"Show Occupants Join/Leave","Mostrar personas activas Entrar/Salir"}.
{"Show Ordinary Table","Mostrar Tabla Ordinaria"}.
{"Shut Down Service","Detener el servicio"}.
{"SOCKS5 Bytestreams","SOCKS5 Bytestreams"}.
@@ -534,6 +541,7 @@
{"Too many unacked stanzas","Demasiados mensajes sin haber reconocido recibirlos"}.
{"Too many users in this conference","Demasiados usuarios en esta sala"}.
{"Traffic rate limit is exceeded","Se ha excedido el límite de tráfico"}.
{"~ts's MAM Archive","Archivo MAM de ~ts"}.
{"~ts's Offline Messages Queue","Cola de mensajes diferidos de ~ts"}.
{"Tuesday","Martes"}.
{"Unable to generate a CAPTCHA","No se pudo generar un CAPTCHA"}.
@@ -550,12 +558,14 @@
{"Update message of the day on all hosts (don't send)","Actualizar el mensaje del día en todos los dominos (pero no enviarlo)"}.
{"Update specs to get modules source, then install desired ones.","Actualizar Especificaciones para conseguir el código fuente de los módulos, luego instala los que quieras."}.
{"Update Specs","Actualizar Especificaciones"}.
{"Updating the vCard is not supported by the vCard storage backend","La actualización de la vCard no es compatible con el vCard almacenamiento backend"}.
{"Upgrade","Actualizar"}.
{"URL for Archived Discussion Logs","URL del registro de discusiones archivadas"}.
{"User already exists","El usuario ya existe"}.
{"User JID","Jabber ID del usuario"}.
{"User (jid)","Usuario (jid)"}.
{"User Management","Administración de usuarios"}.
{"User not allowed to perform an IQ set on another user's vCard.","No se permite al usuario realizar un IQ establecido en la vCard de otro usuario."}.
{"User removed","Usuario eliminado"}.
{"User session not found","Sesión de usuario no encontrada"}.
{"User session terminated","Sesión de usuario terminada"}.
@@ -578,6 +588,7 @@
{"Visitor","Visitante"}.
{"Voice request","Petición de voz"}.
{"Voice requests are disabled in this conference","Las peticiones de voz están desactivadas en esta sala"}.
{"Web client which allows to join the room anonymously","Cliente web que permite entrar en la sala anonimamente"}.
{"Wednesday","Miércoles"}.
{"When a new subscription is processed and whenever a subscriber comes online","Cuando se procesa una nueva suscripción y cuando un suscriptor se conecta"}.
{"When a new subscription is processed","Cuando se procesa una nueva suscripción"}.
+3
View File
@@ -184,6 +184,7 @@
{"Incorrect value of 'action' attribute","Valeur de l'attribut 'action' incorrecte"}.
{"Incorrect value of 'action' in data form","Valeur de l'attribut 'action' incorrecte dans le formulaire"}.
{"Incorrect value of 'path' in data form","Valeur de l'attribut 'path' incorrecte dans le formulaire"}.
{"Install","Installer"}.
{"Insufficient privilege","Droits insuffisants"}.
{"Internal server error","Erreur interne du serveur"}.
{"Invalid 'from' attribute in forwarded message","L'attribut 'from' du message transféré est incorrect"}.
@@ -480,12 +481,14 @@
{"Unauthorized","Non autorisé"}.
{"Unexpected action","Action inattendu"}.
{"Unexpected error condition: ~p","Condition derreur inattendue : ~p"}.
{"Uninstall","Désinstaller"}.
{"Unregister an XMPP account","Annuler lenregistrement dun compte XMPP"}.
{"Unregister","Désinscrire"}.
{"Unsupported <index/> element","Elément <index/> non supporté"}.
{"Unsupported version","Version non prise en charge"}.
{"Update message of the day (don't send)","Mise à jour du message du jour (pas d'envoi)"}.
{"Update message of the day on all hosts (don't send)","Mettre à jour le message du jour sur tous les domaines (ne pas envoyer)"}.
{"Upgrade","Mise à niveau"}.
{"URL for Archived Discussion Logs","URL des journaux de discussion archivés"}.
{"User already exists","L'utilisateur existe déjà"}.
{"User JID","JID de l'utilisateur"}.
+11 -4
View File
@@ -9,19 +9,19 @@
{"A description of the node","Una descrizione del nodo"}.
{"A friendly name for the node","Un nome comodo per il nodo"}.
{"A password is required to enter this room","Per entrare in questa stanza è necessaria una password"}.
{"A Web Page","Un Pagina Web"}.
{"A Web Page","Una pagina web"}.
{"Accept","Accettare"}.
{"Access denied by service policy","Accesso impedito dalle politiche del servizio"}.
{"Access denied by service policy","Accesso negato dalle politiche del servizio"}.
{"Access model","Modello di accesso"}.
{"Account doesn't exist","L'account non esiste"}.
{"Action on user","Azione sull'utente"}.
{"Add a hat to a user","Aggiungere un cappello a un utente"}.
{"Add User","Aggiungere un Utente"}.
{"Add User","Aggiungere un utente"}.
{"Administration of ","Amministrazione di "}.
{"Administration","Amministrazione"}.
{"Administrator privileges required","Sono richiesti privilegi di amministratore"}.
{"All activity","Tutta l'attività"}.
{"All Users","Tutti gli Utenti"}.
{"All Users","Tutti gli utenti"}.
{"Allow subscription","Consenti iscrizione"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Consentire a questo ID Jabber di iscriversi a questo nodo pubsub?"}.
{"Allow this person to register with the room?","Permettere a questa persona di registrarsi con la stanza?"}.
@@ -168,6 +168,7 @@
{"has been kicked because of an affiliation change","è stato espulso a causa di un cambiamento di appartenenza"}.
{"has been kicked because the room has been changed to members-only","è stato espulso per la limitazione della stanza ai soli membri"}.
{"has been kicked","è stata/o espulsa/o"}.
{"Hash of the vCard-temp avatar of this room","Hash dell'avatar vCard-temp di questa stanza"}.
{"Hat title","Titolo del Cappello"}.
{"Hat URI","URI Cappello"}.
{"Hats limit exceeded","Limite di cappelli superato"}.
@@ -223,6 +224,7 @@
{"leaves the room","esce dalla stanza"}.
{"List of users with hats","Elenco degli utenti con cappelli"}.
{"List users with hats","Elenca gli utenti con cappelli"}.
{"Logged Out","Disconnesso"}.
{"Logging","Registrazione"}.
{"Make participants list public","Rendere pubblica la lista dei partecipanti"}.
{"Make room CAPTCHA protected","Rendere la stanza protetta da CAPTCHA"}.
@@ -437,6 +439,7 @@
{"Set message of the day on all hosts and send to online users","Impostare il messaggio del giorno (MOTD) su tutti gli host e inviarlo agli utenti online"}.
{"Shared Roster Groups","Gruppi di liste di contatti comuni"}.
{"Show Integral Table","Mostrare la tabella integrale"}.
{"Show Occupants Join/Leave","Mostra gli occupanti che si uniscono/escono"}.
{"Show Ordinary Table","Mostrare la tabella normale"}.
{"Shut Down Service","Terminare il servizio"}.
{"SOCKS5 Bytestreams","SOCKS5 flussi di byte"}.
@@ -531,8 +534,10 @@
{"Too many <list/> elements","Troppi elementi <list/>"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Troppe (~p) autenticazioni non riuscite da questo indirizzo IP (~s). L'indirizzo verrà sbloccato alle ~s UTC"}.
{"Too many receiver fields were specified","Sono stati specificati troppi campi del ricevitore"}.
{"Too many unacked stanzas","Troppe stanze non riconosciute"}.
{"Too many users in this conference","Troppi utenti in questa conferenza"}.
{"Traffic rate limit is exceeded","Limite di traffico superato"}.
{"~ts's MAM Archive","Archivio MAM di ~ts"}.
{"~ts's Offline Messages Queue","La Coda dei Messaggi Offline di ~ts"}.
{"Tuesday","Martedì"}.
{"Unable to generate a CAPTCHA","Impossibile generare un CAPTCHA"}.
@@ -549,12 +554,14 @@
{"Update message of the day on all hosts (don't send)","Aggiornare il messaggio del giorno (MOTD) su tutti gli host (non inviarlo)"}.
{"Update specs to get modules source, then install desired ones.","Aggiorna le specifiche per ottenere il sorgente dei moduli, quindi installa quelli desiderati."}.
{"Update Specs","Aggiorna Specifiche"}.
{"Updating the vCard is not supported by the vCard storage backend","L'aggiornamento della vCard non è supportato dal backend di archiviazione vCard"}.
{"Upgrade","Aggiornamento"}.
{"URL for Archived Discussion Logs","URL per i Registri delle Discussioni Archiviati"}.
{"User already exists","L'utente esiste già"}.
{"User JID","JID utente"}.
{"User (jid)","Utente (jid)"}.
{"User Management","Gestione degli utenti"}.
{"User not allowed to perform an IQ set on another user's vCard.","L'utente non è autorizzato a eseguire un set IQ sulla vCard di un altro utente."}.
{"User removed","Utente rimosso"}.
{"User session not found","Sessione utente non trovata"}.
{"User session terminated","Sessione utente terminata"}.
+11
View File
@@ -46,7 +46,9 @@
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Qualquer pessoa com uma assinatura presente dos dois ou de ambos pode se inscrever e recuperar os itens"}.
{"Anyone with Voice","Qualquer pessoa com voz"}.
{"Anyone","Qualquer pessoa"}.
{"API Commands","Comandos API"}.
{"April","Abril"}.
{"Arguments","Argumentos"}.
{"Attribute 'channel' is required for this request","O atributo 'canal' é necessário para esta solicitação"}.
{"Attribute 'id' is mandatory for MIX messages","O atributo 'id' é obrigatório para mensagens MIX"}.
{"Attribute 'jid' is not allowed here","O atributo 'jid' não é permitido aqui"}.
@@ -86,6 +88,7 @@
{"Choose whether to approve this entity's subscription.","Aprovar esta assinatura."}.
{"City","Cidade"}.
{"Client acknowledged more stanzas than sent by server","O cliente reconheceu mais estrofes do que as enviadas pelo servidor"}.
{"Clustering","Agrupamento"}.
{"Commands","Comandos"}.
{"Conference room does not exist","A sala de conferência não existe"}.
{"Configuration of room ~s","Configuração para ~s"}.
@@ -168,6 +171,7 @@
{"has been kicked because of an affiliation change","foi desconectado porque por afiliação inválida"}.
{"has been kicked because the room has been changed to members-only","foi desconectado porque a política da sala mudou, só membros são permitidos"}.
{"has been kicked","foi removido"}.
{"Hash of the vCard-temp avatar of this room","Hash do avatar do vCard-temp desta sala"}.
{"Hat title","Título do chapéu"}.
{"Hat URI","URI do chapéu"}.
{"Hats limit exceeded","O limite dos chapéus foi excedido"}.
@@ -223,6 +227,7 @@
{"leaves the room","Sair da sala"}.
{"List of users with hats","Lista dos usuários com chapéus"}.
{"List users with hats","Lista os usuários com chapéus"}.
{"Logged Out","Desconectado"}.
{"Logging","Registrando no log"}.
{"Make participants list public","Tornar pública a lista de participantes"}.
{"Make room CAPTCHA protected","Tornar protegida a senha da sala"}.
@@ -406,6 +411,7 @@
{"Restore binary backup immediately:","Restaurar imediatamente o backup binário:"}.
{"Restore plain text backup immediately:","Restaurar backup formato texto imediatamente:"}.
{"Restore","Restaurar"}.
{"Result","Resultado"}.
{"Roles and Affiliations that May Retrieve Member List","As funções e as afiliações que podem recuperar a lista dos membros"}.
{"Roles for which Presence is Broadcasted","Para quem a presença será notificada"}.
{"Roles that May Send Private Messages","Atribuições que talvez possam enviar mensagens privadas"}.
@@ -437,6 +443,7 @@
{"Set message of the day on all hosts and send to online users","Definir mensagem do dia em todos os hosts e enviar para os usuários online"}.
{"Shared Roster Groups","Grupos Shared Roster"}.
{"Show Integral Table","Mostrar Tabela Integral"}.
{"Show Occupants Join/Leave","Mostrar a entrada e a saída de ocupantes"}.
{"Show Ordinary Table","Mostrar Tabela Ordinária"}.
{"Shut Down Service","Parar Serviço"}.
{"SOCKS5 Bytestreams","Bytestreams SOCKS5"}.
@@ -534,6 +541,7 @@
{"Too many unacked stanzas","Número excessivo de instâncias sem confirmação"}.
{"Too many users in this conference","Há uma quantidade excessiva de usuários nesta conferência"}.
{"Traffic rate limit is exceeded","Limite de banda excedido"}.
{"~ts's MAM Archive","Arquivo ~ts's MAM"}.
{"~ts's Offline Messages Queue","~s's Fila de Mensagens Offline"}.
{"Tuesday","Terça"}.
{"Unable to generate a CAPTCHA","Impossível gerar um CAPTCHA"}.
@@ -550,12 +558,14 @@
{"Update message of the day on all hosts (don't send)","Atualizar a mensagem do dia em todos os host (não enviar)"}.
{"Update specs to get modules source, then install desired ones.","Atualize as especificações para obter a fonte dos módulos e instale os que desejar."}.
{"Update Specs","Atualizar as especificações"}.
{"Updating the vCard is not supported by the vCard storage backend","A atualização do vCard não é compatível com o back-end de armazenamento do vCard"}.
{"Upgrade","Atualização"}.
{"URL for Archived Discussion Logs","A URL para o arquivamento dos registros da discussão"}.
{"User already exists","Usuário já existe"}.
{"User (jid)","Usuário (jid)"}.
{"User JID","Usuário JID"}.
{"User Management","Gerenciamento de Usuários"}.
{"User not allowed to perform an IQ set on another user's vCard.","O usuário não tem permissão para executar um conjunto de QI no vCard de outro usuário."}.
{"User removed","O usuário foi removido"}.
{"User session not found","A sessão do usuário não foi encontrada"}.
{"User session terminated","Sessão de usuário terminada"}.
@@ -578,6 +588,7 @@
{"Visitor","Visitante"}.
{"Voice request","Requisição de voz"}.
{"Voice requests are disabled in this conference","Requisições de voz estão desabilitadas nesta sala de conferência"}.
{"Web client which allows to join the room anonymously","Cliente da web que permite entrar na sala de forma anônima"}.
{"Wednesday","Quarta"}.
{"When a new subscription is processed and whenever a subscriber comes online","Quando uma nova assinatura é processada e sempre que um assinante fica online"}.
{"When a new subscription is processed","Quando uma nova assinatura é processada"}.
+11
View File
@@ -46,7 +46,9 @@
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Qualquer pessoa com uma assinatura presente dos dois ou de ambos pode se inscrever e recuperar os itens"}.
{"Anyone with Voice","Qualquer pessoa com voz"}.
{"Anyone","Qualquer pessoa"}.
{"API Commands","Comandos API"}.
{"April","Abril"}.
{"Arguments","Argumentos"}.
{"Attribute 'channel' is required for this request","O atributo 'canal' é necessário para esta solicitação"}.
{"Attribute 'id' is mandatory for MIX messages","O atributo 'id' é obrigatório para mensagens MIX"}.
{"Attribute 'jid' is not allowed here","O atributo 'jid' não é permitido aqui"}.
@@ -86,6 +88,7 @@
{"Choose whether to approve this entity's subscription.","Aprovar esta assinatura."}.
{"City","Cidade"}.
{"Client acknowledged more stanzas than sent by server","O cliente reconheceu mais estrofes do que as enviadas pelo servidor"}.
{"Clustering","Agrupamento"}.
{"Commands","Comandos"}.
{"Conference room does not exist","A sala não existe"}.
{"Configuration of room ~s","Configuração para ~s"}.
@@ -168,6 +171,7 @@
{"has been kicked because of an affiliation change","foi desconectado porque por afiliação inválida"}.
{"has been kicked because the room has been changed to members-only","foi desconectado porque a política da sala mudou, só membros são permitidos"}.
{"has been kicked","foi removido"}.
{"Hash of the vCard-temp avatar of this room","Hash do avatar do vCard-temp desta sala"}.
{"Hat title","Título do chapéu"}.
{"Hat URI","URI do chapéu"}.
{"Hats limit exceeded","O limite dos chapéus foi excedido"}.
@@ -223,6 +227,7 @@
{"leaves the room","Sair da sala"}.
{"List of users with hats","Lista os utilizadores com chapéus"}.
{"List users with hats","Lista os utilizadores com chapéus"}.
{"Logged Out","Desconectado"}.
{"Logging","Registando no log"}.
{"Make participants list public","Tornar pública a lista de participantes"}.
{"Make room CAPTCHA protected","Tornar protegida a palavra-passe da sala"}.
@@ -406,6 +411,7 @@
{"Restore binary backup immediately:","Restaurar imediatamente o backup binário:"}.
{"Restore plain text backup immediately:","Restaurar backup formato texto imediatamente:"}.
{"Restore","Restaurar"}.
{"Result","Resultado"}.
{"Roles and Affiliations that May Retrieve Member List","As funções e as afiliações que podem recuperar a lista dos membros"}.
{"Roles for which Presence is Broadcasted","Para quem a presença será notificada"}.
{"Roles that May Send Private Messages","Atribuições que talvez possam enviar mensagens privadas"}.
@@ -437,6 +443,7 @@
{"Set message of the day on all hosts and send to online users","Definir mensagem do dia em todos os hosts e enviar para os utilizadores online"}.
{"Shared Roster Groups","Grupos Shared Roster"}.
{"Show Integral Table","Mostrar Tabela Integral"}.
{"Show Occupants Join/Leave","Mostrar a entrada e a saída de ocupantes"}.
{"Show Ordinary Table","Mostrar Tabela Ordinária"}.
{"Shut Down Service","Parar Serviço"}.
{"SOCKS5 Bytestreams","Bytestreams SOCKS5"}.
@@ -534,6 +541,7 @@
{"Too many unacked stanzas","Quantidade excessiva de instâncias sem confirmação"}.
{"Too many users in this conference","Há uma quantidade excessiva de utilizadores nesta conferência"}.
{"Traffic rate limit is exceeded","Limite de banda excedido"}.
{"~ts's MAM Archive","Arquivo ~ts's MAM"}.
{"~ts's Offline Messages Queue","~s's Fila de Mensagens Offline"}.
{"Tuesday","Terça"}.
{"Unable to generate a CAPTCHA","Impossível gerar um CAPTCHA"}.
@@ -550,12 +558,14 @@
{"Update message of the day on all hosts (don't send)","Atualizar a mensagem do dia em todos os host (não enviar)"}.
{"Update specs to get modules source, then install desired ones.","Atualize as especificações para obter a fonte dos módulos e instale os que desejar."}.
{"Update Specs","Atualizar as especificações"}.
{"Updating the vCard is not supported by the vCard storage backend","A atualização do vCard não é compatível com o back-end de armazenamento do vCard"}.
{"Upgrade","Atualização"}.
{"URL for Archived Discussion Logs","A URL para o arquivamento dos registos da discussão"}.
{"User already exists","Utilizador já existe"}.
{"User (jid)","Utilizador (jid)"}.
{"User JID","Utilizador JID"}.
{"User Management","Gestão de utilizadores"}.
{"User not allowed to perform an IQ set on another user's vCard.","O utilizador não tem permissão para executar um conjunto de QI no vCard de outro utilizador."}.
{"User removed","O utilizador foi removido"}.
{"User session not found","A sessão do utilizador não foi encontrada"}.
{"User session terminated","Sessão de utilizador terminada"}.
@@ -578,6 +588,7 @@
{"Visitor","Visitante"}.
{"Voice request","Requisição de voz"}.
{"Voice requests are disabled in this conference","Requisições de voz estão desativadas nesta sala de conferência"}.
{"Web client which allows to join the room anonymously","Cliente da web que permite entrar na sala de forma anônima"}.
{"Wednesday","Quarta"}.
{"When a new subscription is processed and whenever a subscriber comes online","Quando uma nova assinatura é processada e sempre que um assinante fica online"}.
{"When a new subscription is processed","Quando uma nova assinatura é processada"}.
+15
View File
@@ -28,7 +28,9 @@
{"Anyone may publish","Gjithkush mund të publikojë"}.
{"Anyone with Voice","Cilido me Zë"}.
{"Anyone","Cilido"}.
{"API Commands","Urdhra API"}.
{"April","Prill"}.
{"Arguments","Argumente"}.
{"Attribute 'channel' is required for this request","Atributi 'channel' është i domosdoshëm për këtë kërkesë"}.
{"Attribute 'jid' is not allowed here","Atributi 'jid' slejohet këtu"}.
{"Attribute 'node' is not allowed here","Atributi 'node' slejohet këtu"}.
@@ -50,6 +52,7 @@
{"Changing role/affiliation is not allowed","Nuk lejohet ndryshim roli/përkatësie"}.
{"Channel already exists","Kanali ekziston tashmë"}.
{"Channel does not exist","Kanali sekziston"}.
{"Channel JID","JID Kanali"}.
{"Channels","Kanale"}.
{"Characters not allowed:","Shenja të palejuara:"}.
{"Chatroom configuration modified","Ndryshoi formësimi i dhomës së fjalosjeve"}.
@@ -99,6 +102,8 @@
{"Full List of Room Admins","Listë e Plotë Përgjegjësish Dhome"}.
{"Full List of Room Owners","Listë e Plotë të Zotësh Dhome"}.
{"Full Name","Emër i Plotë"}.
{"Get List of Online Users","Merr Listë Përdoruesish Në Linjë"}.
{"Get List of Registered Users","Merr Listë Përdoruesish të Regjistruar"}.
{"Get Number of Online Users","Merr Numër Përdoruesish Në Linjë"}.
{"Get Number of Registered Users","Merr Numër Përdoruesish të Regjistruar"}.
{"Get User Statistics","Merr Statistika Përdoruesi"}.
@@ -106,6 +111,7 @@
{"Grant voice to this person?","Ti akordohet zë këtij personi?"}.
{"has been banned","është dëbuar"}.
{"has been kicked","është përzënë"}.
{"Hat title","Titull kapeleje"}.
{"Host unknown","Strehë e panjohur"}.
{"HTTP File Upload","Ngarkim Kartelash HTTP"}.
{"Idle connection","Lidhje e plogësht"}.
@@ -191,6 +197,7 @@
{"Node index not found","Su gjet tregues nyje"}.
{"Node not found","Su gjet nyjë"}.
{"Node ~p","Nyjë ~p"}.
{"Node","Nyjë"}.
{"Nodes","Nyja"}.
{"None","Asnjë"}.
{"Not allowed","E palejuar"}.
@@ -203,6 +210,7 @@
{"Number of online users","Numër përdoruesish në linjë"}.
{"Number of registered users","Numër përdoruesish të regjistruar"}.
{"Occupants are allowed to invite others","Të pranishmëve u është lejuar të ftojnë të tjerë"}.
{"Occupants are allowed to query others","Të pranishmëve u është lejuar tu bëjnë kërkim të tjerëve"}.
{"Occupants May Change the Subject","Të pranishmit Mund të Ndryshojnë Subjektin"}.
{"October","Tetor"}.
{"OK","OK"}.
@@ -210,12 +218,14 @@
{"Online Users","Përdorues Në Linjë"}.
{"Online","Në linjë"}.
{"Only deliver notifications to available users","Dorëzo njoftime vetëm te përdoruesit e pranishëm"}.
{"Only moderators are allowed to retract messages","Vetëm të moderatorëve u lejohet të tërheqin mbrapsht mesazhe"}.
{"Only occupants are allowed to send messages to the conference","Vetëm të pranishmëve u lejohet të dërgojnë mesazhe te konferenca"}.
{"Only publishers may publish","Vetëm botuesit mund të botojnë"}.
{"Organization Name","Emër Enti"}.
{"Organization Unit","Njësi Organizative"}.
{"Outgoing s2s Connections","Lidhje s2s Ikëse"}.
{"Owner privileges required","Lypset privilegje të zoti"}.
{"Participant ID","ID Pjesëmarrësi"}.
{"Participant","Pjesëmarrës"}.
{"Password Verification","Verifikim Fjalëkalimi"}.
{"Password Verification:","Verifikim Fjalëkalimi:"}.
@@ -266,6 +276,7 @@
{"Specify the access model","Specifikoni model hyrjeje"}.
{"Specify the event message type","Përcaktoni llojin e mesazhit për aktin"}.
{"Specify the publisher model","Përcaktoni model botuesi"}.
{"Stanza id is not valid","ID Stanza s’është i vlefshëm"}.
{"Stopped Nodes","Nyja të Ndalura"}.
{"Subject","Subjekti"}.
{"Submitted","Parashtruar"}.
@@ -277,6 +288,7 @@
{"The default language of the node","Gjuha parazgjedhje e nyjës"}.
{"The feature requested is not supported by the conference","Veçoria e kërkuar nuk mbulohen nga konferenca"}.
{"The JID of the node creator","JID i krijjuesit të nyjës"}.
{"The list of all online users","Lista e krejt përdoruesve në linjë"}.
{"The name of the node","Emri i nyjës"}.
{"The number of subscribers to the node","Numri i pajtimtarëve te nyja"}.
{"The number of unread or undelivered messages","Numri i mesazheve të palexuar ose të padorëzuar"}.
@@ -303,6 +315,7 @@
{"Unregister an XMPP account","Çregjistroni një llogari XMPP"}.
{"Unregister","Çregjistrohuni"}.
{"Unsupported version","Version i pambuluar"}.
{"Updating the vCard is not supported by the vCard storage backend","Përditësimi i vCard-it nuk mbulohet nga mekanizmi i depozitimit të vCard-ve"}.
{"User already exists","Ka tashmë një përdorues të tillë"}.
{"User JID","JID përdoruesi"}.
{"User (jid)","Përdorues (jid)"}.
@@ -319,9 +332,11 @@
{"Wednesday","E mërkurë"}.
{"When a new subscription is processed","Kur përpunohet një pajtim i ri"}.
{"Whether to allow subscriptions","Nëse duhen lejuar apo jo pajtime"}.
{"Who can send private messages","Cilët mund të dërgojnë mesazhe private"}.
{"Wrong parameters in the web formulary","Parametër i gabuar në formular web"}.
{"XMPP Account Registration","Regjistrim Llogarish XMPP"}.
{"XMPP Domains","Përkatësi XMPP"}.
{"You are not allowed to send private messages","Skeni leje të dërgoni mesazhe private"}.
{"You are not joined to the channel","Skeni hyrë te kanali"}.
{"You have been banned from this room","Jeni dëbuar prej kësaj dhome"}.
{"You have joined too many conferences","Keni hyrë në shumë konferenca"}.
-2
View File
@@ -34,7 +34,6 @@
{"Chatrooms","Chattrum"}.
{"Choose a username and password to register with this server","Välj ett användarnamn och lösenord för att registrera mot denna server"}.
{"Choose storage type of tables","Välj lagringstyp för tabeller"}.
{"Choose whether to approve this entity's subscription.","Välj om du vill godkänna hela denna prenumertion."}.
{"City","Stad"}.
{"Commands","Kommandon"}.
{"Conference room does not exist","Rummet finns inte"}.
@@ -196,7 +195,6 @@
{"Search users in ","Sök efter användare på "}.
{"Send announcement to all online users on all hosts","Sänd meddelanden till alla inloggade användare på alla värdar"}.
{"Send announcement to all online users","Sänd meddelanden till alla inloggade användare"}.
{"Send announcement to all users on all hosts","Sänd meddelanden till alla användare på alla värdar"}.
{"Send announcement to all users","Sänd meddelanden till alla användare"}.
{"September","September"}.
{"Set message of the day and send to online users","Sätt dagens status meddelande och skicka till alla användare"}.
+625
View File
@@ -0,0 +1,625 @@
%% Generated automatically
%% DO NOT EDIT: run `make translations` instead
%% To improve translations please read:
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
{" (Add * to the end of field to match substring)"," (அடி மூலக்கூறுடன் பொருந்தக்கூடிய புலத்தின் முடிவில் * சேர்க்கவும்)"}.
{" has set the subject to: "," இதற்கு பொருள் அமைத்துள்ளது: "}.
{"# participants","# பங்கேற்பாளர்கள்"}.
{"A description of the node","முனையின் விளக்கம்"}.
{"A friendly name for the node","முனைக்கு ஒரு நட்பு பெயர்"}.
{"A password is required to enter this room","இந்த அறைக்குள் நுழைய கடவுச்சொல் தேவை"}.
{"A Web Page","ஒரு வலைப்பக்கம்"}.
{"Accept","ஏற்றுக்கொள்"}.
{"Access denied by service policy","பணி கொள்கையால் மறுக்கப்பட்டது"}.
{"Access model","அணுகல் மாதிரி"}.
{"Account doesn't exist","கணக்கு இல்லை"}.
{"Action on user","பயனரின் செயல்"}.
{"Add a hat to a user","ஒரு பயனருக்கு ஒரு தொப்பியைச் சேர்க்கவும்"}.
{"Add User","பயனரைச் சேர்க்கவும்"}.
{"Administration of ","நிர்வாகம் "}.
{"Administration","நிர்வாகம்"}.
{"Administrator privileges required","நிர்வாகி சலுகைகள் தேவை"}.
{"All activity","அனைத்து செயல்பாடுகளும்"}.
{"All Users","அனைத்து பயனர்களும்"}.
{"Allow subscription","சந்தாவை அனுமதிக்கவும்"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","இந்த பப்சப் முனைக்கு குழுசேர இந்த சாபர் ஐடியை அனுமதிக்கவா?"}.
{"Allow this person to register with the room?","இந்த நபரை அறையில் பதிவு செய்ய அனுமதிக்கவா?"}.
{"Allow users to change the subject","இந்த விசயத்தை மாற்ற பயனர்களை அனுமதிக்கவும்"}.
{"Allow users to query other users","பயனர்களை மற்ற பயனர்களை வினவ அனுமதிக்கவும்"}.
{"Allow users to send invites","அழைப்புகளை அனுப்ப பயனர்களை அனுமதிக்கவும்"}.
{"Allow users to send private messages","தனிப்பட்ட செய்திகளை அனுப்ப பயனர்களை அனுமதிக்கவும்"}.
{"Allow visitors to change nickname","பார்வையாளர்களை புனைப்பெயரை மாற்ற அனுமதிக்கவும்"}.
{"Allow visitors to send private messages to","தனிப்பட்ட செய்திகளை அனுப்ப பார்வையாளர்களை அனுமதிக்கவும்"}.
{"Allow visitors to send status text in presence updates","முன்னிலையில் புதுப்பிப்புகளில் நிலை உரையை அனுப்ப பார்வையாளர்களை அனுமதிக்கவும்"}.
{"Allow visitors to send voice requests","குரல் கோரிக்கைகளை அனுப்ப பார்வையாளர்களை அனுமதிக்கவும்"}.
{"An associated LDAP group that defines room membership; this should be an LDAP Distinguished Name according to an implementation-specific or deployment-specific definition of a group.","அறை உறுப்பினர்களை வரையறுக்கும் தொடர்புடைய எல்.டி.ஏ.பி குழு; இது ஒரு குழுவின் செயல்படுத்தல்-குறிப்பிட்ட அல்லது வரிசைப்படுத்தல்-குறிப்பிட்ட வரையறையின்படி எல்.டி.ஏ.பி புகழ்பெற்ற பெயராக இருக்க வேண்டும்."}.
{"Announcements","அறிவிப்புகள்"}.
{"Answer associated with a picture","ஒரு படத்துடன் தொடர்புடைய பதில்"}.
{"Answer associated with a video","வீடியோவுடன் தொடர்புடைய பதில்"}.
{"Answer associated with speech","பேச்சுடன் தொடர்புடைய பதில்"}.
{"Answer to a question","ஒரு கேள்விக்கு பதில்"}.
{"Anyone in the specified roster group(s) may subscribe and retrieve items","குறிப்பிட்ட ரோச்டர் குழு (கள்) இல் உள்ள எவரும் உருப்படிகளை குழுசேரலாம் மற்றும் மீட்டெடுக்கலாம்"}.
{"Anyone may associate leaf nodes with the collection","எவரும் இலை முனைகளை சேகரிப்புடன் தொடர்புபடுத்தலாம்"}.
{"Anyone may publish","எவரும் வெளியிடலாம்"}.
{"Anyone may subscribe and retrieve items","எவரும் பொருட்களை குழுசேர் மற்றும் மீட்டெடுக்கலாம்"}.
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","அல்லது இரண்டின் இருப்பு சந்தா உள்ள எவரும் உருப்படிகளை குழுசேர் மற்றும் மீட்டெடுக்கலாம்"}.
{"Anyone with Voice","குரல் உள்ள எவரும்"}.
{"Anyone","யாரும்"}.
{"April","ப-சித்திரை"}.
{"Attribute 'channel' is required for this request","இந்த கோரிக்கைக்கு 'சேனல்' என்ற பண்புக்கூறு தேவை"}.
{"Attribute 'id' is mandatory for MIX messages","கலவை செய்திகளுக்கு 'ஐடி' கட்டாயமாகும்"}.
{"Attribute 'jid' is not allowed here","'சிட்' என்ற பண்புக்கூறு இங்கே அனுமதிக்கப்படவில்லை"}.
{"Attribute 'node' is not allowed here","'முனை' என்ற பண்புக்கூறு இங்கே அனுமதிக்கப்படவில்லை"}.
{"Attribute 'to' of stanza that triggered challenge","சவாலைத் தூண்டும் சரணத்தின் '' 'என்ற பண்புக்கூறு"}.
{"August","ஆ-ஆவணி"}.
{"Automatic node creation is not enabled","தானியங்கி முனை உருவாக்கம் இயக்கப்படவில்லை"}.
{"Backup Management","காப்பு மேலாண்மை"}.
{"Backup of ~p","~p இன் காப்புப்பிரதி"}.
{"Backup to File at ","தாக்கல் செய்ய காப்புப்பிரதி "}.
{"Backup","காப்புப்பிரதி"}.
{"Bad format","மோசமான வடிவம்"}.
{"Birthday","பிறந்த நாள்"}.
{"Both the username and the resource are required","பயனர்பெயர் மற்றும் சான்று இரண்டும் தேவை"}.
{"Bytestream already activated","பைட்டெச்ட்ரீம் ஏற்கனவே செயல்படுத்தப்பட்டது"}.
{"Cannot remove active list","செயலில் உள்ள பட்டியலை அகற்ற முடியாது"}.
{"Cannot remove default list","இயல்புநிலை பட்டியலை அகற்ற முடியாது"}.
{"CAPTCHA web page","கேப்ட்சா வலைப்பக்கம்"}.
{"Challenge ID","அறைகூவல் ஐடி"}.
{"Change Password","கடவுச்சொல்லை மாற்றவும்"}.
{"Change User Password","பயனர் கடவுச்சொல்லை மாற்றவும்"}.
{"Changing password is not allowed","கடவுச்சொல்லை மாற்ற அனுமதிக்கப்படவில்லை"}.
{"Changing role/affiliation is not allowed","பங்கு/இணைப்பை மாற்ற அனுமதிக்கப்படவில்லை"}.
{"Channel already exists","சேனல் ஏற்கனவே உள்ளது"}.
{"Channel does not exist","சேனல் இல்லை"}.
{"Channel JID","சேனல் சிட்"}.
{"Channels","சேனல்கள்"}.
{"Characters not allowed:","எழுத்துக்கள் அனுமதிக்கப்படவில்லை:"}.
{"Chatroom configuration modified","அரட்டை உள்ளமைவு மாற்றப்பட்டது"}.
{"Chatroom is created","அரட்டை அறை உருவாக்கப்பட்டது"}.
{"Chatroom is destroyed","அரட்டை அறை அழிக்கப்படுகிறது"}.
{"Chatroom is started","அரட்டை அறை தொடங்கப்பட்டது"}.
{"Chatroom is stopped","அரட்டை அறை நிறுத்தப்பட்டது"}.
{"Chatrooms","அரட்டை அறைகள்"}.
{"Choose a username and password to register with this server","இந்த சேவையகத்துடன் பதிவு செய்ய பயனர்பெயர் மற்றும் கடவுச்சொல்லைத் தேர்வுசெய்க"}.
{"Choose storage type of tables","அட்டவணைகளின் சேமிப்பக வகை என்பதைத் தேர்வுசெய்க"}.
{"Choose whether to approve this entity's subscription.","இந்த நிறுவனத்தின் சந்தாவை அங்கீகரிக்க வேண்டுமா என்பதைத் தேர்வுசெய்க."}.
{"City","நகரம்"}.
{"Client acknowledged more stanzas than sent by server","சேவையகத்தால் அனுப்பப்பட்டதை விட கிளையன்ட் அதிக சரணத்தை ஒப்புக் கொண்டார்"}.
{"Commands","கட்டளைகள்"}.
{"Conference room does not exist","மாநாட்டு அறை இல்லை"}.
{"Configuration of room ~s","அறையின் உள்ளமைவு ~s"}.
{"Configuration","உள்ளமைவு"}.
{"Contact Addresses (normally, room owner or owners)","தொடர்பு முகவரிகள் (பொதுவாக, அறை உரிமையாளர் அல்லது உரிமையாளர்கள்)"}.
{"Country","நாடு"}.
{"Current Discussion Topic","தற்போதைய கலந்துரையாடல் தலைப்பு"}.
{"Database failure","தரவுத்தள தோல்வி"}.
{"Database Tables Configuration at ","தரவுத்தள அட்டவணைகள் உள்ளமைவு "}.
{"Database","தரவுத்தளம்"}.
{"December","கா-மார்கழி"}.
{"Default users as participants","பங்கேற்பாளர்களாக இயல்புநிலை பயனர்கள்"}.
{"Delete message of the day on all hosts","அனைத்து புரவலர்களிலும் அன்றைய செய்தியை நீக்கு"}.
{"Delete message of the day","அன்றைய செய்தியை நீக்கு"}.
{"Delete User","பயனரை நீக்கு"}.
{"Deliver event notifications","நிகழ்வு அறிவிப்புகளை வழங்கவும்"}.
{"Deliver payloads with event notifications","நிகழ்வு அறிவிப்புகளுடன் பேலோடுகளை வழங்கவும்"}.
{"Disc only copy","வட்டு மட்டுமே நகலெடுக்கவும்"}.
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","உங்கள் கடவுச்சொல்லை யாரிடமும் சொல்லாதீர்கள், எக்ச்எம்பி.பி சேவையகத்தின் நிர்வாகிகள் கூட இல்லை."}.
{"Dump Backup to Text File at ","உரை கோப்பில் காப்புப்பிரதியை டம்ப் செய்யுங்கள் "}.
{"Dump to Text File","உரை கோப்பில் டம்ப் செய்யுங்கள்"}.
{"Duplicated groups are not allowed by RFC6121","நகல் குழுக்கள் RFC6121 ஆல் அனுமதிக்கப்படவில்லை"}.
{"Dynamically specify a replyto of the item publisher","உருப்படி வெளியீட்டாளரின் பதிலை மாறும் வகையில் குறிப்பிடவும்"}.
{"Edit Properties","பண்புகளைத் திருத்து"}.
{"Either approve or decline the voice request.","குரல் கோரிக்கையை அங்கீகரிக்கவும் அல்லது நிராகரிக்கவும்."}.
{"ejabberd HTTP Upload service","EJABBERD HTTP பதிவேற்ற பணி"}.
{"ejabberd MUC module","EJABBERD MUC தொகுதி"}.
{"ejabberd Multicast service","எசாபர்ட் மல்டிகாச்ட் பணி"}.
{"ejabberd Publish-Subscribe module","EJABBERD வெளியீட்டு-சந்தா தொகுதி"}.
{"ejabberd SOCKS5 Bytestreams module","EJABBERD SOCKS5 BYTESTREAMS தொகுதி"}.
{"ejabberd vCard module","EJABBERD VCARD தொகுதி"}.
{"ejabberd Web Admin","எசாபர்ட் வலை நிர்வாகி"}.
{"ejabberd","எசாபர்ட்"}.
{"Email Address","மின்னஞ்சல் முகவரி"}.
{"Email","மின்னஞ்சல்"}.
{"Enable hats","தொப்பிகளை இயக்கவும்"}.
{"Enable logging","பதிவை இயக்கவும்"}.
{"Enable message archiving","செய்தி காப்பகத்தை இயக்கவும்"}.
{"Enabling push without 'node' attribute is not supported","'முனை' பண்புக்கூறு இல்லாமல் உந்துதலை இயக்குவது ஆதரிக்கப்படவில்லை"}.
{"End User Session","இறுதி பயனர் அமர்வு"}.
{"Enter nickname you want to register","நீங்கள் பதிவு செய்ய விரும்பும் புனைப்பெயரை உள்ளிடவும்"}.
{"Enter path to backup file","காப்புப்பிரதி கோப்பிற்கு பாதையை உள்ளிடவும்"}.
{"Enter path to jabberd14 spool dir","Jabberd14 Spool அடைவு க்கு பாதையை உள்ளிடவும்"}.
{"Enter path to jabberd14 spool file","சாபர்ட் 14 ச்பூல் கோப்புக்கு பாதையை உள்ளிடவும்"}.
{"Enter path to text file","உரை கோப்புக்கு பாதையை உள்ளிடவும்"}.
{"Enter the text you see","நீங்கள் பார்க்கும் உரையை உள்ளிடவும்"}.
{"Erlang XMPP Server","எர்லாங் எக்ச்எம்பிபி சேவையகம்"}.
{"Exclude Jabber IDs from CAPTCHA challenge","கேப்ட்சா சேலஞ்சில் இருந்து சாபர் ஐடிகளை விலக்குங்கள்"}.
{"Export all tables as SQL queries to a file:","அனைத்து அட்டவணைகளையும் கவிமொ வினவல்களாக ஒரு கோப்பில் ஏற்றுமதி செய்யுங்கள்:"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","சேவையகத்தில் உள்ள அனைத்து பயனர்களின் தரவை Piefxis கோப்புகளுக்கு (XEP-0227) ஏற்றுமதி செய்யுங்கள்:"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","ஓச்டில் பயனர்களின் தரவை Piefxis கோப்புகளுக்கு ஏற்றுமதி செய்யுங்கள் (XEP-0227):"}.
{"External component failure","வெளிப்புற கூறு தோல்வி"}.
{"External component timeout","வெளிப்புற கூறு நேரம் முடிந்தது"}.
{"Failed to activate bytestream","பைட்டெச்ட்ரீமை செயல்படுத்தத் தவறிவிட்டது"}.
{"Failed to extract JID from your voice request approval","உங்கள் குரல் கோரிக்கை ஒப்புதலிலிருந்து சிட் பிரித்தெடுப்பதில் தோல்வி"}.
{"Failed to map delegated namespace to external component","வெளிப்புற கூறுகளுக்கு பிரதிநிதித்துவ பெயர்வெளியை வரைபடமாக்குவதில் தோல்வி"}.
{"Failed to parse HTTP response","HTTP பதிலை அலசத் தவறிவிட்டது"}.
{"Failed to process option '~s'","விருப்பத்தை '~s' செயலாக்குவதில் தோல்வி"}.
{"Family Name","குடும்ப பெயர்"}.
{"FAQ Entry","கேள்விகள் நுழைவு"}.
{"February","தை-மாசி"}.
{"File larger than ~w bytes","~w பைட்டுகளை விட பெரியது"}.
{"Fill in the form to search for any matching XMPP User","பொருந்தக்கூடிய எக்ச்எம்பிபி பயனரைத் தேட படிவத்தை நிரப்பவும்"}.
{"Friday","வெள்ளிக்கிழமை"}.
{"From ~ts","~ts இலிருந்து"}.
{"Full List of Room Admins","அறை நிர்வாகிகளின் முழு பட்டியல்"}.
{"Full List of Room Owners","அறை உரிமையாளர்களின் முழு பட்டியல்"}.
{"Full Name","முழு பெயர்"}.
{"Get List of Online Users","நிகழ்நிலை பயனர்களின் பட்டியலைப் பெறுங்கள்"}.
{"Get List of Registered Users","பதிவுசெய்யப்பட்ட பயனர்களின் பட்டியலைப் பெறுங்கள்"}.
{"Get Number of Online Users","நிகழ்நிலை பயனர்களின் எண்ணிக்கையைப் பெறுங்கள்"}.
{"Get Number of Registered Users","பதிவுசெய்யப்பட்ட பயனர்களின் எண்ணிக்கையைப் பெறுங்கள்"}.
{"Get Pending","நிலுவையில் செல்லுங்கள்"}.
{"Get User Last Login Time","பயனர் கடைசி உள்நுழைவு நேரத்தைப் பெறுங்கள்"}.
{"Get User Statistics","பயனர் புள்ளிவிவரங்களைப் பெறுங்கள்"}.
{"Given Name","கொடுக்கப்பட்ட பெயர்"}.
{"Grant voice to this person?","இந்த நபருக்கு குரல் கொடுக்கவா?"}.
{"has been banned","தடைசெய்யப்பட்டுள்ளது"}.
{"has been kicked because of a system shutdown","கணினி பணிநிறுத்தம் காரணமாக உதைக்கப்பட்டுள்ளது"}.
{"has been kicked because of an affiliation change","இணைப்பு மாற்றம் காரணமாக உதைக்கப்பட்டுள்ளது"}.
{"has been kicked because the room has been changed to members-only","அறை உறுப்பினர்களுக்கு மட்டுமே மாற்றப்பட்டதால் உதைக்கப்பட்டுள்ளது"}.
{"has been kicked","உதைக்கப்பட்டுள்ளது"}.
{"Hash of the vCard-temp avatar of this room","இந்த அறையின் vcard-temp அவதாரத்தின் ஆச்"}.
{"Hat title","தொப்பி தலைப்பு"}.
{"Hat URI","தொப்பி யூரி"}.
{"Hats limit exceeded","தொப்பிகள் வரம்பு மீறியது"}.
{"Host unknown","புரவலன் தெரியவில்லை"}.
{"HTTP File Upload","HTTP கோப்பு பதிவேற்றம்"}.
{"Idle connection","செயலற்ற இணைப்பு"}.
{"If you don't see the CAPTCHA image here, visit the web page.","நீங்கள் இங்கே கேப்ட்சா படத்தைக் காணவில்லை என்றால், வலைப்பக்கத்தைப் பார்வையிடவும்."}.
{"Import Directory","இறக்குமதி அடைவு"}.
{"Import File","கோப்பு இறக்குமதி"}.
{"Import user data from jabberd14 spool file:","சாபர்ட் 14 ச்பூல் கோப்பிலிருந்து பயனர் தரவை இறக்குமதி செய்யுங்கள்:"}.
{"Import User from File at ","கோப்பிலிருந்து பயனரை இறக்குமதி செய்யுங்கள் "}.
{"Import users data from a PIEFXIS file (XEP-0227):","PIEFXIS கோப்பிலிருந்து (XEP-0227) பயனர்களின் தரவை இறக்குமதி செய்யுங்கள்:"}.
{"Import users data from jabberd14 spool directory:","சாபர்ட் 14 ச்பூல் கோப்பகத்திலிருந்து பயனர்களின் தரவை இறக்குமதி செய்யுங்கள்:"}.
{"Import Users from Dir at ","அடைவு இலிருந்து பயனர்களை இறக்குமதி செய்யுங்கள் "}.
{"Import Users From jabberd14 Spool Files","சாபர்ட் 14 ச்பூல் கோப்புகளிலிருந்து பயனர்களை இறக்குமதி செய்யுங்கள்"}.
{"Improper domain part of 'from' attribute","'ஃப்ரம்' பண்புக்கூறின் முறையற்ற டொமைன் பகுதி"}.
{"Improper message type","முறையற்ற செய்தி வகை"}.
{"Incorrect CAPTCHA submit","தவறான கேப்ட்சா சமர்ப்பிக்கவும்"}.
{"Incorrect data form","தவறான தரவு வடிவம்"}.
{"Incorrect password","தவறான கடவுச்சொல்"}.
{"Incorrect value of 'action' attribute","'செயல்' பண்புக்கூறின் தவறான மதிப்பு"}.
{"Incorrect value of 'action' in data form","தரவு வடிவத்தில் 'செயல்' இன் தவறான மதிப்பு"}.
{"Incorrect value of 'path' in data form","தரவு வடிவத்தில் 'பாதை' இன் தவறான மதிப்பு"}.
{"Installed Modules:","நிறுவப்பட்ட தொகுதிகள்:"}.
{"Install","நிறுவவும்"}.
{"Insufficient privilege","போதிய சலுகை"}.
{"Internal server error","உள் சேவையக பிழை"}.
{"Invalid 'from' attribute in forwarded message","அனுப்பப்பட்ட செய்தியில் 'இலிருந்து' பண்புக்கூறு"}.
{"Invalid node name","தவறான முனை பெயர்"}.
{"Invalid 'previd' value","தவறான 'முந்தைய' மதிப்பு"}.
{"Invitations are not allowed in this conference","இந்த மாநாட்டில் அழைப்புகள் அனுமதிக்கப்படவில்லை"}.
{"IP addresses","ஐபி முகவரிகள்"}.
{"is now known as","இப்போது அழைக்கப்படுகிறது"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","பிழை செய்திகளை அறைக்கு அனுப்ப அனுமதிக்கப்படவில்லை. பங்கேற்பாளர் (~s) ஒரு பிழை செய்தியை (~s) அனுப்பி அறையிலிருந்து உதைத்துள்ளார்"}.
{"It is not allowed to send private messages of type \"groupchat\"","\"குரூப்சாட்\" என்ற வகை தனிப்பட்ட செய்திகளை அனுப்ப அனுமதிக்கப்படவில்லை"}.
{"It is not allowed to send private messages to the conference","தனிப்பட்ட செய்திகளை மாநாட்டிற்கு அனுப்ப அனுமதிக்கப்படவில்லை"}.
{"Jabber ID","சாபர் ஐடி"}.
{"January","மா-தை"}.
{"JID normalization denied by service policy","பணி கொள்கையால் மறுக்கப்பட்ட சிட் இயல்பாக்கம்"}.
{"JID normalization failed","சிட் இயல்பாக்கம் தோல்வியடைந்தது"}.
{"Joined MIX channels of ~ts","~ts இன் கலவை சேனல்களில் சேர்ந்தது"}.
{"Joined MIX channels:","இணைந்த கலவை சேனல்கள்:"}.
{"joins the room","அறையில் இணைகிறது"}.
{"July","ஆ-ஆடி"}.
{"June","வை-ஆனி"}.
{"Just created","இப்போது உருவாக்கப்பட்டது"}.
{"Last Activity","கடைசி செயல்பாடு"}.
{"Last login","கடைசி உள்நுழைவு"}.
{"Last message","கடைசி செய்தி"}.
{"Last month","கடந்த மாதம்"}.
{"Last year","கடந்த ஆண்டு"}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","உரையின் SHA-256 ஆசின் குறைந்த குறிப்பிடத்தக்க பிட்கள் எக்சாடெசிமல் சிட்டை சமமாக இருக்க வேண்டும்"}.
{"leaves the room","அறையை விட்டு வெளியேறுகிறது"}.
{"List of users with hats","தொப்பிகளைக் கொண்ட பயனர்களின் பட்டியல்"}.
{"List users with hats","தொப்பிகளுடன் பயனர்களை பட்டியலிடுங்கள்"}.
{"Logged Out","வெளியேறியது"}.
{"Logging","பதிவு"}.
{"Make participants list public","பங்கேற்பாளர்கள் பட்டியலிடுங்கள்"}.
{"Make room CAPTCHA protected","அறை கேப்ட்சா பாதுகாக்கவும்"}.
{"Make room members-only","அறை உறுப்பினர்களை மட்டும் செய்யுங்கள்"}.
{"Make room moderated","அறை மிதமானதாக்குங்கள்"}.
{"Make room password protected","அறை கடவுச்சொல்லைப் பாதுகாக்கவும்"}.
{"Make room persistent","அறையை தொடர்ந்து செய்யுங்கள்"}.
{"Make room public searchable","அறையை பொதுவில் தேடலாம்"}.
{"Malformed username","தவறான பயனர்பெயர்"}.
{"MAM preference modification denied by service policy","பணி கொள்கையால் மறுக்கப்பட்ட மாம் விருப்பத்தேர்வு மாற்றம்"}.
{"March","மா-பங்குனி"}.
{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","அதிகபட்சம் # தொடர்ச்சியாக இருக்க வேண்டும், அல்லது அதிகபட்சமாக விதிக்கப்பட்ட சேவையகத்தைத் தவிர வேறு எந்த குறிப்பிட்ட வரம்பும் இல்லாமல் `அதிகபட்சம்"}.
{"Max payload size in bytes","பைட்டுகளில் அதிகபட்ச பேலோட் அளவு"}.
{"Maximum file size","அதிகபட்ச கோப்பு அளவு"}.
{"Maximum Number of History Messages Returned by Room","அறையால் திரும்பிய அதிகபட்ச வரலாற்று செய்திகளின் எண்ணிக்கை"}.
{"Maximum number of items to persist","தொடர்ந்து அதிகபட்ச உருப்படிகளின் எண்ணிக்கை"}.
{"Maximum Number of Occupants","அதிகபட்ச குடியிருப்பாளர்களின் எண்ணிக்கை"}.
{"May","சி-வைகாசி"}.
{"Membership is required to enter this room","இந்த அறைக்குள் நுழைய உறுப்பினர் தேவை"}.
{"Memorize your password, or write it in a paper placed in a safe place. In XMPP there isn't an automated way to recover your password if you forget it.","உங்கள் கடவுச்சொல்லை மனப்பாடம் செய்யுங்கள், அல்லது பாதுகாப்பான இடத்தில் வைக்கப்பட்டுள்ள ஒரு காகிதத்தில் எழுதுங்கள். உங்கள் கடவுச்சொல்லை மறந்துவிட்டால் அதை மீட்டெடுக்க எக்ச்எம்பிபியில் தானியங்கு வழி இல்லை."}.
{"Mere Availability in XMPP (No Show Value)","எக்ச்எம்பிபியில் வெறும் கிடைக்கும் (காட்சி மதிப்பு இல்லை)"}.
{"Message body","செய்தி உடல்"}.
{"Message not found in forwarded payload","அனுப்பப்பட்ட பேலோடில் செய்தி காணப்படவில்லை"}.
{"Messages from strangers are rejected","அந்நியர்களிடமிருந்து செய்திகள் நிராகரிக்கப்படுகின்றன"}.
{"Messages of type headline","வகை தலைப்பின் செய்திகள்"}.
{"Messages of type normal","வகை இயல்பான செய்திகள்"}.
{"Middle Name","நடுத்தர பெயர்"}.
{"Minimum interval between voice requests (in seconds)","குரல் கோரிக்கைகளுக்கு இடையில் குறைந்தபட்ச இடைவெளி (நொடிகளில்)"}.
{"Moderator privileges required","மதிப்பீட்டாளர் சலுகைகள் தேவை"}.
{"Moderators Only","மதிப்பீட்டாளர்கள் மட்டுமே"}.
{"Moderator","மதிப்பீட்டாளர்"}.
{"Module failed to handle the query","தொகுதி வினவலைக் கையாளத் தவறிவிட்டது"}.
{"Monday","திங்கள்"}.
{"Multicast","மல்டிகாச்ட்"}.
{"Multiple <item/> elements are not allowed by RFC6121","பல <உருப்படி/> கூறுகள் RFC6121 ஆல் அனுமதிக்கப்படாது"}.
{"Multi-User Chat","பல பயனர் அரட்டை"}.
{"Name","பெயர்"}.
{"Natural Language for Room Discussions","அறை விவாதங்களுக்கு இயற்கை மொழி"}.
{"Natural-Language Room Name","இயற்கை மொழி அறை பெயர்"}.
{"Neither 'jid' nor 'nick' attribute found","'சிட்' அல்லது 'நிக்' பண்புக்கூறு இல்லை"}.
{"Neither 'role' nor 'affiliation' attribute found","'பங்கு' அல்லது 'இணைப்பு' பண்புக்கூறு இல்லை"}.
{"Never","ஒருபோதும்"}.
{"New Password:","புதிய கடவுச்சொல்:"}.
{"Nickname can't be empty","புனைப்பெயர் காலியாக இருக்க முடியாது"}.
{"Nickname Registration at ","இல் புனைப்பெயர் பதிவு "}.
{"Nickname ~s does not exist in the room","அறையில் ~s புனைப்பெயர் இல்லை"}.
{"Nickname","புனைப்பெயர்"}.
{"No address elements found","முகவரி கூறுகள் எதுவும் கிடைக்கவில்லை"}.
{"No addresses element found","முகவரிகள் உறுப்பு இல்லை"}.
{"No 'affiliation' attribute found","'இணைப்பு' பண்புக்கூறு இல்லை"}.
{"No available resource found","கிடைக்கக்கூடிய வளங்கள் எதுவும் கிடைக்கவில்லை"}.
{"No body provided for announce message","அறிவிப்பு செய்திக்கு எந்த உடலும் வழங்கப்படவில்லை"}.
{"No child elements found","குழந்தை கூறுகள் எதுவும் கிடைக்கவில்லை"}.
{"No data form found","தரவு படிவம் எதுவும் கிடைக்கவில்லை"}.
{"No Data","தரவு இல்லை"}.
{"No features available","நற்பொருத்தங்கள் எதுவும் கிடைக்கவில்லை"}.
{"No <forwarded/> element found","இல்லை <முன்னோக்கி/> உறுப்பு காணப்பட்டது"}.
{"No hook has processed this command","இந்த கட்டளையை எந்த ஊக்கும் செயலாக்கவில்லை"}.
{"No info about last activity found","கடைசி செயல்பாட்டைப் பற்றிய எந்த தகவலும் கிடைக்கவில்லை"}.
{"No 'item' element found","'உருப்படி' உறுப்பு இல்லை"}.
{"No items found in this query","இந்த வினவலில் எந்த உருப்படிகளும் காணப்படவில்லை"}.
{"No limit","வரம்பு இல்லை"}.
{"No module is handling this query","இந்த வினவலை எந்த தொகுதியும் கையாளவில்லை"}.
{"No node specified","எந்த முனையும் குறிப்பிடப்படவில்லை"}.
{"No 'password' found in data form","தரவு வடிவத்தில் 'கடவுச்சொல்' காணப்படவில்லை"}.
{"No 'password' found in this query","இந்த வினவலில் 'கடவுச்சொல்' இல்லை"}.
{"No 'path' found in data form","தரவு வடிவத்தில் 'பாதை' இல்லை"}.
{"No pending subscriptions found","நிலுவையில் உள்ள சந்தாக்கள் எதுவும் கிடைக்கவில்லை"}.
{"No privacy list with this name found","இந்த பெயருடன் தனியுரிமை பட்டியல் எதுவும் இல்லை"}.
{"No private data found in this query","இந்த வினவலில் தனிப்பட்ட தரவு எதுவும் காணப்படவில்லை"}.
{"No running node found","இயங்கும் முனை எதுவும் கிடைக்கவில்லை"}.
{"No services available","சேவைகள் எதுவும் கிடைக்கவில்லை"}.
{"No statistics found for this item","இந்த உருப்படிக்கு புள்ளிவிவரங்கள் எதுவும் கிடைக்கவில்லை"}.
{"No 'to' attribute found in the invitation","அழைப்பில் காணப்படும் 'to' பண்புக்கூறு"}.
{"Nobody","யாரும்"}.
{"Node already exists","முனை ஏற்கனவே உள்ளது"}.
{"Node ID","முனை ஐடி"}.
{"Node index not found","முனை குறியீடு கிடைக்கவில்லை"}.
{"Node not found","முனை கிடைக்கவில்லை"}.
{"Node ~p","முனை ~p"}.
{"Nodeprep has failed","நோடெப்ரெப் தோல்வியுற்றது"}.
{"Nodes","முனைகள்"}.
{"Node","கணு"}.
{"None","எதுவுமில்லை"}.
{"Not allowed","அனுமதிக்கப்படவில்லை"}.
{"Not Found","கண்டுபிடிக்கப்படவில்லை"}.
{"Not subscribed","குழுசேரவில்லை"}.
{"Notify subscribers when items are removed from the node","முனையிலிருந்து உருப்படிகள் அகற்றப்படும்போது சந்தாதாரர்களுக்கு அறிவிக்கவும்"}.
{"Notify subscribers when the node configuration changes","முனை உள்ளமைவு மாறும்போது சந்தாதாரர்களுக்கு அறிவிக்கவும்"}.
{"Notify subscribers when the node is deleted","முனை நீக்கப்படும் போது சந்தாதாரர்களுக்கு அறிவிக்கவும்"}.
{"November","ஐ-கார்த்திகை"}.
{"Number of answers required","தேவையான பதில்களின் எண்ணிக்கை"}.
{"Number of occupants","குடியிருப்பாளர்களின் எண்ணிக்கை"}.
{"Number of Offline Messages","இணைப்பில்லாத செய்திகளின் எண்ணிக்கை"}.
{"Number of online users","நிகழ்நிலை பயனர்களின் எண்ணிக்கை"}.
{"Number of registered users","பதிவுசெய்யப்பட்ட பயனர்களின் எண்ணிக்கை"}.
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","உருப்படிகளை தானாக தூய்மைப்படுத்துவதற்கான விநாடிகளின் எண்ணிக்கை, அல்லது அதிகபட்சம் விதிக்கப்பட்ட சேவையகத்தைத் தவிர வேறு எந்த குறிப்பிட்ட வரம்பையும் `அதிகபட்சம்`"}.
{"Occupants are allowed to invite others","குடியிருப்பாளர்கள் மற்றவர்களை அழைக்க அனுமதிக்கப்படுகிறார்கள்"}.
{"Occupants are allowed to query others","குடியிருப்பாளர்கள் மற்றவர்களை வினவ அனுமதிக்கப்படுகிறார்கள்"}.
{"Occupants May Change the Subject","குடியிருப்பாளர்கள் இந்த விசயத்தை மாற்றலாம்"}.
{"October","பு-ஐப்பசி"}.
{"OK","சரி"}.
{"Old Password:","பழைய கடவுச்சொல்:"}.
{"Online Users","நிகழ்நிலை பயனர்கள்"}.
{"Online","ஆன்லைனில்"}.
{"Only collection node owners may associate leaf nodes with the collection","சேகரிப்பு முனை உரிமையாளர்கள் மட்டுமே இலை முனைகளை சேகரிப்புடன் தொடர்புபடுத்தலாம்"}.
{"Only deliver notifications to available users","கிடைக்கக்கூடிய பயனர்களுக்கு மட்டுமே அறிவிப்புகளை வழங்கவும்"}.
{"Only <enable/> or <disable/> tags are allowed","<anafice/> அல்லது <முடக்கு/> குறிச்சொற்கள் மட்டுமே அனுமதிக்கப்படுகின்றன"}.
{"Only <list/> element is allowed in this query","இந்த வினவலில் <பட்டியல்/> உறுப்பு மட்டுமே அனுமதிக்கப்படுகிறது"}.
{"Only members may query archives of this room","உறுப்பினர்கள் மட்டுமே இந்த அறையின் காப்பகங்களை வினவலாம்"}.
{"Only moderators and participants are allowed to change the subject in this room","இந்த அறையில் உள்ள விசயத்தை மாற்ற மதிப்பீட்டாளர்கள் மற்றும் பங்கேற்பாளர்கள் மட்டுமே அனுமதிக்கப்படுகிறார்கள்"}.
{"Only moderators are allowed to change the subject in this room","இந்த அறையில் உள்ள விசயத்தை மாற்ற மதிப்பீட்டாளர்கள் மட்டுமே அனுமதிக்கப்படுகிறார்கள்"}.
{"Only moderators are allowed to retract messages","மதிப்பீட்டாளர்கள் மட்டுமே செய்திகளைத் திரும்பப் பெற அனுமதிக்கப்படுகிறார்கள்"}.
{"Only moderators can approve voice requests","மதிப்பீட்டாளர்கள் மட்டுமே குரல் கோரிக்கைகளை அங்கீகரிக்க முடியும்"}.
{"Only occupants are allowed to send messages to the conference","குடியிருப்பாளர்கள் மட்டுமே மாநாட்டிற்கு செய்திகளை அனுப்ப அனுமதிக்கப்படுகிறார்கள்"}.
{"Only occupants are allowed to send queries to the conference","மாநாட்டிற்கு வினவல்களை அனுப்ப குடியிருப்பாளர்கள் மட்டுமே அனுமதிக்கப்படுகிறார்கள்"}.
{"Only publishers may publish","வெளியீட்டாளர்கள் மட்டுமே வெளியிடலாம்"}.
{"Only service administrators are allowed to send service messages","பணி செய்திகளை அனுப்ப பணி நிர்வாகிகள் மட்டுமே அனுமதிக்கப்படுகிறார்கள்"}.
{"Only those on a whitelist may associate leaf nodes with the collection","அனுமதிப்பட்டியலில் இருப்பவர்கள் மட்டுமே இலை முனைகளை சேகரிப்புடன் தொடர்புபடுத்தலாம்"}.
{"Only those on a whitelist may subscribe and retrieve items","அனுமதிப்பட்டியலில் இருப்பவர்கள் மட்டுமே உருப்படிகளை குழுசேரலாம் மற்றும் மீட்டெடுக்கலாம்"}.
{"Organization Name","அமைப்பு பெயர்"}.
{"Organization Unit","அமைப்பு பிரிவு"}.
{"Other Modules Available:","பிற தொகுதிகள் கிடைக்கின்றன:"}.
{"Outgoing s2s Connections","வெளிச்செல்லும் எச் 2 எச் இணைப்புகள்"}.
{"Owner privileges required","உரிமையாளர் சலுகைகள் தேவை"}.
{"Packet relay is denied by service policy","பணி கொள்கையால் பாக்கெட் ரிலே மறுக்கப்படுகிறது"}.
{"Participant ID","பங்கேற்பாளர் ஐடி"}.
{"Participant","பங்கேற்பாளர்"}.
{"Password Verification","கடவுச்சொல் சரிபார்ப்பு"}.
{"Password Verification:","கடவுச்சொல் சரிபார்ப்பு:"}.
{"Password","கடவுச்சொல்"}.
{"Password:","கடவுச்சொல்:"}.
{"Path to Dir","அடைவு க்கு பாதை"}.
{"Path to File","தாக்கல் செய்வதற்கான பாதை"}.
{"Payload semantic type information","பேலோட் சொற்பொருள் வகை செய்தி"}.
{"Period: ","காலம்: "}.
{"Persist items to storage","சேமிப்பகத்திற்கு உருப்படிகளைத் தொடருங்கள்"}.
{"Persistent","விடாமுயற்சி"}.
{"Ping query is incorrect","பிங் வினவல் தவறானது"}.
{"Ping","பிங்"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","இந்த விருப்பங்கள் பில்டின் மென்சியா தரவுத்தளத்தை மட்டுமே காப்புப் பிரதி எடுக்கும் என்பதை நினைவில் கொள்க. நீங்கள் ODBC தொகுதியைப் பயன்படுத்துகிறீர்கள் என்றால், உங்கள் கவிமொ தரவுத்தளத்தையும் தனித்தனியாக காப்புப் பிரதி எடுக்க வேண்டும்."}.
{"Please, wait for a while before sending new voice request","தயவுசெய்து, புதிய குரல் கோரிக்கையை அனுப்புவதற்கு முன் சிறிது நேரம் காத்திருங்கள்"}.
{"Pong","பாங்"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","'கேளுங்கள்' பண்புக்கூறு வைத்திருப்பது RFC6121 ஆல் அனுமதிக்கப்படவில்லை"}.
{"Present real Jabber IDs to","உண்மையான சாபர் ஐடிகளை வழங்கவும்"}.
{"Previous session not found","முந்தைய அமர்வு காணப்படவில்லை"}.
{"Previous session PID has been killed","முந்தைய அமர்வு பிஐடி கொல்லப்பட்டுள்ளது"}.
{"Previous session PID has exited","முந்தைய அமர்வு பிஐடி வெளியேறியது"}.
{"Previous session PID is dead","முந்தைய அமர்வு பிஐடி இறந்துவிட்டது"}.
{"Previous session timed out","முந்தைய அமர்வு நேரம் முடிந்தது"}.
{"private, ","தனிப்பட்ட, "}.
{"Public","பொது"}.
{"Publish model","மாதிரி வெளியிடு"}.
{"Publish-Subscribe","வெளியீட்டு-சந்தா"}.
{"PubSub subscriber request","பப்சப் சந்தாதாரர் கோரிக்கை"}.
{"Purge all items when the relevant publisher goes offline","தொடர்புடைய வெளியீட்டாளர் ஆஃப்லைனில் செல்லும்போது எல்லா பொருட்களையும் தூய்மைப்படுத்துங்கள்"}.
{"Push record not found","புச் பதிவு கிடைக்கவில்லை"}.
{"Queries to the conference members are not allowed in this room","இந்த அறையில் மாநாட்டு உறுப்பினர்களுக்கு வினவல்கள் அனுமதிக்கப்படவில்லை"}.
{"Query to another users is forbidden","மற்றொரு பயனர்களுக்கு வினவல் தடைசெய்யப்பட்டுள்ளது"}.
{"RAM and disc copy","ராம் மற்றும் வட்டு நகல்"}.
{"RAM copy","ரேம் நகல்"}.
{"Really delete message of the day?","அன்றைய செய்தியை உண்மையில் நீக்கவா?"}.
{"Receive notification from all descendent nodes","அனைத்து வழித்தோன்றல்களிலிருந்தும் அறிவிப்பைப் பெறுங்கள்"}.
{"Receive notification from direct child nodes only","நேரடி குழந்தை முனைகளிலிருந்து மட்டுமே அறிவிப்பைப் பெறுங்கள்"}.
{"Receive notification of new items only","புதிய பொருட்களின் அறிவிப்பைப் பெறுங்கள்"}.
{"Receive notification of new nodes only","புதிய முனைகளின் அறிவிப்பைப் பெறுங்கள்"}.
{"Recipient is not in the conference room","பெறுநர் மாநாட்டு அறையில் இல்லை"}.
{"Register an XMPP account","எக்ச்எம்பி.பி கணக்கை பதிவு செய்யுங்கள்"}.
{"Register","பதிவு செய்யுங்கள்"}.
{"Remote copy","தொலை நகல்"}.
{"Remove a hat from a user","ஒரு பயனரிடமிருந்து ஒரு தொப்பியை அகற்றவும்"}.
{"Remove User","பயனரை அகற்று"}.
{"Replaced by new connection","புதிய இணைப்பு மூலம் மாற்றப்பட்டது"}.
{"Request has timed out","கோரிக்கை நேரம் முடிந்துவிட்டது"}.
{"Request is ignored","கோரிக்கை புறக்கணிக்கப்படுகிறது"}.
{"Requested role","கோரப்பட்ட பங்கு"}.
{"Resources","வளங்கள்"}.
{"Restart Service","சேவையை மறுதொடக்கம் செய்யுங்கள்"}.
{"Restore Backup from File at ","கோப்பிலிருந்து காப்புப்பிரதியை மீட்டெடுக்கவும் "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","அடுத்த EJABBERD மறுதொடக்கத்திற்குப் பிறகு பைனரி காப்புப்பிரதியை மீட்டமைக்கவும் (குறைவான நினைவகம் தேவை):"}.
{"Restore binary backup immediately:","பைனரி காப்புப்பிரதியை உடனடியாக மீட்டமைக்கவும்:"}.
{"Restore plain text backup immediately:","எளிய உரை காப்புப்பிரதியை உடனடியாக மீட்டெடுக்கவும்:"}.
{"Restore","மீட்டமை"}.
{"Roles and Affiliations that May Retrieve Member List","உறுப்பினர் பட்டியலை மீட்டெடுக்கக்கூடிய பாத்திரங்கள் மற்றும் இணைப்புகள்"}.
{"Roles for which Presence is Broadcasted","இருப்பு ஒளிபரப்பப்படும் பாத்திரங்கள்"}.
{"Roles that May Send Private Messages","தனிப்பட்ட செய்திகளை அனுப்பக்கூடிய பாத்திரங்கள்"}.
{"Room Configuration","அறை உள்ளமைவு"}.
{"Room creation is denied by service policy","பணி கொள்கையால் அறை உருவாக்கம் மறுக்கப்படுகிறது"}.
{"Room description","அறை விளக்கம்"}.
{"Room Occupants","அறை குடியிருப்பாளர்கள்"}.
{"Room terminates","அறை முடிவடைகிறது"}.
{"Room title","அறை தலைப்பு"}.
{"Roster groups allowed to subscribe","பட்டியல் குழுக்கள் குழுசேர அனுமதிக்கப்பட்டன"}.
{"Roster size","பட்டியல் அளவு"}.
{"Running Nodes","இயங்கும் முனைகள்"}.
{"~s invites you to the room ~s","~s எச் உங்களை அறைக்கு அழைக்கிறது ~s கள்"}.
{"Saturday","காரிக்கிழமை"}.
{"Search from the date","தேதியிலிருந்து தேடுங்கள்"}.
{"Search Results for ","தேடல் முடிவுகள் "}.
{"Search the text","உரையைத் தேடுங்கள்"}.
{"Search until the date","தேதி வரை தேடுங்கள்"}.
{"Search users in ","பயனர்களைத் தேடுங்கள் "}.
{"Send announcement to all online users on all hosts","அனைத்து ஓச்ட்களிலும் அனைத்து நிகழ்நிலை பயனர்களுக்கும் அறிவிப்பை அனுப்பவும்"}.
{"Send announcement to all online users","அனைத்து நிகழ்நிலை பயனர்களுக்கும் அறிவிப்பை அனுப்பவும்"}.
{"Send announcement to all users on all hosts","அனைத்து ஓச்ட்களிலும் உள்ள அனைத்து பயனர்களுக்கும் அறிவிப்பை அனுப்பவும்"}.
{"Send announcement to all users","அனைத்து பயனர்களுக்கும் அறிவிப்பை அனுப்பவும்"}.
{"September","ஆ-புரட்டாசி"}.
{"Server:","சேவையகம்:"}.
{"Service list retrieval timed out","பணி பட்டியல் மீட்டெடுப்பு நேரம் முடிந்தது"}.
{"Session state copying timed out","அமர்வு நிலை நகலெடுக்கும் நேரம் முடிந்தது"}.
{"Set message of the day and send to online users","அன்றைய செய்தியை அமைத்து நிகழ்நிலை பயனர்களுக்கு அனுப்பவும்"}.
{"Set message of the day on all hosts and send to online users","அனைத்து ஓச்ட்களிலும் அன்றைய செய்தியை அமைத்து நிகழ்நிலை பயனர்களுக்கு அனுப்பவும்"}.
{"Shared Roster Groups","பகிரப்பட்ட பட்டியல் குழுக்கள்"}.
{"Show Integral Table","ஒருங்கிணைந்த அட்டவணையைக் காட்டு"}.
{"Show Occupants Join/Leave","காட்டு குடியிருப்பாளர்கள் சேர/விடுகிறார்கள்"}.
{"Show Ordinary Table","சாதாரண அட்டவணையைக் காட்டு"}.
{"Shut Down Service","சேவையை மூடு"}.
{"SOCKS5 Bytestreams","SOCKS5 BYTESTREAMS"}.
{"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","சில எக்ச்எம்பிபி வாடிக்கையாளர்கள் உங்கள் கடவுச்சொல்லை கணினியில் சேமிக்க முடியும், ஆனால் பாதுகாப்பு காரணங்களுக்காக இதை உங்கள் தனிப்பட்ட கணினியில் மட்டுமே செய்ய வேண்டும்."}.
{"Sources Specs:","ஆதார விவரக்குறிப்புகள்:"}.
{"Specify the access model","அணுகல் மாதிரியைக் குறிப்பிடவும்"}.
{"Specify the event message type","நிகழ்வு செய்தி வகையைக் குறிப்பிடவும்"}.
{"Specify the publisher model","வெளியீட்டாளர் மாதிரியைக் குறிப்பிடவும்"}.
{"Stanza id is not valid","முடிப்பு ஐடி செல்லுபடியாகாது"}.
{"Stanza ID","முடிப்பு"}.
{"Statically specify a replyto of the node owner(s)","முனை உரிமையாளரின் (கள்) ஒரு பதிலை நிலையான முறையில் குறிப்பிடவும்"}.
{"Stopped Nodes","நிறுத்தப்பட்ட முனைகள்"}.
{"Store binary backup:","பைனரி காப்புப்பிரதியை சேமிக்கவும்:"}.
{"Store plain text backup:","எளிய உரை காப்புப்பிரதியை சேமிக்கவும்:"}.
{"Stream management is already enabled","ச்ட்ரீம் மேலாண்மை ஏற்கனவே இயக்கப்பட்டது"}.
{"Stream management is not enabled","ச்ட்ரீம் மேலாண்மை இயக்கப்படவில்லை"}.
{"Subject","பொருள்"}.
{"Submitted","சமர்ப்பிக்கப்பட்டது"}.
{"Subscriber Address","சந்தாதாரர் முகவரி"}.
{"Subscribers may publish","சந்தாதாரர்கள் வெளியிடலாம்"}.
{"Subscription requests must be approved and only subscribers may retrieve items","சந்தா கோரிக்கைகள் அங்கீகரிக்கப்பட வேண்டும் மற்றும் சந்தாதாரர்கள் மட்டுமே உருப்படிகளை மீட்டெடுக்க முடியும்"}.
{"Subscriptions are not allowed","சந்தாக்கள் அனுமதிக்கப்படவில்லை"}.
{"Sunday","ஞாயிற்றுக்கிழமை"}.
{"Text associated with a picture","ஒரு படத்துடன் தொடர்புடைய உரை"}.
{"Text associated with a sound","ஒலி ஒரு ஒலியுடன் தொடர்புடையது"}.
{"Text associated with a video","வீடியோவுடன் தொடர்புடைய உரை"}.
{"Text associated with speech","பேச்சுடன் தொடர்புடைய உரை"}.
{"That nickname is already in use by another occupant","அந்த புனைப்பெயர் ஏற்கனவே மற்றொரு குடியிருப்பாளரால் பயன்பாட்டில் உள்ளது"}.
{"That nickname is registered by another person","அந்த புனைப்பெயர் மற்றொரு நபரால் பதிவு செய்யப்பட்டுள்ளது"}.
{"The account already exists","கணக்கு ஏற்கனவே உள்ளது"}.
{"The account was not unregistered","கணக்கு பதிவு செய்யப்படவில்லை"}.
{"The body text of the last received message","கடைசியாக பெறப்பட்ட செய்தியின் உடல் உரை"}.
{"The CAPTCHA is valid.","கேப்ட்சா செல்லுபடியாகும்."}.
{"The CAPTCHA verification has failed","கேப்ட்சா சரிபார்ப்பு தோல்வியுற்றது"}.
{"The captcha you entered is wrong","நீங்கள் உள்ளிட்ட கேப்ட்சா தவறு"}.
{"The child nodes (leaf or collection) associated with a collection","சேகரிப்புடன் தொடர்புடைய குழந்தை முனைகள் (இலை அல்லது சேகரிப்பு)"}.
{"The collections with which a node is affiliated","ஒரு முனை இணைக்கப்பட்ட தொகுப்புகள்"}.
{"The DateTime at which a leased subscription will end or has ended","குத்தகைக்கு விடப்பட்ட சந்தா முடிவடையும் அல்லது முடிவடைந்த தேதிநேரம்"}.
{"The datetime when the node was created","முனை உருவாக்கப்பட்ட தேதிநேரம்"}.
{"The default language of the node","முனையின் இயல்புநிலை மொழி"}.
{"The feature requested is not supported by the conference","கோரப்பட்ட நற்பொருத்தம் மாநாட்டால் ஆதரிக்கப்படவில்லை"}.
{"The JID of the node creator","முனை படைப்பாளரின் சிட்"}.
{"The JIDs of those to contact with questions","கேள்விகளுடன் தொடர்பு கொள்ளுபவர்களின் குழந்தைகள்"}.
{"The JIDs of those with an affiliation of owner","உரிமையாளரின் இணைப்பு உள்ளவர்களின் குழந்தைகள்"}.
{"The JIDs of those with an affiliation of publisher","வெளியீட்டாளரின் இணைப்பு உள்ளவர்களின் குழந்தைகள்"}.
{"The list of all online users","அனைத்து நிகழ்நிலை பயனர்களின் பட்டியல்"}.
{"The list of all users","அனைத்து பயனர்களின் பட்டியல்"}.
{"The list of JIDs that may associate leaf nodes with a collection","இலை முனைகளை ஒரு தொகுப்போடு தொடர்புபடுத்தக்கூடிய JIDS இன் பட்டியல்"}.
{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","ஒரு சேகரிப்புடன் தொடர்புடைய அதிகபட்ச குழந்தை முனைகளின் எண்ணிக்கை, அல்லது அதிகபட்சமாக விதிக்கப்பட்ட சேவையகத்தைத் தவிர வேறு எந்த குறிப்பிட்ட வரம்பும் இல்லாமல் `அதிகபட்சம் '"}.
{"The minimum number of milliseconds between sending any two notification digests","இரண்டு அறிவிப்பு செரிமானங்களையும் அனுப்புவதற்கு இடையில் குறைந்தபட்ச மில்லி விநாடிகளின் எண்ணிக்கை"}.
{"The name of the node","முனையின் பெயர்"}.
{"The node is a collection node","முனை ஒரு சேகரிப்பு முனை"}.
{"The node is a leaf node (default)","முனை ஒரு இலை முனை (இயல்புநிலை)"}.
{"The NodeID of the relevant node","தொடர்புடைய முனையின் நோடிட்"}.
{"The number of pending incoming presence subscription requests","நிலுவையில் உள்ள உள்வரும் இருப்பு சந்தா கோரிக்கைகளின் எண்ணிக்கை"}.
{"The number of subscribers to the node","முனைக்கு சந்தாதாரர்களின் எண்ணிக்கை"}.
{"The number of unread or undelivered messages","படிக்காத அல்லது வழங்கப்படாத செய்திகளின் எண்ணிக்கை"}.
{"The password contains unacceptable characters","கடவுச்சொல்லில் ஏற்றுக்கொள்ள முடியாத எழுத்துக்கள் உள்ளன"}.
{"The password is too weak","கடவுச்சொல் மிகவும் பலவீனமாக உள்ளது"}.
{"the password is","கடவுச்சொல்"}.
{"The password of your XMPP account was successfully changed.","உங்கள் எக்ச்எம்பிபி கணக்கின் கடவுச்சொல் வெற்றிகரமாக மாற்றப்பட்டது."}.
{"The password was not changed","கடவுச்சொல் மாற்றப்படவில்லை"}.
{"The passwords are different","கடவுச்சொற்கள் வேறுபட்டவை"}.
{"The presence states for which an entity wants to receive notifications","ஒரு நிறுவனம் அறிவிப்புகளைப் பெற விரும்பும் இருப்பு நிலைகள்"}.
{"The query is only allowed from local users","வினவல் உள்ளக பயனர்களிடமிருந்து மட்டுமே அனுமதிக்கப்படுகிறது"}.
{"The query must not contain <item/> elements","வினவலில் <பொருள்/> கூறுகள் இருக்கக்கூடாது"}.
{"The room subject can be modified by participants","அறை பொருள் பங்கேற்பாளர்களால் மாற்றப்படலாம்"}.
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","முனையில் உள்ள தரவின் சொற்பொருள் வகை செய்தி, பொதுவாக பேலோடின் பெயர்வெளியால் குறிப்பிடப்படுகிறது (ஏதேனும் இருந்தால்)"}.
{"The sender of the last received message","கடைசியாக பெறப்பட்ட செய்தியை அனுப்பு"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","ச்டான்சாவில் ஒரே <செயலில்/> உறுப்பு, ஒரு <இயல்புநிலை/> உறுப்பு அல்லது ஒரு <பட்டியல்/> உறுப்பு மட்டுமே இருக்க வேண்டும்"}.
{"The subscription identifier associated with the subscription request","சந்தா கோரிக்கையுடன் தொடர்புடைய சந்தா அடையாளங்காட்டி"}.
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","பொருத்தமான செய்தி உடல் உறுப்பை உருவாக்குவதற்காக பேலோடுகளுக்கு பயன்படுத்தக்கூடிய எக்ச்எச்எல் மாற்றத்தின் முகவரி."}.
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","செல்லுபடியாகும் தரவு படிவங்களை உருவாக்குவதற்காக பேலோட் வடிவத்தில் பயன்படுத்தக்கூடிய ஒரு எக்ச்எச்எல் உருமாற்றத்தின் முகவரி, கிளையன்ட் பொதுவான தரவு படிவங்கள் வழங்குதல் எஞ்சின் பயன்படுத்தி காண்பிக்க முடியும்"}.
{"There was an error changing the password: ","கடவுச்சொல்லை மாற்றுவதில் பிழை ஏற்பட்டது: "}.
{"There was an error creating the account: ","கணக்கை உருவாக்கும் பிழை இருந்தது: "}.
{"There was an error deleting the account: ","கணக்கை நீக்குவதில் பிழை ஏற்பட்டது: "}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","இது வழக்கு உணர்வற்றது: மாக்பெத் மற்றும் மாக்பெத் தான்."}.
{"This page allows to register an XMPP account in this XMPP server. Your JID (Jabber ID) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","இந்த XMPP சேவையகத்தில் ஒரு XMPP கணக்கை பதிவு செய்ய இந்த பக்கம் அனுமதிக்கிறது. உங்கள் சிட் (சாபர் ஐடி) படிவமாக இருக்கும்: பயனர்பெயர்@சேவையகம். புலங்களை சரியாக நிரப்ப வழிமுறைகளை கவனமாகப் படியுங்கள்."}.
{"This page allows to unregister an XMPP account in this XMPP server.","இந்த எக்ச்எம்பி.பி சேவையகத்தில் எக்ச்எம்பி.பி கணக்கை பதிவு செய்ய இந்த பக்கம் அனுமதிக்கிறது."}.
{"This room is not anonymous","இந்த அறை அநாமதேயமானது அல்ல"}.
{"This service can not process the address: ~s","இந்த பணி முகவரியை செயலாக்க முடியாது: ~s"}.
{"Thursday","வியாழக்கிழமை"}.
{"Time delay","நேர நேரந்தவறுகை"}.
{"Timed out waiting for stream resumption","ச்ட்ரீம் மறுதொடக்கத்திற்காக காத்திருக்கும் நேரம்"}.
{"To register, visit ~s","பதிவு செய்ய, ~s பார்வையிடவும்"}.
{"To ~ts","~ts K"}.
{"Token TTL","கிள்ளாக்கு டி.டி.எல்"}.
{"Too many active bytestreams","பல செயலில் உள்ள பைட்டிரீம்கள்"}.
{"Too many CAPTCHA requests","பல கேப்ட்சா கோரிக்கைகள்"}.
{"Too many child elements","பல குழந்தை கூறுகள்"}.
{"Too many <item/> elements","பல <உருப்படி/> கூறுகள்"}.
{"Too many <list/> elements","பல <பட்டியல்/> கூறுகள்"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","இந்த ஐபி முகவரியிலிருந்து (~p) பல (~s) தோல்வியுற்ற அங்கீகாரங்கள் ~s. முகவரி UTC இல் தடைசெய்யப்படும்"}.
{"Too many receiver fields were specified","அதிகமான ரிசீவர் புலங்கள் குறிப்பிடப்பட்டன"}.
{"Too many unacked stanzas","பல அறியப்படாத சரணங்கள்"}.
{"Too many users in this conference","இந்த மாநாட்டில் அதிகமான பயனர்கள்"}.
{"Traffic rate limit is exceeded","போக்குவரத்து வீத வரம்பு மீறப்பட்டது"}.
{"~ts's MAM Archive","~ts இன் மாம் காப்பகம்"}.
{"~ts's Offline Messages Queue","~ts இன் இணைப்பில்லாத செய்திகள் வரிசை"}.
{"Tuesday","செவ்வாய்க்கிழமை"}.
{"Unable to generate a CAPTCHA","கேப்ட்சாவை உருவாக்க முடியவில்லை"}.
{"Unable to register route on existing local domain","தற்போதுள்ள உள்ளக களத்தில் வழியை பதிவு செய்ய முடியவில்லை"}.
{"Unauthorized","அங்கீகரிக்கப்படாதது"}.
{"Unexpected action","எதிர்பாராத நடவடிக்கை"}.
{"Unexpected error condition: ~p","எதிர்பாராத பிழை நிலை: ~p"}.
{"Uninstall","நிறுவல் நீக்க"}.
{"Unregister an XMPP account","ஒரு எக்ச்எம்பிபி கணக்கை பதிவு செய்யவும்"}.
{"Unregister","பதிவு செய்யப்படாதது"}.
{"Unsupported <index/> element","ஆதரிக்கப்படாத <குறியீட்டு/> உறுப்பு"}.
{"Unsupported version","ஆதரிக்கப்படாத பதிப்பு"}.
{"Update message of the day (don't send)","அன்றைய செய்தியைப் புதுப்பிக்கவும் (அனுப்ப வேண்டாம்)"}.
{"Update message of the day on all hosts (don't send)","எல்லா ஓச்ட்களிலும் அன்றைய செய்தியைப் புதுப்பிக்கவும் (அனுப்ப வேண்டாம்)"}.
{"Update specs to get modules source, then install desired ones.","தொகுதிகள் மூலத்தைப் பெற விவரக்குறிப்புகளைப் புதுப்பிக்கவும், பின்னர் விரும்பியவற்றை நிறுவவும்."}.
{"Update Specs","விவரக்குறிப்புகளைப் புதுப்பிக்கவும்"}.
{"Updating the vCard is not supported by the vCard storage backend","VCARD ஐப் புதுப்பிப்பது VCARD சேமிப்பக பின்தளத்தில் ஆதரிக்கப்படவில்லை"}.
{"Upgrade","மேம்படுத்தல்"}.
{"URL for Archived Discussion Logs","காப்பகப்படுத்தப்பட்ட கலந்துரையாடல் பதிவுகளுக்கான முகவரி"}.
{"User already exists","பயனர் ஏற்கனவே உள்ளது"}.
{"User (jid)","பயனர் (சிட்)"}.
{"User JID","பயனர் சிட்"}.
{"User Management","பயனர் மேலாண்மை"}.
{"User not allowed to perform an IQ set on another user's vCard.","மற்றொரு பயனரின் VCARD இல் IQ தொகுப்பை செய்ய பயனர் அனுமதிக்கப்படவில்லை."}.
{"User removed","பயனர் அகற்றப்பட்டார்"}.
{"User session not found","பயனர் அமர்வு காணப்படவில்லை"}.
{"User session terminated","பயனர் அமர்வு நிறுத்தப்பட்டது"}.
{"User ~ts","பயனர் ~ts"}.
{"Username:","பயனர்பெயர்:"}.
{"Users are not allowed to register accounts so quickly","பயனர்கள் கணக்குகளை விரைவாக பதிவு செய்ய அனுமதிக்கப்படுவதில்லை"}.
{"Users Last Activity","பயனர்கள் கடைசி செயல்பாடு"}.
{"Users","பயனர்கள்"}.
{"User","பயனர்"}.
{"Value 'get' of 'type' attribute is not allowed","'வகை' பண்புக்கூறின் மதிப்பு 'பெறுதல்' அனுமதிக்கப்படவில்லை"}.
{"Value of '~s' should be boolean","'~s' மதிப்பு பூலியனாக இருக்க வேண்டும்"}.
{"Value of '~s' should be datetime string","'~s' இன் மதிப்பு தேதிநேர சரமாக இருக்க வேண்டும்"}.
{"Value of '~s' should be integer","'~s' இன் மதிப்பு முழு எண்ணாக இருக்க வேண்டும்"}.
{"Value 'set' of 'type' attribute is not allowed","'வகை' பண்புக்கூறின் 'தொகுப்பு' மதிப்பு அனுமதிக்கப்படவில்லை"}.
{"vCard User Search","VCARD பயனர் தேடல்"}.
{"View joined MIX channels","கலப்பு சேனல்களில் சேர்ந்தார்"}.
{"Virtual Hosts","மெய்நிகர் ஓச்ட்கள்"}.
{"Visitors are not allowed to change their nicknames in this room","இந்த அறையில் பார்வையாளர்கள் தங்கள் புனைப்பெயர்களை மாற்ற அனுமதிக்கப்படுவதில்லை"}.
{"Visitors are not allowed to send messages to all occupants","பார்வையாளர்கள் அனைத்து குடியிருப்பாளர்களுக்கும் செய்திகளை அனுப்ப அனுமதிக்கப்படுவதில்லை"}.
{"Visitor","பார்வையாளர்"}.
{"Voice requests are disabled in this conference","இந்த மாநாட்டில் குரல் கோரிக்கைகள் முடக்கப்பட்டுள்ளன"}.
{"Voice request","குரல் கோரிக்கை"}.
{"Wednesday","புதன்கிழமை"}.
{"When a new subscription is processed and whenever a subscriber comes online","புதிய சந்தா செயலாக்கப்படும் போது, சந்தாதாரர் ஆன்லைனில் வரும்போதெல்லாம்"}.
{"When a new subscription is processed","புதிய சந்தா செயலாக்கப்படும் போது"}.
{"When to send the last published item","கடைசியாக வெளியிடப்பட்ட உருப்படியை எப்போது அனுப்ப வேண்டும்"}.
{"Whether an entity wants to receive an XMPP message body in addition to the payload format","ஒரு நிறுவனம் பேலோட் வடிவமைப்பிற்கு கூடுதலாக ஒரு எக்ச்எம்பிபி செய்தி உடலைப் பெற விரும்புகிறதா என்பதை"}.
{"Whether an entity wants to receive digests (aggregations) of notifications or all notifications individually","ஒரு நிறுவனம் அறிவிப்புகளின் செரிமானங்களை (திரட்டல்கள்) பெற விரும்புகிறதா அல்லது அனைத்து அறிவிப்புகளையும் தனித்தனியாகப் பெற விரும்புகிறதா"}.
{"Whether an entity wants to receive or disable notifications","ஒரு நிறுவனம் அறிவிப்புகளைப் பெற விரும்புகிறதா அல்லது முடக்க விரும்புகிறதா"}.
{"Whether owners or publisher should receive replies to items","உரிமையாளர்கள் அல்லது வெளியீட்டாளர் உருப்படிகளுக்கான பதில்களைப் பெற வேண்டுமா"}.
{"Whether the node is a leaf (default) or a collection","முனை ஒரு இலை (இயல்புநிலை) அல்லது தொகுப்பாக இருந்தாலும் சரி"}.
{"Whether to allow subscriptions","சந்தாக்களை அனுமதிக்க வேண்டுமா"}.
{"Whether to make all subscriptions temporary, based on subscriber presence","அனைத்து சந்தாக்களையும் தற்காலிகமாக மாற்றலாமா, சந்தாதாரர் இருப்பின் அடிப்படையில்"}.
{"Whether to notify owners about new subscribers and unsubscribes","புதிய சந்தாதாரர்கள் மற்றும் குழுவிலகங்களைப் பற்றி உரிமையாளர்களுக்கு அறிவிக்க வேண்டுமா"}.
{"Who can send private messages","தனிப்பட்ட செய்திகளை யார் அனுப்ப முடியும்"}.
{"Who may associate leaf nodes with a collection","இலை முனைகளை யார் சேகரிப்புடன் தொடர்புபடுத்தலாம்"}.
{"Wrong parameters in the web formulary","வலை சூத்திரத்தில் தவறான அளவுருக்கள்"}.
{"Wrong xmlns","தவறான xmlns"}.
{"XMPP Account Registration","எக்ச்எம்பிபி கணக்கு பதிவு"}.
{"XMPP Domains","எக்ச்எம்பிபி களங்கள்"}.
{"XMPP Show Value of Away","எக்ச்எம்பிபி சோ மதிப்பைக் காட்டுகிறது"}.
{"XMPP Show Value of Chat","எக்ச்எம்பிபி அரட்டையின் மதிப்பைக் காட்டுகிறது"}.
{"XMPP Show Value of DND (Do Not Disturb)","எக்ச்எம்பிபி டி.என்.டி யின் மதிப்பைக் காட்டுகிறது (தொந்தரவு செய்யாதீர்கள்)"}.
{"XMPP Show Value of XA (Extended Away)","XMPP XA இன் மதிப்பைக் காட்டுகிறது (நீட்டிக்கப்பட்டது)"}.
{"XMPP URI of Associated Publish-Subscribe Node","அசோசியேட்டட் பப்ளிச்-சப்ச்கிரிப்ட் முனையின் எக்ச்எம்பிபி யுஆர்ஐ"}.
{"You are being removed from the room because of a system shutdown","கணினி பணிநிறுத்தம் காரணமாக நீங்கள் அறையிலிருந்து அகற்றப்படுகிறீர்கள்"}.
{"You are not allowed to send private messages","தனிப்பட்ட செய்திகளை அனுப்ப உங்களுக்கு இசைவு இல்லை"}.
{"You are not joined to the channel","நீங்கள் சேனலுடன் சேரவில்லை"}.
{"You can later change your password using an XMPP client.","எக்ச்எம்பிபி கிளையண்டைப் பயன்படுத்தி உங்கள் கடவுச்சொல்லை பின்னர் மாற்றலாம்."}.
{"You have been banned from this room","இந்த அறையிலிருந்து நீங்கள் தடை செய்யப்பட்டுள்ளீர்கள்"}.
{"You have joined too many conferences","நீங்கள் பல மாநாடுகளில் சேர்ந்துள்ளீர்கள்"}.
{"You must fill in field \"Nickname\" in the form","நீங்கள் வடிவத்தில் புலம் \"புனைப்பெயரை\" நிரப்ப வேண்டும்"}.
{"You need a client that supports x:data and CAPTCHA to register","எக்ச்: தரவு மற்றும் கேப்ட்சா பதிவு செய்ய உங்களுக்கு ஒரு வாங்கி தேவை"}.
{"You need a client that supports x:data to register the nickname","புனைப்பெயரை பதிவு செய்ய எக்ச்: தரவை ஆதரிக்கும் வாங்கி உங்களுக்குத் தேவை"}.
{"You need an x:data capable client to search","தேட உங்களுக்கு ஒரு ஃச் தேவை: தேட தரவு திறன் கொண்ட வாங்கி"}.
{"Your active privacy list has denied the routing of this stanza.","உங்கள் செயலில் உள்ள தனியுரிமை பட்டியல் இந்த சரணத்தை வழிநடத்துவதை மறுத்துள்ளது."}.
{"Your contact offline message queue is full. The message has been discarded.","உங்கள் தொடர்பு இணைப்பில்லாத செய்தி வரிசை நிரம்பியுள்ளது. செய்தி நிராகரிக்கப்பட்டுள்ளது."}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","உங்கள் சந்தா கோரிக்கை மற்றும்/அல்லது செய்திகளுக்கான செய்திகள் தடுக்கப்பட்டுள்ளன ~s. உங்கள் சந்தா கோரிக்கையைத் தடுக்க, ~s கள் பார்வையிடவும்"}.
{"Your XMPP account was successfully registered.","உங்கள் எக்ச்எம்பிபி கணக்கு வெற்றிகரமாக பதிவு செய்யப்பட்டது."}.
{"Your XMPP account was successfully unregistered.","உங்கள் எக்ச்எம்பிபி கணக்கு வெற்றிகரமாக பதிவு செய்யப்படவில்லை."}.
{"You're not allowed to create nodes","முனைகளை உருவாக்க உங்களுக்கு இசைவு இல்லை"}.
+95 -1
View File
@@ -46,7 +46,9 @@
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Будь-хто, хто має підписку на отримання інформації про присутність в обох випадках або може підписуватись та отримувати матеріали"}.
{"Anyone with Voice","Будь-хто, хто має голос"}.
{"Anyone","Будь-хто"}.
{"API Commands","Команди API"}.
{"April","Квітень"}.
{"Arguments","Аргументи"}.
{"Attribute 'channel' is required for this request","Атрибут \"канал\" є обов'язковим для цього запиту"}.
{"Attribute 'id' is mandatory for MIX messages","Атрибут 'id' обов'язковий для MIX повідомлень"}.
{"Attribute 'jid' is not allowed here","Атрибут 'jid' заборонений"}.
@@ -86,6 +88,7 @@
{"Choose whether to approve this entity's subscription.","Виберіть, чи підтверджувати підписку."}.
{"City","Місто"}.
{"Client acknowledged more stanzas than sent by server","Клієнт підтвердив більше повідомлень, ніж було відправлено сервером"}.
{"Clustering","Кластеризація"}.
{"Commands","Команди"}.
{"Conference room does not exist","Кімната для переговорів відсутня"}.
{"Configuration of room ~s","Конфігурація кімнати ~s"}.
@@ -108,6 +111,7 @@
{"Dump Backup to Text File at ","Копіювання в текстовий файл на "}.
{"Dump to Text File","Копіювання в текстовий файл"}.
{"Duplicated groups are not allowed by RFC6121","RFC6121 забороняє дублювати групи"}.
{"Dynamically specify a replyto of the item publisher","Динамічно вказуйте відповідь видавця елемента"}.
{"Edit Properties","Змінити параметри"}.
{"Either approve or decline the voice request.","Підтвердіть або відхиліть голосовий запит."}.
{"ejabberd HTTP Upload service","Служба відвантаження по HTTP для ejabberd"}.
@@ -123,6 +127,7 @@
{"Enable hats","Увімкнути капелюхи"}.
{"Enable logging","Увімкнути журнал роботи"}.
{"Enable message archiving","Ввімкнути архівацію повідомлень"}.
{"Enabling push without 'node' attribute is not supported","Увімкнення push без атрибута node не підтримується"}.
{"End User Session","Закінчити Сеанс Користувача"}.
{"Enter nickname you want to register","Введіть псевдонім, який ви хочете зареєструвати"}.
{"Enter path to backup file","Введіть шлях до резервного файла"}.
@@ -166,6 +171,7 @@
{"has been kicked because of an affiliation change","вигнано з кімнати внаслідок зміни рангу"}.
{"has been kicked because the room has been changed to members-only","вигнано з кімнати тому, що вона стала тільки для учасників"}.
{"has been kicked","вигнали з кімнати"}.
{"Hash of the vCard-temp avatar of this room","Хеш тимчасового аватара vCard цієї кімнати"}.
{"Hat title","Назва кімнати"}.
{"Hat URI","Назва URI"}.
{"Hats limit exceeded","Перевищено швидкість передачі інформації"}.
@@ -206,6 +212,8 @@
{"January","січня"}.
{"JID normalization denied by service policy","Створювати конференцію заборонено політикою служби"}.
{"JID normalization failed","Помилка нормалізації JID"}.
{"Joined MIX channels of ~ts","Приєднався до каналів MIX ~ts"}.
{"Joined MIX channels:","Приєднався до каналів MIX:"}.
{"joins the room","увійшов(ла) в кімнату"}.
{"July","липня"}.
{"June","червня"}.
@@ -219,10 +227,11 @@
{"leaves the room","вийшов(ла) з кімнати"}.
{"List of users with hats","Список користувачів із капелюхами"}.
{"List users with hats","Список користувачів із капелюхами"}.
{"Logged Out","Вийшов із системи"}.
{"Logging","Журналювання"}.
{"Make participants list public","Зробити список учасників видимим всім"}.
{"Make room CAPTCHA protected","Зробити кімнату захищеною капчею"}.
{"Make room members-only","Кімната тільки для зареєтрованых учасників"}.
{"Make room members-only","Кімната тільки для зареєтрованих учасників"}.
{"Make room moderated","Зробити кімнату модерованою"}.
{"Make room password protected","Зробити кімнату захищеною паролем"}.
{"Make room persistent","Зробити кімнату постійною"}.
@@ -382,12 +391,19 @@
{"RAM copy","Копія оперативної пам'яті"}.
{"Really delete message of the day?","Дійсно видалити повідомлення дня?"}.
{"Receive notification from all descendent nodes","Отримувати сповіщення від усіх підпорядкованих вузлів"}.
{"Receive notification from direct child nodes only","Отримувати сповіщення лише від прямих дочірніх вузлів"}.
{"Receive notification of new items only","Отримувати сповіщення лише про нові товари"}.
{"Receive notification of new nodes only","Отримувати сповіщення лише про нові вузли"}.
{"Recipient is not in the conference room","Адресата немає в конференції"}.
{"Register an XMPP account","Зареєструвати XMPP-запис"}.
{"Register","Реєстрація"}.
{"Remote copy","не зберігаеться локально"}.
{"Remove a hat from a user","Зняти шапку з користувача"}.
{"Remove User","Видалити користувача"}.
{"Replaced by new connection","Замінено новим з'єднанням"}.
{"Request has timed out","Час очікування запиту минув"}.
{"Request is ignored","Запит ігнорується"}.
{"Requested role","Запитана роль"}.
{"Resources","Ресурси"}.
{"Restart Service","Перезапустити Сервіс"}.
{"Restore Backup from File at ","Відновлення з резервної копії на "}.
@@ -395,6 +411,8 @@
{"Restore binary backup immediately:","Відновити з бінарної резервної копії негайно:"}.
{"Restore plain text backup immediately:","Відновити з текстової резервної копії негайно:"}.
{"Restore","Відновлення з резервної копії"}.
{"Result","Результат"}.
{"Roles and Affiliations that May Retrieve Member List","Ролі та зв’язки, які можуть отримати список учасників"}.
{"Roles for which Presence is Broadcasted","Ролі для яких поширюється наявність"}.
{"Roles that May Send Private Messages","Ролі, що можуть надсилати приватні повідомлення"}.
{"Room Configuration","Конфігурація кімнати"}.
@@ -408,7 +426,10 @@
{"Running Nodes","Працюючі вузли"}.
{"~s invites you to the room ~s","~s запрошує вас до кімнати ~s"}.
{"Saturday","Субота"}.
{"Search from the date","Пошук від дати"}.
{"Search Results for ","Результати пошуку в "}.
{"Search the text","Знайдіть текст"}.
{"Search until the date","Пошук до дати"}.
{"Search users in ","Пошук користувачів в "}.
{"Send announcement to all online users on all hosts","Надіслати сповіщення всім підключеним користувачам на всіх віртуальних серверах"}.
{"Send announcement to all online users","Надіслати сповіщення всім підключеним користувачам"}.
@@ -416,42 +437,94 @@
{"Send announcement to all users","Надіслати сповіщення всім користувачам"}.
{"September","вересня"}.
{"Server:","Сервер:"}.
{"Service list retrieval timed out","Час очікування отримання списку послуг минув"}.
{"Session state copying timed out","Час очікування копіювання стану сеансу минув"}.
{"Set message of the day and send to online users","Встановити повідомлення дня та надіслати його підключеним користувачам"}.
{"Set message of the day on all hosts and send to online users","Встановити повідомлення дня на всіх хостах та надійслати його підключеним користувачам"}.
{"Shared Roster Groups","Спільні групи контактів"}.
{"Show Integral Table","Показати інтегральну таблицю"}.
{"Show Occupants Join/Leave","Показати мешканцям приєднатися/вийти"}.
{"Show Ordinary Table","Показати звичайну таблицю"}.
{"Shut Down Service","Вимкнути Сервіс"}.
{"SOCKS5 Bytestreams","Потоки байтів SOCKS5"}.
{"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Деякі клієнти XMPP можуть зберігати ваш пароль на комп’ютері, але ви повинні робити це лише на своєму персональному комп’ютері з міркувань безпеки."}.
{"Sources Specs:","Специфікації джерел:"}.
{"Specify the access model","Визначити модель доступу"}.
{"Specify the event message type","Вкажіть тип повідомлень зі сповіщеннями про події"}.
{"Specify the publisher model","Умови публікації"}.
{"Stanza id is not valid","Ідентифікатор строфи недійсний"}.
{"Stanza ID","ID кімнати"}.
{"Statically specify a replyto of the node owner(s)","Статично вкажіть відповідь власника(ів) вузла"}.
{"Stopped Nodes","Зупинені вузли"}.
{"Store binary backup:","Зберегти бінарну резервну копію:"}.
{"Store plain text backup:","Зберегти текстову резервну копію:"}.
{"Stream management is already enabled","Керування потоком уже ввімкнено"}.
{"Stream management is not enabled","Керування потоком не ввімкнено"}.
{"Subject","Тема"}.
{"Submitted","Відправлено"}.
{"Subscriber Address","Адреса абонента"}.
{"Subscribers may publish","Підписники можуть публікувати"}.
{"Subscription requests must be approved and only subscribers may retrieve items","Запити на підписку мають бути схвалені, і лише передплатники можуть отримувати елементи"}.
{"Subscriptions are not allowed","Підписка заборонена"}.
{"Sunday","Неділя"}.
{"Text associated with a picture","Текст, пов'язаний із зображенням"}.
{"Text associated with a sound","Текст, пов'язаний зі звуком"}.
{"Text associated with a video","Текст, пов’язаний із відео"}.
{"Text associated with speech","Текст, пов'язаний з мовленням"}.
{"That nickname is already in use by another occupant","Псевдонім зайнято кимось з присутніх"}.
{"That nickname is registered by another person","Псевдонім зареєстровано кимось іншим"}.
{"The account already exists","Обліковий запис уже існує"}.
{"The account was not unregistered","Обліковий запис не було видалено"}.
{"The body text of the last received message","Основний текст останнього отриманого повідомлення"}.
{"The CAPTCHA is valid.","Перевірку CAPTCHA успішно завершено."}.
{"The CAPTCHA verification has failed","Перевірку капчею не пройдено"}.
{"The captcha you entered is wrong","Captcha, яку ви ввели, неправильна"}.
{"The child nodes (leaf or collection) associated with a collection","Дочірні вузли (лист або колекція), пов’язані з колекцією"}.
{"The collections with which a node is affiliated","Колекція, до якої входить вузол"}.
{"The DateTime at which a leased subscription will end or has ended","DateTime, коли орендована підписка закінчиться або закінчилася"}.
{"The datetime when the node was created","Дата і час створення вузла"}.
{"The default language of the node","Мова вузла за замовчуванням"}.
{"The feature requested is not supported by the conference","Запитана функція не підтримується конференцією"}.
{"The JID of the node creator","JID творця вузла"}.
{"The JIDs of those to contact with questions","JID тих, до кого можна звернутися із запитаннями"}.
{"The JIDs of those with an affiliation of owner","JID тих, хто є афілійованим власником"}.
{"The JIDs of those with an affiliation of publisher","JID тих, хто пов’язаний із видавцем"}.
{"The list of all online users","Список усіх онлайн-користувачів"}.
{"The list of all users","Список усіх користувачів"}.
{"The list of JIDs that may associate leaf nodes with a collection","Список JID, які можуть пов’язувати листові вузли з колекцією"}.
{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","Максимальна кількість дочірніх вузлів, які можна пов’язати з колекцією, або `max` для відсутності конкретного обмеження, окрім максимального накладеного сервером"}.
{"The minimum number of milliseconds between sending any two notification digests","Мінімальна кількість мілісекунд між надсиланням будь-яких двох дайджестів сповіщень"}.
{"The name of the node","Ім'я вузла"}.
{"The node is a collection node","Вузол є вузлом колекції"}.
{"The node is a leaf node (default)","Вузол є листовим вузлом (за замовчуванням)"}.
{"The NodeID of the relevant node","NodeID відповідного вузла"}.
{"The number of pending incoming presence subscription requests","Кількість вхідних запитів на підписку про присутність, що очікують на розгляд"}.
{"The number of subscribers to the node","Кількість передплатників вузла"}.
{"The number of unread or undelivered messages","Кількість непрочитаних або недоставлених повідомлень"}.
{"The password contains unacceptable characters","Пароль містить неприйнятні символи"}.
{"The password is too weak","Пароль надто простий"}.
{"the password is","паролем є"}.
{"The password of your XMPP account was successfully changed.","Пароль вашого облікового запису XMPP успішно змінено."}.
{"The password was not changed","Пароль не змінено"}.
{"The passwords are different","Паролі різні"}.
{"The presence states for which an entity wants to receive notifications","Стан присутності, для якого сутність хоче отримувати сповіщення"}.
{"The query is only allowed from local users","Запит дозволено лише від локальних користувачів"}.
{"The query must not contain <item/> elements","Запит не повинен містити елементів <item/>"}.
{"The room subject can be modified by participants","Тема кімнати може бути змінена учасниками"}.
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","Інформація про семантичний тип даних у вузлі, зазвичай визначена простором імен корисного навантаження (якщо є)"}.
{"The sender of the last received message","Відправник останнього отриманого повідомлення"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Строфа ПОВИННА містити лише один елемент <active/>, один елемент <default/> або один елемент <list/>"}.
{"The subscription identifier associated with the subscription request","Ідентифікатор підписки, пов’язаний із запитом на підписку"}.
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","URL-адреса перетворення XSL, яке можна застосувати до корисних даних, щоб створити відповідний елемент тіла повідомлення."}.
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","URL-адреса трансформації XSL, яку можна застосувати до формату корисного навантаження, щоб створити дійсний результат форм даних, який клієнт міг би відобразити за допомогою загального механізму візуалізації форм даних"}.
{"There was an error changing the password: ","Помилка при зміні пароля: "}.
{"There was an error creating the account: ","Помилка при створенні облікового запису: "}.
{"There was an error deleting the account: ","Помилка при видаленні акаунту: "}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Тут не враховується регістр: Макбет – це те саме, що Макбет і Макбет."}.
{"This page allows to register an XMPP account in this XMPP server. Your JID (Jabber ID) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Ця сторінка дозволяє зареєструвати обліковий запис XMPP на цьому сервері XMPP. Ваш JID (Jabber ID) матиме такий вигляд: ім’я користувача@сервер. Уважно прочитайте інструкції, щоб правильно заповнити поля."}.
{"This page allows to unregister an XMPP account in this XMPP server.","Ця сторінка дозволяє видалити свій обліковий запис з XMPP-сервера."}.
{"This room is not anonymous","Ця кімната не анонімна"}.
{"This service can not process the address: ~s","Ця служба не може обробити адресу: ~s"}.
{"Thursday","Четвер"}.
{"Time delay","Час затримки"}.
{"Timed out waiting for stream resumption","Час очікування на відновлення потоку закінчився"}.
@@ -468,6 +541,7 @@
{"Too many unacked stanzas","Занадто багато пакетів без відповідей"}.
{"Too many users in this conference","Надто багато користувачів у цій конференції"}.
{"Traffic rate limit is exceeded","Швидкість передачі інформації було перевищено"}.
{"~ts's MAM Archive","Архів МАМ ~ts"}.
{"~ts's Offline Messages Queue","Черга автономних повідомлень ~ts"}.
{"Tuesday","Вівторок"}.
{"Unable to generate a CAPTCHA","Нема можливості згенерувати капчу"}.
@@ -475,17 +549,23 @@
{"Unauthorized","Не авторизовано"}.
{"Unexpected action","Несподівана дія"}.
{"Unexpected error condition: ~p","Умова несподіваної помилки: ~p"}.
{"Uninstall","Видалити"}.
{"Unregister an XMPP account","Видалити обліковий запис XMPP"}.
{"Unregister","Видалити"}.
{"Unsupported <index/> element","Непідтримуваний елемент <index/>"}.
{"Unsupported version","Непідтримувана версія"}.
{"Update message of the day (don't send)","Оновити повідомлення дня (не надсилати)"}.
{"Update message of the day on all hosts (don't send)","Оновити повідомлення дня на всіх хостах (не надсилати)"}.
{"Update specs to get modules source, then install desired ones.","Оновіть специфікації, щоб отримати джерело модулів, а потім встановіть потрібні."}.
{"Update Specs","Оновити характеристики"}.
{"Updating the vCard is not supported by the vCard storage backend","Оновлення vCard не підтримується системою зберігання vCard"}.
{"Upgrade","Оновлення"}.
{"URL for Archived Discussion Logs","URL-адреса для журналів архівних обговорень"}.
{"User already exists","Користувач уже існує"}.
{"User JID","JID Користувача"}.
{"User (jid)","Користувач (jid)"}.
{"User Management","Управління Користувачами"}.
{"User not allowed to perform an IQ set on another user's vCard.","Користувачеві заборонено виконувати тест IQ на vCard іншого користувача."}.
{"User removed","Користувача видалено"}.
{"User session not found","Сеанс користувача не знайдено"}.
{"User session terminated","Сеанс користувача припинено"}.
@@ -495,31 +575,45 @@
{"Users Last Activity","Статистика останнього підключення користувачів"}.
{"Users","Користувачі"}.
{"User","Користувач"}.
{"Value 'get' of 'type' attribute is not allowed","Значення 'get' атрибута 'type' не дозволене"}.
{"Value of '~s' should be boolean","Значення \"~s\" має бути логічним"}.
{"Value of '~s' should be datetime string","Значення \"~s\" має бути рядком дати і часу"}.
{"Value of '~s' should be integer","Значення \"~s\" має бути цілим числом"}.
{"Value 'set' of 'type' attribute is not allowed","Значення 'set' атрибута 'type' не допускається"}.
{"vCard User Search","Пошук користувачів по vCard"}.
{"View joined MIX channels","Перегляд приєднаних каналів MIX"}.
{"Virtual Hosts","віртуальні хости"}.
{"Visitors are not allowed to change their nicknames in this room","Відвідувачам не дозволяється змінювати псевдонім в цій кімнаті"}.
{"Visitors are not allowed to send messages to all occupants","Відвідувачам не дозволяється надсилати повідомлення всім присутнім"}.
{"Visitor","Відвідувач"}.
{"Voice requests are disabled in this conference","Голосові запити відключені в цій конференції"}.
{"Voice request","Голосовий запит"}.
{"Web client which allows to join the room anonymously","Веб-клієнт, який дозволяє анонімно приєднатися до кімнати"}.
{"Wednesday","Середа"}.
{"When a new subscription is processed and whenever a subscriber comes online","Коли обробляється нова підписка та щоразу, коли абонент виходить в Інтернет"}.
{"When a new subscription is processed","Під час обробки нової підписки"}.
{"When to send the last published item","Коли надсилати останній опублікований елемент"}.
{"Whether an entity wants to receive an XMPP message body in addition to the payload format","Чи бажає суб’єкт отримувати тіло повідомлення XMPP на додаток до формату корисного навантаження"}.
{"Whether an entity wants to receive digests (aggregations) of notifications or all notifications individually","Чи бажає організація отримувати дайджести (агрегації) сповіщень чи всі сповіщення окремо"}.
{"Whether an entity wants to receive or disable notifications","Чи бажає суб’єкт отримувати або вимикати сповіщення"}.
{"Whether owners or publisher should receive replies to items","Чи повинні власники або видавець отримувати відповіді на елементи"}.
{"Whether the node is a leaf (default) or a collection","Чи є вузол листом (типово) чи колекцією"}.
{"Whether to allow subscriptions","Дозволяти підписку"}.
{"Whether to make all subscriptions temporary, based on subscriber presence","Чи робити всі підписки тимчасовими, залежно від присутності читача"}.
{"Whether to notify owners about new subscribers and unsubscribes","Чи повідомляти власників про нових читачів та їх втрату"}.
{"Who can send private messages","Хто може надсилати приватні повідомлення"}.
{"Who may associate leaf nodes with a collection","Хто може пов’язувати листові вузли з колекцією"}.
{"Wrong parameters in the web formulary","Неправильні параметри у веб-формі"}.
{"Wrong xmlns","Неправильний xmlns"}.
{"XMPP Account Registration","Реєстрація облікового запису XMPP"}.
{"XMPP Domains","Домени XMPP"}.
{"XMPP Show Value of Away","XMPP Показати значення Away"}.
{"XMPP Show Value of Chat","XMPP Показати значення чату"}.
{"XMPP Show Value of DND (Do Not Disturb)","XMPP Показати значення DND (Не турбувати)"}.
{"XMPP Show Value of XA (Extended Away)","XMPP Показати значення XA (розширено)"}.
{"XMPP URI of Associated Publish-Subscribe Node","XMPP URI-адреса асоційованого вузла публікацій-підписок"}.
{"You are being removed from the room because of a system shutdown","Ви будете видалені з кімнати через завершення роботи системи"}.
{"You are not allowed to send private messages","Ви не можете надсилати приватні повідомлення"}.
{"You are not joined to the channel","Ви не приєднані до каналу"}.
{"You can later change your password using an XMPP client.","Пізніше ви можете змінити пароль за допомогою XMPP-клієнта."}.
{"You have been banned from this room","Вам заборонено входити в цю конференцію"}.
+272 -261
View File
@@ -4,11 +4,11 @@
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
{" (Add * to the end of field to match substring)"," (在字段末尾添加 * 以匹配子字符串)"}.
{" has set the subject to: "," 已将题设置为: "}.
{" has set the subject to: "," 已将题设置为: "}.
{"# participants","# 参与者"}.
{"A description of the node","节点的描述"}.
{"A friendly name for the node","节点的易记名称"}.
{"A password is required to enter this room","进入此群聊需要密码"}.
{"A friendly name for the node","节点的友好名称"}.
{"A password is required to enter this room","需要密码才能进入此房间"}.
{"A Web Page","网页"}.
{"Accept","接受"}.
{"Access denied by service policy","服务策略拒绝访问"}.
@@ -23,30 +23,32 @@
{"All activity","所有活动"}.
{"All Users","所有用户"}.
{"Allow subscription","允许订阅"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","允许此 Jabber ID 订阅此 pubsub 节点?"}.
{"Allow this person to register with the room?","允许此用户注册此群聊"}.
{"Allow users to change the subject","允许用户更改题"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","是否允许此 Jabber ID 订阅此 pubsub 节点?"}.
{"Allow this person to register with the room?","是否允许此用户在房间注册?"}.
{"Allow users to change the subject","允许用户更改题"}.
{"Allow users to query other users","允许用户查询其他用户"}.
{"Allow users to send invites","允许用户发送邀请"}.
{"Allow users to send private messages","允许用户发送私信"}.
{"Allow visitors to change nickname","允许访客更改昵称"}.
{"Allow visitors to send private messages to","允许访客发送私信至"}.
{"Allow visitors to send status text in presence updates","允许访客在在线状态更新中发送状态文本"}.
{"Allow visitors to send voice requests","允许访客发送发言请求"}.
{"An associated LDAP group that defines room membership; this should be an LDAP Distinguished Name according to an implementation-specific or deployment-specific definition of a group.","与定义群聊成员资格相关联的 LDAP 组;按群组特定于实现或特定部署的定义,应该是一个 LDAP 专有名称。"}.
{"Allow visitors to change nickname","允许参观者更改昵称"}.
{"Allow visitors to send private messages to","允许参观者发送私信至"}.
{"Allow visitors to send status text in presence updates","允许参观者在在线状态更新中发送状态文本"}.
{"Allow visitors to send voice requests","允许参观者发送发言请求"}.
{"An associated LDAP group that defines room membership; this should be an LDAP Distinguished Name according to an implementation-specific or deployment-specific definition of a group.","与定义房间成员资格相关联的 LDAP 组;根据组的特定实施或特定部署的定义,使用 LDAP 专有名称。"}.
{"Announcements","公告"}.
{"Answer associated with a picture","与图片相关的答案"}.
{"Answer associated with a video","与视频相关的答案"}.
{"Answer associated with speech","与讲话相关的答案"}.
{"Answer to a question","问题的答案"}.
{"Anyone in the specified roster group(s) may subscribe and retrieve items","指定名册组中的可以订阅检索内容项"}.
{"Anyone may associate leaf nodes with the collection","任何人都可以将叶节点与集合关联"}.
{"Anyone in the specified roster group(s) may subscribe and retrieve items","指定名册组中的任何人都可以订阅检索项"}.
{"Anyone may associate leaf nodes with the collection","任何人都可以将叶节点与集合关联"}.
{"Anyone may publish","任何人都可以发布"}.
{"Anyone may subscribe and retrieve items","任何人都可以订阅和检索内容项"}.
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","对全部或来源进行了状态订阅的任何人均可订阅检索内容项"}.
{"Anyone may subscribe and retrieve items","任何人都可以订阅和检索项"}.
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","任何拥有 both 或 from 的在线状态订阅的用户都可以订阅检索项"}.
{"Anyone with Voice","任何有发言权的人"}.
{"Anyone","任何人"}.
{"API Commands","API 命令"}.
{"April","四月"}.
{"Arguments","参数"}.
{"Attribute 'channel' is required for this request","此请求要求“channel”属性"}.
{"Attribute 'id' is mandatory for MIX messages","对于 MIX 消息,“id”属性是必需的"}.
{"Attribute 'jid' is not allowed here","此处不允许“jid”属性"}.
@@ -75,26 +77,27 @@
{"Channel JID","频道 JID"}.
{"Channels","频道"}.
{"Characters not allowed:","不允许字符:"}.
{"Chatroom configuration modified","聊配置已修改"}.
{"Chatroom is created","群聊已创建"}.
{"Chatroom is destroyed","群聊已解散"}.
{"Chatroom is started","群聊已开始"}.
{"Chatroom is stopped","群聊已停止"}.
{"Chatrooms","聊"}.
{"Chatroom configuration modified","聊天室配置已修改"}.
{"Chatroom is created","已创建聊天室"}.
{"Chatroom is destroyed","已解散聊天室"}.
{"Chatroom is started","已启动聊天室"}.
{"Chatroom is stopped","已停止聊天室"}.
{"Chatrooms","聊天室"}.
{"Choose a username and password to register with this server","请选择要在此服务器中注册的用户名和密码"}.
{"Choose storage type of tables","选择表的存储类型"}.
{"Choose storage type of tables","选择表的存储类型"}.
{"Choose whether to approve this entity's subscription.","选择是否批准此实体的订阅。"}.
{"City","城市"}.
{"Client acknowledged more stanzas than sent by server","客户端确认的节数多于服务器发送的节数"}.
{"Clustering","集群"}.
{"Commands","命令"}.
{"Conference room does not exist","群聊不存在"}.
{"Configuration of room ~s","群聊 ~s 的配置"}.
{"Conference room does not exist","会议室不存在"}.
{"Configuration of room ~s","房间 ~s 的配置"}.
{"Configuration","配置"}.
{"Contact Addresses (normally, room owner or owners)","联系地址(通常为群聊所有者)"}.
{"Contact Addresses (normally, room owner or owners)","联系地址(通常为房间所有者)"}.
{"Country","国家/地区"}.
{"Current Discussion Topic","当前讨论话题"}.
{"Database failure","数据库失败"}.
{"Database Tables Configuration at ","数据库表配置位于 "}.
{"Database Tables Configuration at ","数据库表配置 "}.
{"Database","数据库"}.
{"December","十二月"}.
{"Default users as participants","默认用户为参与者"}.
@@ -103,27 +106,27 @@
{"Delete User","删除用户"}.
{"Deliver event notifications","传递事件通知"}.
{"Deliver payloads with event notifications","用事件通知传递有效负载"}.
{"Disc only copy","仅磁盘复制"}.
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","不要将密码告诉任何人,甚至是 XMPP 服务的管理员。"}.
{"Disc only copy","仅磁盘副本"}.
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","不要将您的密码告诉任何人,甚至是 XMPP 服务的管理员。"}.
{"Dump Backup to Text File at ","将备份转储到位于以下位置的文本文件 "}.
{"Dump to Text File","转储到文本文件"}.
{"Duplicated groups are not allowed by RFC6121","按照 RFC6121 的规则,不允许重复的组"}.
{"Dynamically specify a replyto of the item publisher","项目发布者动态指定一个 replyto"}.
{"Duplicated groups are not allowed by RFC6121","按照 RFC6121 的规则,不允许重复的组"}.
{"Dynamically specify a replyto of the item publisher","动态指定项目发布者 replyto"}.
{"Edit Properties","编辑属性"}.
{"Either approve or decline the voice request.","批准或拒绝发言请求。"}.
{"Either approve or decline the voice request.","批准或拒绝发言请求。"}.
{"ejabberd HTTP Upload service","ejabberd HTTP 上传服务"}.
{"ejabberd MUC module","ejabberd MUC 模块"}.
{"ejabberd Multicast service","ejabberd 多重映射服务"}.
{"ejabberd Publish-Subscribe module","ejabberd 发布订阅模块"}.
{"ejabberd Multicast service","ejabberd 多服务"}.
{"ejabberd Publish-Subscribe module","ejabberd 发布订阅模块"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 字节流模块"}.
{"ejabberd vCard module","ejabberd vCard 模块"}.
{"ejabberd Web Admin","ejabberd Web 管理"}.
{"ejabberd Web Admin","ejabberd Web 管理"}.
{"ejabberd","ejabberd"}.
{"Email Address","电子邮件地址"}.
{"Email","电子邮件"}.
{"Enable hats","启用头衔"}.
{"Enable logging","启用日志记录"}.
{"Enable message archiving","启用消息档"}.
{"Enable message archiving","启用消息档"}.
{"Enabling push without 'node' attribute is not supported","不支持没有“node”属性就启用推送"}.
{"End User Session","结束用户会话"}.
{"Enter nickname you want to register","请输入要注册的昵称"}.
@@ -133,26 +136,26 @@
{"Enter path to text file","请输入文本文件的路径"}.
{"Enter the text you see","请输入您看到的文本"}.
{"Erlang XMPP Server","Erlang XMPP 服务器"}.
{"Exclude Jabber IDs from CAPTCHA challenge","从验证码挑战中排除 Jabber ID"}.
{"Export all tables as SQL queries to a file:","将所有表以 SQL 查询语句导出到文件:"}.
{"Exclude Jabber IDs from CAPTCHA challenge","从验证码挑战中排除 Jabber ID"}.
{"Export all tables as SQL queries to a file:","将所有表以 SQL 查询导出到文件:"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","将服务器中所有用户的数据导出到 PIEFXIS 文件(XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","将主机中用户的数据导出到 PIEFXIS 文件(XEP-0227):"}.
{"External component failure","外部组件故障"}.
{"External component timeout","外部组件超时"}.
{"Failed to activate bytestream","激活字节流失败"}.
{"Failed to extract JID from your voice request approval","无法从您的发言请求批准中提取 JID"}.
{"Failed to map delegated namespace to external component","未能将代理命名空间映射到外部组件"}.
{"Failed to parse HTTP response","HTTP 响应解析失败"}.
{"Failed to activate bytestream","无法激活字节流"}.
{"Failed to extract JID from your voice request approval","无法从您的发言请求批准中提取 JID"}.
{"Failed to map delegated namespace to external component","无法将委托命名空间映射到外部组件"}.
{"Failed to parse HTTP response","无法解析 HTTP 响应"}.
{"Failed to process option '~s'","无法处理选项“~s”"}.
{"Family Name","姓氏"}.
{"FAQ Entry","常见问题解答"}.
{"FAQ Entry","常见问题条目"}.
{"February","二月"}.
{"File larger than ~w bytes","文件大于 ~w 字节"}.
{"Fill in the form to search for any matching XMPP User","填写表单以搜索任何匹配的 XMPP 用户"}.
{"Friday","星期五"}.
{"Friday","五"}.
{"From ~ts","来自 ~ts"}.
{"Full List of Room Admins","群聊管理员完整列表"}.
{"Full List of Room Owners","群聊所有者完整列表"}.
{"Full List of Room Admins","房间管理员完整列表"}.
{"Full List of Room Owners","房间所有者完整列表"}.
{"Full Name","全名"}.
{"Get List of Online Users","获取在线用户列表"}.
{"Get List of Registered Users","获取注册用户列表"}.
@@ -160,14 +163,15 @@
{"Get Number of Registered Users","获取注册用户数"}.
{"Get Pending","获取待处理"}.
{"Get User Last Login Time","获取用户上次登录时间"}.
{"Get User Statistics","获取用户统计"}.
{"Given Name","中间名"}.
{"Grant voice to this person?","授予此用户发言权?"}.
{"Get User Statistics","获取用户统计数据"}.
{"Given Name","名"}.
{"Grant voice to this person?","是否授予此用户发言权?"}.
{"has been banned","已被封禁"}.
{"has been kicked because of a system shutdown","因系统关而被踢出"}.
{"has been kicked because of an affiliation change","由于从属关系的改变而踢出"}.
{"has been kicked because the room has been changed to members-only","被踢出,因为群聊已更改为仅成员进入"}.
{"has been kicked because of a system shutdown","因系统关而被踢出"}.
{"has been kicked because of an affiliation change","由于从属关系的更改而被踢出"}.
{"has been kicked because the room has been changed to members-only","被踢出,因为房间已更改为仅成员"}.
{"has been kicked","已被踢出"}.
{"Hash of the vCard-temp avatar of this room","此房间的 vCard-temp 头像的散列"}.
{"Hat title","头衔标题"}.
{"Hat URI","头衔 URI"}.
{"Hats limit exceeded","已超过头衔限制"}.
@@ -180,13 +184,13 @@
{"Import user data from jabberd14 spool file:","从 jabberd14 Spool 文件导入用户数据:"}.
{"Import User from File at ","从以下位置的文件导入用户 "}.
{"Import users data from a PIEFXIS file (XEP-0227):","从 PIEFXIS 文件(XEP-0227)导入用户数据:"}.
{"Import users data from jabberd14 spool directory:","从jabberd14 Spool目录导入用户数据:"}.
{"Import Users from Dir at ","从以下位置目录导入用户 "}.
{"Import users data from jabberd14 spool directory:","从 jabberd14 spool 目录导入用户数据:"}.
{"Import Users from Dir at ","从以下位置目录导入用户 "}.
{"Import Users From jabberd14 Spool Files","从 jabberd14 Spool 文件导入用户"}.
{"Improper domain part of 'from' attribute","“from”属性域名部分不正确"}.
{"Improper message type","消息类型不正确"}.
{"Incorrect CAPTCHA submit","提交的验证码不正确"}.
{"Incorrect data form","数据形式不正确"}.
{"Incorrect data form","数据表单不正确"}.
{"Incorrect password","密码不正确"}.
{"Incorrect value of 'action' attribute","“action”属性的值不正确"}.
{"Incorrect value of 'action' in data form","数据表单中“action”的值不正确"}.
@@ -196,206 +200,207 @@
{"Insufficient privilege","权限不足"}.
{"Internal server error","内部服务器错误"}.
{"Invalid 'from' attribute in forwarded message","转发消息中的“from”属性无效"}.
{"Invalid node name","无效的节点名称"}.
{"Invalid node name","节点名称无效"}.
{"Invalid 'previd' value","“previd”值无效"}.
{"Invitations are not allowed in this conference","此群聊不允许邀请"}.
{"Invitations are not allowed in this conference","此会议不允许邀请"}.
{"IP addresses","IP 地址"}.
{"is now known as","现在昵称为"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","不允许向此群聊发送错误消息。参与者(~s)发送了错误消息(~s),被踢出了群聊"}.
{"It is not allowed to send private messages of type \"groupchat\"","不允许发送“群聊”类型的私信"}.
{"It is not allowed to send private messages to the conference","不允许向群聊发送私信"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","不允许向此房间发送错误消息。参与者(~s)发送了错误消息(~s),被踢出了房间"}.
{"It is not allowed to send private messages of type \"groupchat\"","不允许发送“groupchat”类型的私信"}.
{"It is not allowed to send private messages to the conference","不允许向会议发送私信"}.
{"Jabber ID","Jabber ID"}.
{"January","一月"}.
{"JID normalization denied by service policy","JID 规范化被服务策略拒绝"}.
{"JID normalization denied by service policy","服务策略拒绝 JID 规范化"}.
{"JID normalization failed","JID 规范化失败"}.
{"Joined MIX channels of ~ts","加入了 ~ts 的 MIX 频道"}.
{"Joined MIX channels:","加入了 MIX 频道:"}.
{"joins the room","加入群聊"}.
{"joins the room","加入房间"}.
{"July","七月"}.
{"June","六月"}.
{"Just created","刚刚创建"}.
{"Last Activity","上次活动"}.
{"Last login","上次登录"}.
{"Last message","最消息"}.
{"Last message","最后一条消息"}.
{"Last month","上个月"}.
{"Last year","去年"}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","文本的 SHA-256 哈希的最低有效位应等于十六进制标签"}.
{"leaves the room","离开群聊"}.
{"List of users with hats","有头衔用户列表"}.
{"List users with hats","有头衔用户列表"}.
{"Logging","正在记录"}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","文本的 SHA-256 散列的最低有效位应等于十六进制标签"}.
{"leaves the room","离开房间"}.
{"List of users with hats","有头衔用户列表"}.
{"List users with hats","列出有头衔用户"}.
{"Logged Out","已登出"}.
{"Logging","日志记录"}.
{"Make participants list public","公开参与者列表"}.
{"Make room CAPTCHA protected","让群聊受验证码保护"}.
{"Make room members-only","让群聊仅成员进入"}.
{"Make room moderated","开启群聊发言审核"}.
{"Make room password protected","让群聊受密码保护"}.
{"Make room persistent","让群聊持续存在"}.
{"Make room public searchable","让群聊可公开搜索"}.
{"Make room CAPTCHA protected","启用房间验证码保护"}.
{"Make room members-only","将房间设为仅成员"}.
{"Make room moderated","启用房间发言审核"}.
{"Make room password protected","启用房间密码保护"}.
{"Make room persistent","将房间设为持久"}.
{"Make room public searchable","将房间设为可公开搜索"}.
{"Malformed username","用户名格式不正确"}.
{"MAM preference modification denied by service policy","MAM 偏好被服务策略拒绝"}.
{"MAM preference modification denied by service policy","服务策略拒绝修改 MAM 首选项"}.
{"March","三月"}.
{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","要持久化的最大项目数 #,或max表示除服务器施加的最大值之外没有特定限制"}.
{"Max payload size in bytes","最大有效负载字节"}.
{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","要保留的最大项目数 #,或 `max` 表示除服务器强制规定的最大值外无其他特定限制"}.
{"Max payload size in bytes","最大有效负载大小(字节"}.
{"Maximum file size","最大文件大小"}.
{"Maximum Number of History Messages Returned by Room","群聊返回的聊天记录消息的最大值"}.
{"Maximum number of items to persist","要持久化的最大项目数"}.
{"Maximum Number of Occupants","最大占用人数"}.
{"Maximum Number of History Messages Returned by Room","房间返回的最大历史消息数"}.
{"Maximum number of items to persist","要保留的最大项目数"}.
{"Maximum Number of Occupants","最大使用者数"}.
{"May","五月"}.
{"Membership is required to enter this room","进入此群聊需要成员资格"}.
{"Memorize your password, or write it in a paper placed in a safe place. In XMPP there isn't an automated way to recover your password if you forget it.","请记住密码,或将密码写在纸上,放在安全地方。在 XMPP 中,如果您忘记密码,没有自动恢复密码的方法。"}.
{"Membership is required to enter this room","进入此房间需要成员资格"}.
{"Memorize your password, or write it in a paper placed in a safe place. In XMPP there isn't an automated way to recover your password if you forget it.","请记住您的密码,或写在放在安全地方的纸上。在 XMPP 中,如果您忘记密码,没有自动恢复密码的方法。"}.
{"Mere Availability in XMPP (No Show Value)","XMPP 中的可用性(无显示值)"}.
{"Message body","消息主体"}.
{"Message not found in forwarded payload","转发的有效载荷中找不到消息"}.
{"Message body","消息正文"}.
{"Message not found in forwarded payload","转发的有效负载中未找到消息"}.
{"Messages from strangers are rejected","拒绝来自陌生人的消息"}.
{"Messages of type headline","标题类型的消息"}.
{"Messages of type normal","普通类型的消息"}.
{"Middle Name","中间名"}.
{"Minimum interval between voice requests (in seconds)","发言请求之间的最短间隔时间(秒)"}.
{"Minimum interval between voice requests (in seconds)","发言请求的最短间隔时间(秒)"}.
{"Moderator privileges required","需要主持人权限"}.
{"Moderators Only","仅主持人"}.
{"Moderator","主持人"}.
{"Module failed to handle the query","模块无法处理查询"}.
{"Monday","星期一"}.
{"Multicast","多重映射"}.
{"Monday","一"}.
{"Multicast","多"}.
{"Multiple <item/> elements are not allowed by RFC6121","按照 RFC6121,多个 <item/> 元素是不允许的"}.
{"Multi-User Chat","多用户聊天"}.
{"Name","名称"}.
{"Natural Language for Room Discussions","群聊讨论的自然语言"}.
{"Natural-Language Room Name","自然语言群聊名称"}.
{"Natural Language for Room Discussions","房间讨论的自然语言"}.
{"Natural-Language Room Name","自然语言房间名称"}.
{"Neither 'jid' nor 'nick' attribute found","未找到“jid”和“nick”属性"}.
{"Neither 'role' nor 'affiliation' attribute found","未找到“role”或“affiliation”属性"}.
{"Never","从不"}.
{"New Password:","新密码:"}.
{"Nickname can't be empty","昵称不能为空"}.
{"Nickname Registration at ","昵称注册于 "}.
{"Nickname ~s does not exist in the room","昵称 ~s 不在此群聊"}.
{"Nickname ~s does not exist in the room","昵称 ~s 在房间中不存在"}.
{"Nickname","昵称"}.
{"No address elements found","找到地址元素"}.
{"No addresses element found","找到地址元素"}.
{"No address elements found","找到地址元素"}.
{"No addresses element found","找到地址元素"}.
{"No 'affiliation' attribute found","未找到“affiliation”属性"}.
{"No available resource found","找到可用资源"}.
{"No body provided for announce message","没有为公告消息提供正文"}.
{"No child elements found","没有找到子元素"}.
{"No data form found","没有找到数据表单"}.
{"No Data","没有数据"}.
{"No features available","没有可用特征"}.
{"No available resource found","找到可用资源"}.
{"No body provided for announce message","未提供公告消息正文"}.
{"No child elements found","找到子元素"}.
{"No data form found","找到数据表单"}.
{"No Data","数据"}.
{"No features available","无可用功能"}.
{"No <forwarded/> element found","未找到 <forwarded/> 元素"}.
{"No hook has processed this command","没有任何钩子处理此命令"}.
{"No info about last activity found","未找到上次活动的信息"}.
{"No hook has processed this command","没有钩子处理此命令"}.
{"No info about last activity found","未找到有关上次活动的信息"}.
{"No 'item' element found","未找到“item”元素"}.
{"No items found in this query","在此查询中找到任何项目"}.
{"No limit","不限"}.
{"No items found in this query","在此查询中找到任何项目"}.
{"No limit","无限制"}.
{"No module is handling this query","没有模块正在处理此查询"}.
{"No node specified","未指定节点"}.
{"No 'password' found in data form","在数据表单中找到“password”"}.
{"No 'password' found in this query","在此查询中找到“password”"}.
{"No 'path' found in data form","在数据表单中找到“path”"}.
{"No 'password' found in data form","在数据表单中找到“password”"}.
{"No 'password' found in this query","在此查询中找到“password”"}.
{"No 'path' found in data form","在数据表单中找到“path”"}.
{"No pending subscriptions found","未找到待处理的订阅"}.
{"No privacy list with this name found","未找到此名称的隐私列表"}.
{"No private data found in this query","此查询中未发现私有数据"}.
{"No running node found","没有找到运行的节点"}.
{"No privacy list with this name found","未找到具有此名称的隐私列表"}.
{"No private data found in this query","此查询中未找到专用数据"}.
{"No running node found","未找到正在运行的节点"}.
{"No services available","无可用服务"}.
{"No statistics found for this item","未找到此项的统计数据"}.
{"No statistics found for this item","未找到此项的统计数据"}.
{"No 'to' attribute found in the invitation","邀请中未找到“to”属性"}.
{"Nobody","没有人"}.
{"Node already exists","节点已存在"}.
{"Node ID","节点 ID"}.
{"Node index not found","没有找到节点索引"}.
{"Node not found","没有找到节点"}.
{"Node index not found","找到节点索引"}.
{"Node not found","找到节点"}.
{"Node ~p","节点 ~p"}.
{"Nodeprep has failed","Nodeprep 已失效"}.
{"Nodeprep has failed","Nodeprep 失败了"}.
{"Nodes","节点"}.
{"Node","节点"}.
{"None","无"}.
{"Not allowed","不允许"}.
{"Not Found","没有找到"}.
{"Not Found","找到"}.
{"Not subscribed","未订阅"}.
{"Notify subscribers when items are removed from the node","从节点删除内容条目时通知订阅者"}.
{"Notify subscribers when the node configuration changes","节点设置改变时通知订阅者"}.
{"Notify subscribers when the node is deleted","当节点被删除时通知订阅者"}.
{"Notify subscribers when items are removed from the node","从节点中移除项目时通知订阅者"}.
{"Notify subscribers when the node configuration changes","节点配置更改时通知订阅者"}.
{"Notify subscribers when the node is deleted","删除节点时通知订阅者"}.
{"November","十一月"}.
{"Number of answers required","所需答案数"}.
{"Number of occupants","占用人数"}.
{"Number of Offline Messages","离线消息数"}.
{"Number of answers required","所需答案数"}.
{"Number of occupants","使用者数"}.
{"Number of Offline Messages","离线消息数"}.
{"Number of online users","在线用户数"}.
{"Number of registered users","注册用户数"}.
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","等待多少秒后自动清除项目,“max表示除服务器施加的最大值外没有特定限制"}.
{"Occupants are allowed to invite others","允许用者邀请人"}.
{"Occupants are allowed to query others","允许用者查询人"}.
{"Occupants May Change the Subject","用者可以更改题"}.
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","自动清除项目前的秒数,`max` 表示除服务器强制规定的最大值外无其他特定限制"}.
{"Occupants are allowed to invite others","允许使用者邀请人"}.
{"Occupants are allowed to query others","允许使用者查询人"}.
{"Occupants May Change the Subject","使用者可以更改题"}.
{"October","十月"}.
{"OK","确定"}.
{"Old Password:","旧密码:"}.
{"Online Users","在线用户"}.
{"Online","在线"}.
{"Only collection node owners may associate leaf nodes with the collection","只有集合节点所有者可以将叶节点与集合关联"}.
{"Only deliver notifications to available users","仅将通知发送给可发送的用户"}.
{"Only collection node owners may associate leaf nodes with the collection","只有集合节点所有者可以将叶节点与集合关联"}.
{"Only deliver notifications to available users","仅向在线用户发送通知"}.
{"Only <enable/> or <disable/> tags are allowed","仅允许 <enable/> 或 <disable/> 标签"}.
{"Only <list/> element is allowed in this query","此查询中只允许 <list/> 元素"}.
{"Only members may query archives of this room","只有成员才能查询此群聊的存档"}.
{"Only moderators and participants are allowed to change the subject in this room","只主持人和参与者才允许在此群聊更改话题"}.
{"Only moderators are allowed to change the subject in this room","只主持人才允许在此群聊更改话题"}.
{"Only moderators are allowed to retract messages","只主持人才允许撤回消息"}.
{"Only moderators can approve voice requests","只有主持人才能批准发言请求"}.
{"Only occupants are allowed to send messages to the conference","只有占用者才允许向群聊发送消息"}.
{"Only occupants are allowed to send queries to the conference","只有占用者才允许向群聊发送查询"}.
{"Only publishers may publish","只有发布人可以发布"}.
{"Only service administrators are allowed to send service messages","只服务管理员才允许发送服务消息"}.
{"Only those on a whitelist may associate leaf nodes with the collection","白名单用户可以将叶节点与集合关联"}.
{"Only those on a whitelist may subscribe and retrieve items","白名单用户可以订阅和检索内容项"}.
{"Only members may query archives of this room","只有成员才能查询此房间的归档"}.
{"Only moderators and participants are allowed to change the subject in this room","只允许主持人和参与者更改此房间的主题"}.
{"Only moderators are allowed to change the subject in this room","只允许主持人更改此房间的主题"}.
{"Only moderators are allowed to retract messages","只允许主持人撤回消息"}.
{"Only moderators can approve voice requests","只有主持人可以批准发言请求"}.
{"Only occupants are allowed to send messages to the conference","只允许使用者向会议发送消息"}.
{"Only occupants are allowed to send queries to the conference","只允许使用者向会议发送查询"}.
{"Only publishers may publish","只有发布者才能发布"}.
{"Only service administrators are allowed to send service messages","只允许服务管理员发送服务消息"}.
{"Only those on a whitelist may associate leaf nodes with the collection","只有白名单上的那些可以将叶节点与集合关联"}.
{"Only those on a whitelist may subscribe and retrieve items","只有白名单上的那些才可以订阅和检索项"}.
{"Organization Name","组织名称"}.
{"Organization Unit","组织单位"}.
{"Other Modules Available:","其他可用模块:"}.
{"Outgoing s2s Connections","出 s2s 连接"}.
{"Outgoing s2s Connections","出 s2s 连接"}.
{"Owner privileges required","需要所有者权限"}.
{"Packet relay is denied by service policy","包中继被服务策略拒绝"}.
{"Packet relay is denied by service policy","服务策略拒绝数据包中继"}.
{"Participant ID","参与者 ID"}.
{"Participant","参与者"}.
{"Password Verification","密码验证"}.
{"Password Verification:","密码验证:"}.
{"Password","密码"}.
{"Password:","密码:"}.
{"Path to Dir","目录路径"}.
{"Path to Dir","目录路径"}.
{"Path to File","文件路径"}.
{"Payload semantic type information","有效载语义类型信息"}.
{"Period: ","持续时间 "}.
{"Persist items to storage","持久化内容条目"}.
{"Payload semantic type information","有效载语义类型信息"}.
{"Period: ","时段 "}.
{"Persist items to storage","将项目保留到存储"}.
{"Persistent","持久"}.
{"Ping query is incorrect","Ping 查询不正确"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","注意:这些选项仅将备份内置的 Mnesia 数据库。如果您正在使用 ODBC 模块,还需要分别备份您的数据库。"}.
{"Please, wait for a while before sending new voice request","请稍候,然后再发送新的发言请求"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","注意:这些选项只会备份内置的 Mnesia 数据库。如果使用 ODBC 模块,还需要单独备份 SQL 数据库。"}.
{"Please, wait for a while before sending new voice request","请稍候再发送新的发言请求"}.
{"Pong","Pong"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","按照 RFC6121 不允许有“ask”属性"}.
{"Present real Jabber IDs to","将用户真实 JID 显示给"}.
{"Previous session not found","上一个会话未找到"}.
{"Previous session PID has been killed","上一个会话 PID 已被杀掉"}.
{"Previous session PID has exited","上一个会话 PID 已退出"}.
{"Previous session PID is dead","上一个会话 PID 已"}.
{"Previous session timed out","上一个会话超时"}.
{"Present real Jabber IDs to","将真实 Jabber ID 显示给"}.
{"Previous session not found","未找到上一个会话"}.
{"Previous session PID has been killed","上一个会话 PID 已终止"}.
{"Previous session PID has exited","上一个会话 PID 已退出"}.
{"Previous session PID is dead","上一个会话 PID 已失效"}.
{"Previous session timed out","上一个会话超时"}.
{"private, ","私人, "}.
{"Public","公开"}.
{"Publish model","发布模型"}.
{"Publish-Subscribe","发布订阅"}.
{"Publish-Subscribe","发布订阅"}.
{"PubSub subscriber request","PubSub 订阅者请求"}.
{"Purge all items when the relevant publisher goes offline","相关发布离线后清除所有项"}.
{"Push record not found","没有找到推送记录"}.
{"Queries to the conference members are not allowed in this room","不允许在此群聊中查询群聊成员"}.
{"Purge all items when the relevant publisher goes offline","相关发布离线后清除所有项"}.
{"Push record not found","找到推送记录"}.
{"Queries to the conference members are not allowed in this room","此房间不允许向会议成员查询"}.
{"Query to another users is forbidden","禁止查询其他用户"}.
{"RAM and disc copy","内存与磁盘复制"}.
{"RAM copy","内存(RAM)复制"}.
{"Really delete message of the day?","确实要删除每日消息吗?"}.
{"RAM and disc copy","RAM 和磁盘副本"}.
{"RAM copy","RAM 副本"}.
{"Really delete message of the day?","是否确定删除每日消息"}.
{"Receive notification from all descendent nodes","接收所有后代节点的通知"}.
{"Receive notification from direct child nodes only","仅接收所有直接子节点的通知"}.
{"Receive notification of new items only","仅接收新内容项的通知"}.
{"Receive notification from direct child nodes only","仅接收直接子节点的通知"}.
{"Receive notification of new items only","仅接收新项的通知"}.
{"Receive notification of new nodes only","仅接收新节点的通知"}.
{"Recipient is not in the conference room","接收者不在群聊"}.
{"Recipient is not in the conference room","接收者不在会议室"}.
{"Register an XMPP account","注册 XMPP 账号"}.
{"Register","注册"}.
{"Remote copy","远程复制"}.
{"Remote copy","远程副本"}.
{"Remove a hat from a user","移除用户头衔"}.
{"Remove User","移除用户"}.
{"Replaced by new connection","被新的连接替换"}.
{"Replaced by new connection","替换为新连接"}.
{"Request has timed out","请求已超时"}.
{"Request is ignored","请求被忽略"}.
{"Requested role","请求的角色"}.
@@ -404,106 +409,108 @@
{"Restore Backup from File at ","从以下位置的文件恢复备份 "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","在下次 ejabberd 重启后恢复二进制备份(所需内存较少):"}.
{"Restore binary backup immediately:","立即恢复二进制备份:"}.
{"Restore plain text backup immediately:","立即恢复明文备份:"}.
{"Restore plain text backup immediately:","立即恢复纯文本备份:"}.
{"Restore","恢复"}.
{"Result","结果"}.
{"Roles and Affiliations that May Retrieve Member List","可以检索成员列表的角色和从属关系"}.
{"Roles for which Presence is Broadcasted","广播在线状态的角色"}.
{"Roles that May Send Private Messages","可以发送私信的角色"}.
{"Room Configuration","群聊配置"}.
{"Room creation is denied by service policy","群聊创建被服务策略拒绝"}.
{"Room description","群聊描述"}.
{"Room Occupants","群聊占用者"}.
{"Room terminates","群聊终止"}.
{"Room title","群聊标题"}.
{"Roster groups allowed to subscribe","允许订阅的名册组"}.
{"Roster size","名册大小"}.
{"Running Nodes","运行的节点"}.
{"~s invites you to the room ~s","~s 邀请您加入群聊 ~s"}.
{"Saturday","星期六"}.
{"Room Configuration","房间配置"}.
{"Room creation is denied by service policy","服务策略拒绝创建房间"}.
{"Room description","房间描述"}.
{"Room Occupants","房间使用者"}.
{"Room terminates","房间终止"}.
{"Room title","房间标题"}.
{"Roster groups allowed to subscribe","允许订阅的名册组"}.
{"Roster size","名册大小"}.
{"Running Nodes","正在运行的节点"}.
{"~s invites you to the room ~s","~s 邀请您加入房间 ~s"}.
{"Saturday","六"}.
{"Search from the date","从日期搜索"}.
{"Search Results for ","搜索结果 "}.
{"Search the text","搜索文本"}.
{"Search until the date","搜索截至日期"}.
{"Search users in ","在以下位置搜索用户 "}.
{"Send announcement to all online users on all hosts","发送通知给所有主机的在线用户"}.
{"Send announcement to all online users","发送通知给所有在线用户"}.
{"Send announcement to all users on all hosts","发送通知给所有主机上的所有用户"}.
{"Send announcement to all users","发送通知给所有用户"}.
{"Send announcement to all online users on all hosts","向所有主机上的所有在线用户发送公告"}.
{"Send announcement to all online users","所有在线用户发送公告"}.
{"Send announcement to all users on all hosts","所有主机上的所有用户发送公告"}.
{"Send announcement to all users","向所有用户发送公告"}.
{"September","九月"}.
{"Server:","服务器:"}.
{"Service list retrieval timed out","服务列表检索超时"}.
{"Session state copying timed out","会话状态复制超时"}.
{"Set message of the day and send to online users","设置每日消息并发送给在线用户"}.
{"Set message of the day on all hosts and send to online users","在所有主机上设置每日消息并发送给在线用户"}.
{"Shared Roster Groups","共享的花名册组"}.
{"Show Integral Table","显示完整表"}.
{"Show Ordinary Table","显示普通列表"}.
{"Shared Roster Groups","共享名册组"}.
{"Show Integral Table","显示完整表"}.
{"Show Occupants Join/Leave","显示使用者加入/离开"}.
{"Show Ordinary Table","显示普通表"}.
{"Shut Down Service","关闭服务"}.
{"SOCKS5 Bytestreams","SOCKS5 字节流"}.
{"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","某些 XMPP 客户端可以将您的密码存储在计算机中,但出于安全考虑,您应该仅在个人计算机中存储密码。"}.
{"Sources Specs:","源参数"}.
{"Specify the access model","指定访问范例"}.
{"Sources Specs:","源规格"}.
{"Specify the access model","指定访问模型"}.
{"Specify the event message type","指定事件消息类型"}.
{"Specify the publisher model","指定发布人范例"}.
{"Stanza id is not valid","节 id 无效"}.
{"Specify the publisher model","指定发布者模型"}.
{"Stanza id is not valid","节 ID 无效"}.
{"Stanza ID","节 ID"}.
{"Statically specify a replyto of the node owner(s)","静态指定节点所有者的回复"}.
{"Stopped Nodes","已停止的节点"}.
{"Store binary backup:","存储二进制备份:"}.
{"Store plain text backup:","存储为普通文本备份:"}.
{"Stream management is already enabled","流管理已启用"}.
{"Stream management is not enabled","流管理未启用"}.
{"Subject","题"}.
{"Statically specify a replyto of the node owner(s)","静态指定节点所有者的 replyto"}.
{"Stopped Nodes","已停止的节点"}.
{"Store binary backup:","存储二进制备份:"}.
{"Store plain text backup:","存储文本备份:"}.
{"Stream management is already enabled","已启用流管理"}.
{"Stream management is not enabled","未启用流管理"}.
{"Subject","题"}.
{"Submitted","已提交"}.
{"Subscriber Address","订阅者地址"}.
{"Subscribers may publish","订阅者可以发布"}.
{"Subscription requests must be approved and only subscribers may retrieve items","订阅请求必须得到批准,只有订阅者才能检索项目"}.
{"Subscriptions are not allowed","不允许订阅"}.
{"Sunday","星期天"}.
{"Sunday","周日"}.
{"Text associated with a picture","与图片相关的文字"}.
{"Text associated with a sound","与声音相关的文字"}.
{"Text associated with a video","与视频相关的文字"}.
{"Text associated with speech","与语音相关的文字"}.
{"That nickname is already in use by another occupant","该昵称已被另一占用者使用"}.
{"That nickname is already in use by another occupant","该昵称已被其他使用者使用"}.
{"That nickname is registered by another person","该昵称已被另一用户注册了"}.
{"The account already exists","此账号已存在"}.
{"The account was not unregistered","此账号未注销"}.
{"The body text of the last received message","最后收到的消息的正文"}.
{"The CAPTCHA is valid.","验证码有效。"}.
{"The CAPTCHA verification has failed","验证码检查失败"}.
{"The CAPTCHA verification has failed","验证码验证失败"}.
{"The captcha you entered is wrong","您输入的验证码错误"}.
{"The child nodes (leaf or collection) associated with a collection","关联集合的字节点(叶子或集合)"}.
{"The collections with which a node is affiliated","加入结点的集合"}.
{"The child nodes (leaf or collection) associated with a collection","与集合关联的子节点(叶或集合"}.
{"The collections with which a node is affiliated","节点所属的集合"}.
{"The DateTime at which a leased subscription will end or has ended","租赁订阅将结束或已结束的日期时间"}.
{"The datetime when the node was created","节点创建的日期时间"}.
{"The default language of the node","节点的默认语言"}.
{"The feature requested is not supported by the conference","群聊不支持请求的功能"}.
{"The datetime when the node was created","创建节点的日期时间"}.
{"The default language of the node","节点的默认语言"}.
{"The feature requested is not supported by the conference","会议不支持请求的功能"}.
{"The JID of the node creator","节点创建者的 JID"}.
{"The JIDs of those to contact with questions","问题联系人的 JID"}.
{"The JIDs of those with an affiliation of owner","有所有者从属关系的用户的 JID"}.
{"The JIDs of those with an affiliation of publisher","发布者从属关系有关的用户 JID"}.
{"The list of all online users","所有在线用户列表"}.
{"The list of all users","所有用户列表"}.
{"The JIDs of those to contact with questions","有疑问时需联系的人员的 JID"}.
{"The JIDs of those with an affiliation of owner","有所有者从属关系的人员的 JID"}.
{"The JIDs of those with an affiliation of publisher","发布者从属关系的人员的 JID"}.
{"The list of all online users","所有在线用户列表"}.
{"The list of all users","所有用户列表"}.
{"The list of JIDs that may associate leaf nodes with a collection","可以将叶节点与集合关联的 JID 列表"}.
{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","可以与集合关联的最大子节点数,“max表示除服务器施加的最大值外没有特定限制"}.
{"The minimum number of milliseconds between sending any two notification digests","发送任两个通知摘要之间的最小毫秒数"}.
{"The name of the node","节点的名称"}.
{"The node is a collection node","节点是集合节点"}.
{"The node is a leaf node (default)","节点是叶节点(默认)"}.
{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","可以与集合关联的子节点的最大数量,或 `max` 表示除服务器强制规定的最大值外无其他特定限制"}.
{"The minimum number of milliseconds between sending any two notification digests","发送任两个通知摘要之间的最小毫秒数"}.
{"The name of the node","节点的名称"}.
{"The node is a collection node","节点是集合节点"}.
{"The node is a leaf node (default)","节点是叶节点默认"}.
{"The NodeID of the relevant node","相关节点的 NodeID"}.
{"The number of pending incoming presence subscription requests","待处理的传入状态订阅请求数"}.
{"The number of subscribers to the node","节点的订阅用户数"}.
{"The number of unread or undelivered messages","未读或未发送的消息数"}.
{"The number of pending incoming presence subscription requests","待处理的传入在线状态订阅请求数"}.
{"The number of subscribers to the node","节点的订阅数"}.
{"The number of unread or undelivered messages","未读或未传递的消息数"}.
{"The password contains unacceptable characters","密码包含不可接受的字符"}.
{"The password is too weak","密码强度太弱"}.
{"The password is too weak","密码太弱"}.
{"the password is","密码是"}.
{"The password of your XMPP account was successfully changed.","您的 XMPP 账号密码已成功更改。"}.
{"The password was not changed","密码未更改"}.
{"The passwords are different","密码不一致"}.
{"The presence states for which an entity wants to receive notifications","实体要为其接收通知的状态"}.
{"The query is only allowed from local users","仅允许本地用户查询"}.
{"The passwords are different","密码不"}.
{"The presence states for which an entity wants to receive notifications","实体要接收通知的在线状态"}.
{"The query is only allowed from local users","仅允许来自本地用户查询"}.
{"The query must not contain <item/> elements","查询不能包含 <item/> 元素"}.
{"The room subject can be modified by participants","群聊话题可由参与者修改"}.
{"The room subject can be modified by participants","参与者可以修改房间主题"}.
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","节点中数据的语义类型信息,通常由有效负载的命名空间指定(如果有)"}.
{"The sender of the last received message","最后收到的消息的发送者"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","节必须仅包含一个 <active/> 元素、一个 <default/> 元素或一个 <list/> 元素"}.
@@ -516,30 +523,31 @@
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","此处不区分大小写:MacBeth 和 Macbeth 都是 macbeth。"}.
{"This page allows to register an XMPP account in this XMPP server. Your JID (Jabber ID) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","本页面允许在此服务器中注册 XMPP 账号,您的 JID(Jabber ID)的格式为:用户名@服务器。请仔细阅读说明以正确填写字段。"}.
{"This page allows to unregister an XMPP account in this XMPP server.","本页面允许在此 XMPP 服务器中注销 XMPP 账号。"}.
{"This room is not anonymous","此群聊不是匿名的"}.
{"This room is not anonymous","此房间是非匿名的"}.
{"This service can not process the address: ~s","此服务无法处理地址:~s"}.
{"Thursday","星期四"}.
{"Thursday","四"}.
{"Time delay","时间延迟"}.
{"Timed out waiting for stream resumption","等待流恢复超时"}.
{"To register, visit ~s","要注册,请访问 ~s"}.
{"To ~ts","发送到~ts"}.
{"Token TTL","TTL 令牌"}.
{"Too many active bytestreams","活跃的字节流太多"}.
{"To ~ts","到 ~ts"}.
{"Token TTL","令牌 TTL"}.
{"Too many active bytestreams","活字节流太多"}.
{"Too many CAPTCHA requests","验证码请求太多"}.
{"Too many child elements","太多子元素"}.
{"Too many <item/> elements","太多 <item/> 元素"}.
{"Too many <list/> elements","太多 <list/> 元素"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","来自 IP 地址(~p)的(~s)失败认证太多。将在 UTC 时间 ~s 解除对该地址的封锁"}.
{"Too many child elements","子元素太多"}.
{"Too many <item/> elements","<item/> 元素太多"}.
{"Too many <list/> elements","<list/> 元素太多"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","有太多(~p)失败的身份验证来自 IP 地址~s),将在 UTC 时间 ~s 取消对该地址的屏蔽"}.
{"Too many receiver fields were specified","指定的接收者字段太多"}.
{"Too many unacked stanzas","未确认的节太多"}.
{"Too many users in this conference","此群聊中的用户太多"}.
{"Traffic rate limit is exceeded","已经超过传输率限制"}.
{"Too many unacked stanzas","未确认的节太多"}.
{"Too many users in this conference","此会议中的用户太多"}.
{"Traffic rate limit is exceeded","超过流量速率限制"}.
{"~ts's MAM Archive","~ts 的 MAM 归档"}.
{"~ts's Offline Messages Queue","~ts 的离线消息队列"}.
{"Tuesday","星期二"}.
{"Tuesday","二"}.
{"Unable to generate a CAPTCHA","无法生成验证码"}.
{"Unable to register route on existing local domain","在已存在的本地域上无法注册路由"}.
{"Unauthorized","未认证的"}.
{"Unexpected action","意外行为"}.
{"Unable to register route on existing local domain","无法在现有本地域上注册路由"}.
{"Unauthorized","未经授权"}.
{"Unexpected action","意外操作"}.
{"Unexpected error condition: ~p","意外错误条件:~p"}.
{"Uninstall","卸载"}.
{"Unregister an XMPP account","注销 XMPP 账号"}.
@@ -548,16 +556,18 @@
{"Unsupported version","不支持的版本"}.
{"Update message of the day (don't send)","更新每日消息(不发送)"}.
{"Update message of the day on all hosts (don't send)","更新所有主机上的每日消息(不发送)"}.
{"Update specs to get modules source, then install desired ones.","更新参数获取模块源,然后安装所需的模块。"}.
{"Update Specs","更新参数"}.
{"Update specs to get modules source, then install desired ones.","更新规格以获取模块源,然后安装所需的模块。"}.
{"Update Specs","更新规格"}.
{"Updating the vCard is not supported by the vCard storage backend","vCard 存储后端不支持更新 vCard"}.
{"Upgrade","升级"}.
{"URL for Archived Discussion Logs","存档讨论日志 URL"}.
{"URL for Archived Discussion Logs","已归档的讨论日志 URL"}.
{"User already exists","用户已存在"}.
{"User (jid)","用户 (jid)"}.
{"User JID","用户 JID"}.
{"User (jid)","用户(JID"}.
{"User Management","用户管理"}.
{"User not allowed to perform an IQ set on another user's vCard.","不允许用户在其他用户的 vCard 上执行 IQ 设置。"}.
{"User removed","用户已移除"}.
{"User session not found","用户会话未找到"}.
{"User session not found","未找到用户会话"}.
{"User session terminated","用户会话已终止"}.
{"User ~ts","用户 ~ts"}.
{"Username:","用户名:"}.
@@ -566,33 +576,34 @@
{"Users","用户"}.
{"User","用户"}.
{"Value 'get' of 'type' attribute is not allowed","不允许“type”属性的“get”值"}.
{"Value of '~s' should be boolean","'~s' 的值应为布尔"}.
{"Value of '~s' should be datetime string","'~s' 的值应为日期时间字符串"}.
{"Value of '~s' should be integer","'~s' 的值应为整数"}.
{"Value of '~s' should be boolean","~s的值应为布尔"}.
{"Value of '~s' should be datetime string","~s的值应为日期时间字符串"}.
{"Value of '~s' should be integer","~s的值应为整数"}.
{"Value 'set' of 'type' attribute is not allowed","不允许“type”属性的“set”值"}.
{"vCard User Search","vCard 用户搜索"}.
{"View joined MIX channels","查看已加入的 MIX 频道"}.
{"Virtual Hosts","虚拟主机"}.
{"Visitors are not allowed to change their nicknames in this room","不允许访客在此群聊中更改其昵称"}.
{"Visitors are not allowed to send messages to all occupants","不允许访客向所有用者发送息"}.
{"Visitor","访客"}.
{"Voice requests are disabled in this conference","此群聊中禁用发言请求"}.
{"Voice request","发言请求"}.
{"Wednesday","星期三"}.
{"When a new subscription is processed and whenever a subscriber comes online","当新的订阅被处理和当订阅者上线"}.
{"When a new subscription is processed","当新的订阅被处理"}.
{"When to send the last published item","何时发送最新发布的内容条目"}.
{"Whether an entity wants to receive an XMPP message body in addition to the payload format","除有效载荷格式外,实体是否还希望接收 XMPP 消息正文"}.
{"Whether an entity wants to receive digests (aggregations) of notifications or all notifications individually","实体是否要接收通知的摘要(汇总)或单独接收所有通知"}.
{"Visitors are not allowed to change their nicknames in this room","不允许参观者在此房间中更改其昵称"}.
{"Visitors are not allowed to send messages to all occupants","不允许参观者向所有使用者发送息"}.
{"Visitor","参观者"}.
{"Voice requests are disabled in this conference","此会议中禁用发言请求"}.
{"Voice request","发言请求"}.
{"Web client which allows to join the room anonymously","允许匿名加入房间的 Web 客户端"}.
{"Wednesday","周三"}.
{"When a new subscription is processed and whenever a subscriber comes online","处理新订阅时和订阅者上线时"}.
{"When a new subscription is processed","处理新订阅时"}.
{"When to send the last published item","何时发送最后发布的项目"}.
{"Whether an entity wants to receive an XMPP message body in addition to the payload format","除有效负载格式外,实体是否还希望接收 XMPP 消息正文"}.
{"Whether an entity wants to receive digests (aggregations) of notifications or all notifications individually","实体是要接收通知摘要(汇总) 还是要单独接收所有通知"}.
{"Whether an entity wants to receive or disable notifications","实体是否要接收或禁用通知"}.
{"Whether owners or publisher should receive replies to items","所有者或发布者是否应收到对项目的回复"}.
{"Whether the node is a leaf (default) or a collection","节点是叶子(默认)还是集合"}.
{"Whether the node is a leaf (default) or a collection","节点是叶默认还是集合"}.
{"Whether to allow subscriptions","是否允许订阅"}.
{"Whether to make all subscriptions temporary, based on subscriber presence","是否根据订阅者的在将所有订阅设为临时"}.
{"Whether to make all subscriptions temporary, based on subscriber presence","是否根据订阅者的在线状态将所有订阅设为临时订阅"}.
{"Whether to notify owners about new subscribers and unsubscribes","是否通知所有者新的订阅者和退订者"}.
{"Who can send private messages","谁可以发送私信"}.
{"Who may associate leaf nodes with a collection","谁可以将叶节点与集合关联"}.
{"Wrong parameters in the web formulary","网络配方中的参数错误"}.
{"Who may associate leaf nodes with a collection","谁可以将叶节点与集合关联"}.
{"Wrong parameters in the web formulary","Web 表单集中的参数错误"}.
{"Wrong xmlns","错误的 xmlns"}.
{"XMPP Account Registration","XMPP 账号注册"}.
{"XMPP Domains","XMPP 域"}.
@@ -600,20 +611,20 @@
{"XMPP Show Value of Chat","XMPP 的聊天显示值"}.
{"XMPP Show Value of DND (Do Not Disturb)","XMPP 的 DND(请勿打扰)显示值"}.
{"XMPP Show Value of XA (Extended Away)","XMPP 的 XA(延长离开)显示值"}.
{"XMPP URI of Associated Publish-Subscribe Node","关联发布订阅节点的 XMPP URI"}.
{"You are being removed from the room because of a system shutdown","由于系统关闭,您将会从群聊中移除"}.
{"XMPP URI of Associated Publish-Subscribe Node","关联发布订阅节点的 XMPP URI"}.
{"You are being removed from the room because of a system shutdown","由于系统关闭,您将被移出房间"}.
{"You are not allowed to send private messages","不允许您发送私信"}.
{"You are not joined to the channel","您未加入频道"}.
{"You can later change your password using an XMPP client.","您之后可以使用 XMPP 客户端更改密码。"}.
{"You have been banned from this room","您已被此群聊封禁"}.
{"You have joined too many conferences","您加入了太多群聊"}.
{"You have been banned from this room","禁止您进入此房间"}.
{"You have joined too many conferences","您加入了太多会议"}.
{"You must fill in field \"Nickname\" in the form","您必须在表单中填写“昵称”字段"}.
{"You need a client that supports x:data and CAPTCHA to register","您需要支持 x:data 和验证码的客户端来注册"}.
{"You need a client that supports x:data to register the nickname","您需要支持 x:data 的客户端来注册昵称"}.
{"You need an x:data capable client to search","您需要支持 x:data 的客户端来搜索"}.
{"Your active privacy list has denied the routing of this stanza.","您的活动隐私列表已拒绝路由此节。"}.
{"Your contact offline message queue is full. The message has been discarded.","您的联系人离线消息队列已满。消息已被丢弃。"}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","您 ~s 的订阅请求和/或消息已被屏蔽。若要解除屏蔽您的订阅请求,请访问 ~s"}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","您发给 ~s 的订阅请求和/或消息已被屏蔽。若要取消屏蔽您的订阅请求,请访问 ~s"}.
{"Your XMPP account was successfully registered.","您的 XMPP 账号注册成功。"}.
{"Your XMPP account was successfully unregistered.","您的 XMPP 账号注销成功。"}.
{"You're not allowed to create nodes","不允许您创建节点"}.
+31 -22
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -26,19 +26,27 @@
{if_version_below, "24",
{base64url, "~> 1.0", {git, "https://github.com/dvv/base64url", {tag, "1.0.1"}}}
}},
{cache_tab, "~> 1.0.30", {git, "https://github.com/processone/cache_tab", {tag, "1.0.31"}}},
{eimp, "~> 1.0.22", {git, "https://github.com/processone/eimp", {tag, "1.0.23"}}},
{cache_tab, "~> 1.0.31", {git, "https://github.com/processone/cache_tab", {tag, "1.0.31"}}},
{eimp, "~> 1.0.24", {git, "https://github.com/processone/eimp", {tag, "1.0.24"}}},
{if_var_true, pam,
{epam, "~> 1.0.14", {git, "https://github.com/processone/epam", {tag, "1.0.14"}}}},
{if_var_true, redis,
{eredis, "~> 1.2.0", {git, "https://github.com/wooga/eredis", {tag, "v1.2.0"}}}},
{if_not_rebar3,
{eredis, "~> 1.2.0", {git, "https://github.com/wooga/eredis/", {tag, "v1.2.0"}}}
}},
{if_var_true, redis,
{if_rebar3,
{if_version_below, "21",
{eredis, "1.2.0", {git, "https://github.com/wooga/eredis/", {tag, "v1.2.0"}}},
{eredis, "~> 1.7.1", {git, "https://github.com/Nordix/eredis/", {tag, "v1.7.1"}}}
}}},
{if_var_true, sip,
{esip, "~> 1.0.52", {git, "https://github.com/processone/esip", {tag, "1.0.53"}}}},
{esip, "~> 1.0.57", {git, "https://github.com/processone/esip", {tag, "1.0.57"}}}},
{if_var_true, zlib,
{ezlib, "~> 1.0.12", {git, "https://github.com/processone/ezlib", {tag, "1.0.13"}}}},
{fast_tls, "~> 1.1.19", {git, "https://github.com/processone/fast_tls", {tag, "1.1.20"}}},
{fast_xml, "~> 1.1.51", {git, "https://github.com/processone/fast_xml", {tag, "1.1.52"}}},
{fast_yaml, "~> 1.0.36", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.37"}}},
{ezlib, "~> 1.0.13", {git, "https://github.com/processone/ezlib", {tag, "1.0.13"}}}},
{fast_tls, "~> 1.1.22", {git, "https://github.com/processone/fast_tls", {tag, "1.1.22"}}},
{fast_xml, "~> 1.1.55", {git, "https://github.com/processone/fast_xml", {tag, "1.1.55"}}},
{fast_yaml, "~> 1.0.37", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.37"}}},
{idna, "~> 6.0", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}},
{if_version_below, "27",
{jiffy, "~> 1.1.1", {git, "https://github.com/davisp/jiffy", {tag, "1.1.1"}}}
@@ -55,22 +63,22 @@
{luerl, "1.0.0", {git, "https://github.com/rvirding/luerl", {tag, "1.0"}}},
{luerl, "~> 1.2.0", {git, "https://github.com/rvirding/luerl", {tag, "1.2"}}}
}},
{mqtree, "~> 1.0.16", {git, "https://github.com/processone/mqtree", {tag, "1.0.17"}}},
{p1_acme, "~> 1.0.23", {git, "https://github.com/processone/p1_acme", {tag, "1.0.23"}}},
{mqtree, "~> 1.0.17", {git, "https://github.com/processone/mqtree", {tag, "1.0.17"}}},
{p1_acme, "~> 1.0.25", {git, "https://github.com/processone/p1_acme", {tag, "1.0.25"}}},
{if_var_true, mysql,
{p1_mysql, "~> 1.0.24", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.24"}}}},
{p1_mysql, "~> 1.0.26", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.26"}}}},
{p1_oauth2, "~> 0.6.14", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.14"}}},
{if_var_true, pgsql,
{p1_pgsql, "~> 1.1.26", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.26"}}}},
{p1_utils, "~> 1.0.25", {git, "https://github.com/processone/p1_utils", {tag, "1.0.26"}}},
{p1_pgsql, "~> 1.1.32", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.32"}}}},
{p1_utils, "~> 1.0.27", {git, "https://github.com/processone/p1_utils", {tag, "1.0.27"}}},
{pkix, "~> 1.0.10", {git, "https://github.com/processone/pkix", {tag, "1.0.10"}}},
{if_var_true, sqlite,
{sqlite3, "~> 1.1.14", {git, "https://github.com/processone/erlang-sqlite3", {tag, "1.1.15"}}}},
{stringprep, "~> 1.0.29", {git, "https://github.com/processone/stringprep", {tag, "1.0.30"}}},
{sqlite3, "~> 1.1.15", {git, "https://github.com/processone/erlang-sqlite3", {tag, "1.1.15"}}}},
{stringprep, "~> 1.0.31", {git, "https://github.com/processone/stringprep", {tag, "1.0.31"}}},
{if_var_true, stun,
{stun, "~> 1.2.12", {git, "https://github.com/processone/stun", {tag, "1.2.13"}}}},
{xmpp, "~> 1.8.2", {git, "https://github.com/processone/xmpp", {tag, "1.8.2"}}},
{yconf, "~> 1.0.15", {git, "https://github.com/processone/yconf", {tag, "1.0.16"}}}
{stun, "~> 1.2.17", {git, "https://github.com/processone/stun", {tag, "1.2.17"}}}},
{xmpp, "~> 1.10.0", {git, "https://github.com/processone/xmpp", {tag, "1.10.0"}}},
{yconf, "~> 1.0.18", {git, "https://github.com/processone/yconf", {tag, "1.0.18"}}}
]}.
{gitonly_deps, [ejabberd_po]}.
@@ -132,6 +140,7 @@
{if_version_below, "25", {d, 'OTP_BELOW_25'}},
{if_version_below, "26", {d, 'OTP_BELOW_26'}},
{if_version_below, "27", {d, 'OTP_BELOW_27'}},
{if_version_below, "28", {d, 'OTP_BELOW_28'}},
{if_var_false, debug, no_debug_info},
{if_var_true, debug, debug_info},
{if_var_true, elixir, {d, 'ELIXIR_ENABLED'}},
@@ -139,14 +148,13 @@
{if_var_true, roster_gateway_workaround, {d, 'ROSTER_GATEWAY_WORKAROUND'}},
{if_var_true, sip, {d, 'SIP'}},
{if_var_true, stun, {d, 'STUN'}},
{if_type_exported, {odbc, {opaque, connection_reference, 0}}, {d, 'ODBC_HAS_TYPES'}},
{src_dirs, [src,
{if_rebar3, sql},
{if_var_true, tools, tools}]}]}.
{if_rebar3, {plugins, [{if_version_below, "21", {rebar3_hex, "7.0.7"}},
{if_version_above, "20", {rebar3_hex, "~> 7.0.8"}},
{provider_asn1, "0.2.0"},
{provider_asn1, "0.4.1"},
%% Protocol consolidation doesn't work correctly in upstream rebar_mix, see
%% https://github.com/Supersonido/rebar_mix/issues/27#issuecomment-894873335
%% Let's use this fixed rebar_mix fork, see its PR:
@@ -156,7 +164,8 @@
{branch, "consolidation_fix"}}}
}]}}.
{if_rebar3, {project_plugins, [configure_deps,
{if_var_true, tools, rebar3_format}
{if_var_true, tools, rebar3_format},
{if_var_true, tools, rebar3_lint}
]}}.
{if_not_rebar3, {plugins, [
deps_erl_opts, override_deps_versions2, override_opts, configure_deps
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+63 -68
View File
@@ -1,91 +1,86 @@
{"1.2.0",
[{<<"base64url">>,{pkg,<<"base64url">>,<<"1.0.1">>},1},
{<<"cache_tab">>,{pkg,<<"cache_tab">>,<<"1.0.30">>},0},
{<<"eimp">>,{pkg,<<"eimp">>,<<"1.0.22">>},0},
{<<"cache_tab">>,{pkg,<<"cache_tab">>,<<"1.0.31">>},0},
{<<"eimp">>,{pkg,<<"eimp">>,<<"1.0.24">>},0},
{<<"epam">>,{pkg,<<"epam">>,<<"1.0.14">>},0},
{<<"eredis">>,{pkg,<<"eredis">>,<<"1.2.0">>},0},
{<<"esip">>,{pkg,<<"esip">>,<<"1.0.52">>},0},
{<<"ezlib">>,{pkg,<<"ezlib">>,<<"1.0.12">>},0},
{<<"fast_tls">>,{pkg,<<"fast_tls">>,<<"1.1.19">>},0},
{<<"fast_xml">>,{pkg,<<"fast_xml">>,<<"1.1.51">>},0},
{<<"fast_yaml">>,{pkg,<<"fast_yaml">>,<<"1.0.36">>},0},
{<<"eredis">>,{pkg,<<"eredis">>,<<"1.7.1">>},0},
{<<"esip">>,{pkg,<<"esip">>,<<"1.0.57">>},0},
{<<"ezlib">>,{pkg,<<"ezlib">>,<<"1.0.13">>},0},
{<<"fast_tls">>,{pkg,<<"fast_tls">>,<<"1.1.22">>},0},
{<<"fast_xml">>,{pkg,<<"fast_xml">>,<<"1.1.55">>},0},
{<<"fast_yaml">>,{pkg,<<"fast_yaml">>,<<"1.0.37">>},0},
{<<"idna">>,{pkg,<<"idna">>,<<"6.1.1">>},0},
{<<"jiffy">>,{pkg,<<"jiffy">>,<<"1.1.1">>},0},
{<<"jiffy">>,{pkg,<<"jiffy">>,<<"1.1.2">>},1},
{<<"jose">>,{pkg,<<"jose">>,<<"1.11.10">>},0},
{<<"luerl">>,{pkg,<<"luerl">>,<<"1.2.0">>},0},
{<<"mqtree">>,{pkg,<<"mqtree">>,<<"1.0.16">>},0},
{<<"p1_acme">>,
{git,"https://github.com/processone/p1_acme",
{ref,"176b4a8c67627c3229fbea3c05d82a5d567e6e49"}},
0},
{<<"p1_mysql">>,
{git,"https://github.com/processone/p1_mysql",
{ref,"0dccb755a60cda61d41e7b092b344d38d1ebc802"}},
0},
{<<"luerl">>,{pkg,<<"luerl">>,<<"1.2.3">>},0},
{<<"mqtree">>,{pkg,<<"mqtree">>,<<"1.0.17">>},0},
{<<"p1_acme">>,{pkg,<<"p1_acme">>,<<"1.0.25">>},0},
{<<"p1_mysql">>,{pkg,<<"p1_mysql">>,<<"1.0.26">>},0},
{<<"p1_oauth2">>,{pkg,<<"p1_oauth2">>,<<"0.6.14">>},0},
{<<"p1_pgsql">>,
{git,"https://github.com/processone/p1_pgsql",
{ref,"fe0bb2a2a2ae21cd9fc48b81520cfce508520a56"}},
0},
{<<"p1_utils">>,{pkg,<<"p1_utils">>,<<"1.0.25">>},0},
{<<"pkix">>,
{git,"https://github.com/processone/pkix",
{ref,"03be27c7168449bdfeb8c5b6cc0f800f71f8cfe9"}},
0},
{<<"sqlite3">>,{pkg,<<"sqlite3">>,<<"1.1.14">>},0},
{<<"stringprep">>,{pkg,<<"stringprep">>,<<"1.0.29">>},0},
{<<"stun">>,{pkg,<<"stun">>,<<"1.2.12">>},0},
{<<"p1_pgsql">>,{pkg,<<"p1_pgsql">>,<<"1.1.32">>},0},
{<<"p1_utils">>,{pkg,<<"p1_utils">>,<<"1.0.27">>},0},
{<<"pkix">>,{pkg,<<"pkix">>,<<"1.0.10">>},0},
{<<"sqlite3">>,{pkg,<<"sqlite3">>,<<"1.1.15">>},0},
{<<"stringprep">>,{pkg,<<"stringprep">>,<<"1.0.31">>},0},
{<<"stun">>,{pkg,<<"stun">>,<<"1.2.17">>},0},
{<<"unicode_util_compat">>,{pkg,<<"unicode_util_compat">>,<<"0.7.0">>},1},
{<<"xmpp">>,
{git,"https://github.com/processone/xmpp",
{ref,"a1fb778bd385d832f913e564558152ea507dac37"}},
0},
{<<"yconf">>,{pkg,<<"yconf">>,<<"1.0.15">>},0}]}.
{<<"xmpp">>,{pkg,<<"xmpp">>,<<"1.10.0">>},0},
{<<"yconf">>,{pkg,<<"yconf">>,<<"1.0.18">>},0}]}.
[
{pkg_hash,[
{<<"base64url">>, <<"F8C7F2DA04CA9A5D0F5F50258F055E1D699F0E8BF4CFDB30B750865368403CF6">>},
{<<"cache_tab">>, <<"6D35EECFB65FBE5FC85988503A27338D32DE01243F3FC8EA3EE7161AF08725A4">>},
{<<"eimp">>, <<"FA9B376EF0B50E8455DB15C7C11DEA4522C6902E04412288AAB436D26335F6EB">>},
{<<"cache_tab">>, <<"E4097B50A6F373AB1E0A5F01BAB0BEF6626771A4CD6C93404ED6D54810E11FBC">>},
{<<"eimp">>, <<"853DB317BA394D479D2F1181E0B0135A3CD3C2C7EB48FF6CFB035A28DD354B14">>},
{<<"epam">>, <<"AA0B85D27F4EF3A756AE995179DF952A0721237E83C6B79D644347B75016681A">>},
{<<"eredis">>, <<"0B8E9CFC2C00FA1374CD107EA63B49BE08D933DF2CF175E6A89B73DD9C380DE4">>},
{<<"esip">>, <<"A2840287C493A4280E6FBA57A257706843B025C315875E38B03FD07190E22DBA">>},
{<<"ezlib">>, <<"FFE906BA10D03AAEE7977E1E0E81D9FFC3BB8B47FB9CD8E2E453507A2E56221F">>},
{<<"fast_tls">>, <<"F52731A4B35259FA06CF23E2A0732920AD9EFCE7C3D68377F129A474998747BB">>},
{<<"fast_xml">>, <<"A7F8C6942591632309099386D5C339C89997AC2BBDD1216F6C196DEE6D7828A9">>},
{<<"fast_yaml">>, <<"65413A34A570FD4E205A460BA602E4EE7A682F35C22D2E1C839025DBF515105C">>},
{<<"eredis">>, <<"39E31AA02ADCD651C657F39AAFD4D31A9B2F63C6C700DC9CECE98D4BC3C897AB">>},
{<<"esip">>, <<"4B14E4832D08B9FFC10D855B5D10B3083232B1D53DEB4C046679496CE85569C4">>},
{<<"ezlib">>, <<"3C7F62862850A241159C10B218ECF580BCE54D0890601B65144DACC2633BE2B0">>},
{<<"fast_tls">>, <<"44356B256AFAD4399C2FC5059A3066669DAFD8BD4E4E796C9C1CF8910DDD265E">>},
{<<"fast_xml">>, <<"ACE020F2521F2A484AC8467D2822AF85534A346E2AAE03FFCBC34F29318BEFAF">>},
{<<"fast_yaml">>, <<"F71D472FBF787CCD161B914D1EB486116A0F4F2E835337A378FBD31B59D2E74B">>},
{<<"idna">>, <<"8A63070E9F7D0C62EB9D9FCB360A7DE382448200FBBD1B106CC96D3D8099DF8D">>},
{<<"jiffy">>, <<"ACA10F47AA91697BF24AB9582C74E00E8E95474C7EF9F76D4F1A338D0F5DE21B">>},
{<<"jiffy">>, <<"A9B6C9A7EC268E7CF493D028F0A4C9144F59CCB878B1AFE42841597800840A1B">>},
{<<"jose">>, <<"A903F5227417BD2A08C8A00A0CBCC458118BE84480955E8D251297A425723F83">>},
{<<"luerl">>, <<"60F05F4240F0E7C148DDB79B67B8FF972734AAD237AA74C83D0748B8214C8EF0">>},
{<<"mqtree">>, <<"F8F8B4971E4CA94313BA9BCAAA1AA1077DAABA5E3FD3468FFB491420A4CC3593">>},
{<<"luerl">>, <<"DF25F41944E57A7C4D9EF09D238BC3E850276C46039CFC12B8BB42ECCF36FCB1">>},
{<<"mqtree">>, <<"82F54B8F2D22B4445DB1D6CCCB7FE9EAD049D61410C29E32475F3CEB3EE62A89">>},
{<<"p1_acme">>, <<"DB91F0D6C193CD1D5C0B0FA3939A898DBF56A6075DB4347CDE26E802715DE50C">>},
{<<"p1_mysql">>, <<"574D07C9936C53B1EC3556DB3CF064CC14A6C39039835B3D940471BFA5AC8E2B">>},
{<<"p1_oauth2">>, <<"1C5F82535574DE87E2059695AC4B91F8F9AEBACBC1C80287DAE6F02552D47AEA">>},
{<<"p1_utils">>, <<"2D39B5015A567BBD2CC7033EEB93A7C60D8C84EFE1EF69A3473FAA07FA268187">>},
{<<"sqlite3">>, <<"F9EA0CFF8540865FDFDB7E24EEF34DC46677364B1C070896E99B5BF08C8A7FD7">>},
{<<"stringprep">>, <<"02F23E8C3A219A3DFE40A22E908BECE3A2F68AF0FF599EA8A7B714ECB21E62EE">>},
{<<"stun">>, <<"A65DF67A8AAAECB6A94D687977B2E9F161820819910CB97BBE26A3525356525B">>},
{<<"p1_pgsql">>, <<"3F95D7E3413FC8F0BE80ABB4BE1A0D7F67066A36905085CD5A423145598B0CB0">>},
{<<"p1_utils">>, <<"F468D84C6FFA6E4B12A6160826DCF2D015527189D57865568A78B49C5ED972A1">>},
{<<"pkix">>, <<"D3BFADF7B7CFE2A3636F1B256C9CCE5F646A07CE31E57EE527668502850765A0">>},
{<<"sqlite3">>, <<"E819DEFD280145C328457D7AF897D2E45E8E5270E18812EE30B607C99CDD21AF">>},
{<<"stringprep">>, <<"FA1688C156DD271722AA18C423A4163E710D2F4F475AD0BC220910DF669B53AF">>},
{<<"stun">>, <<"C54614A592812EA125A2E6827AAC5A438571B591616426EC1419BA9B48252F54">>},
{<<"unicode_util_compat">>, <<"BC84380C9AB48177092F43AC89E4DFA2C6D62B40B8BD132B1059ECC7232F9A78">>},
{<<"yconf">>, <<"E22998B3D7728270BDD06162A9515BD142B14FAE8927CBDBD3EF639C32AA6F7A">>}]},
{<<"xmpp">>, <<"68A6DFF8DB8987C4592B2D5DD71D3F947B4EBD15209C9ACACA5909A642670630">>},
{<<"yconf">>, <<"E565EDC8AABB8164C3BEBC86969095D296AD315DCBB46AF65DCCBC6C71EAE0F6">>}]},
{pkg_hash_ext,[
{<<"base64url">>, <<"F9B3ADD4731A02A9B0410398B475B33E7566A695365237A6BDEE1BB447719F5C">>},
{<<"cache_tab">>, <<"6D8A5E00D8F84C42627706A6DBEDB02E34D58495F3ED61935C8475CA0531CDA0">>},
{<<"eimp">>, <<"B3B9FFB1D9A5F4A2BA88AC418A819164932D9A9D3A2FC3D32CA338CE855C4392">>},
{<<"cache_tab">>, <<"8582B60A4A09B247EF86355BA9E07FCE9E11EDC0345A775C9171F971C72B6351">>},
{<<"eimp">>, <<"7D61432EB8A45659C0BE475F44E75EEB651743AA64A1DE8ADF785CDAD81961AD">>},
{<<"epam">>, <<"2F3449E72885A72A6C2A843F561ADD0FC2F70D7A21F61456930A547473D4D989">>},
{<<"eredis">>, <<"D9B5ABEF2C2C8ABA8F32AA018203E0B3DC8B1157773B254AB1D4C2002317F1E1">>},
{<<"esip">>, <<"6F00165395900500AA262CE0297162D93931C78C1464D89FD0EDC6E3D6BC011F">>},
{<<"ezlib">>, <<"30E94355FB42260AAB6E12582CB0C56BF233515E655C8AEAF48760E7561E4EBB">>},
{<<"fast_tls">>, <<"DB34322C8782D4C5139CCB80709D8EC8C38089B44262EDD0C2F660AC495BD389">>},
{<<"fast_xml">>, <<"7FCE41B7D1A4BA438A2D7A088DABE74A3CA0739F1AF2ABCB77E62DAF43E0409A">>},
{<<"fast_yaml">>, <<"1ABE8F758FC2A86B08EDFF80BBC687CFD41EBC1412CFEC0EF4A0ACFCD032052F">>},
{<<"eredis">>, <<"7C2B54C566FED55FEEF3341CA79B0100A6348FD3F162184B7ED5118D258C3CC1">>},
{<<"esip">>, <<"19C357E1817B1E04792EF359BF900400F3E6D0E5ADE929FD72F88EA9B44AF2ED">>},
{<<"ezlib">>, <<"9EE62AB3F8ED55A0FD11A9569FCB8E458683F95575417272192B069F092ABFBB">>},
{<<"fast_tls">>, <<"E65779AEFB7AB15C4755230FEF8077E687D20CC5A3984A5974F9F657E8E2485B">>},
{<<"fast_xml">>, <<"83F3E23A780ED5F567CDEC73953F06C95B838D709DBFA86B59A98A8D23C99F85">>},
{<<"fast_yaml">>, <<"8DE868721BF7E2172414F7D3148EDE0F3C922B496455CD625DD5C4429515A769">>},
{<<"idna">>, <<"92376EB7894412ED19AC475E4A86F7B413C1B9FBB5BD16DCCD57934157944CEA">>},
{<<"jiffy">>, <<"62E1F0581C3C19C33A725C781DFA88410D8BFF1BBAFC3885A2552286B4785C4C">>},
{<<"jiffy">>, <<"BB61BC42A720BBD33CB09A410E48BB79A61012C74CB8B3E75F26D988485CF381">>},
{<<"jose">>, <<"0D6CD36FF8BA174DB29148FC112B5842186B68A90CE9FC2B3EC3AFE76593E614">>},
{<<"luerl">>, <<"9CAFD4F6094FF0F5A9D278FD81D60D3E026C820BDFB6CACD4B1BD909F21B525D">>},
{<<"mqtree">>, <<"C87D1C95575DB65AF29B795C9DAA3BED43F5C1BF84072A74469659BCF53594EB">>},
{<<"luerl">>, <<"1B4B9D0CA5D7D280D1D2787A6A5EE9F5A212641B62BFF91556BAA53805DF3AED">>},
{<<"mqtree">>, <<"5FE8B7CF8FBC4783D0FCEB94654AC2BBF3242A58CD0397D249DED8AE021BE2A3">>},
{<<"p1_acme">>, <<"A7B55B47495DDB4F98A15E65451EC3AD43F4637B955C74CD695D98E6A645D08C">>},
{<<"p1_mysql">>, <<"EA138083F2C54719B9CF549DBF5802A288B0019EA3E5449B354C74CC03FAFDEC">>},
{<<"p1_oauth2">>, <<"1FD3AC474E43722D9D5A87C6DF8D36F698ED87AF7BB81CBBB66361451D99AE8F">>},
{<<"p1_utils">>, <<"9219214428F2C6E5D3187FF8EB9A8783695C2427420BE9A259840E07ADA32847">>},
{<<"sqlite3">>, <<"85054B6CA297343C159ED6794A473FF2C8EEABD854B6FE02F711C0BFD373CE86">>},
{<<"stringprep">>, <<"928EBA304C3006EB1512110EBD7B87DB163B00859A09375A1E4466152C6C462A">>},
{<<"stun">>, <<"A2055032B6D338D0454142004BCB12FAFB0C64AB1F273F1D0C6923EBBC8EDE40">>},
{<<"p1_pgsql">>, <<"268B01E8F4EB75C211A31495A25C2815C549AECCE2F0DF1A161C6E0A2CDE061E">>},
{<<"p1_utils">>, <<"F1AF942B0A62BCFA0D59FBE30679BE4FFEB5E241A0C49ED5F094DB2F5B80F5E0">>},
{<<"pkix">>, <<"E02164F83094CB124C41B1AB28988A615D54B9ADC38575F00F19A597A3AC5D0E">>},
{<<"sqlite3">>, <<"3C0BA4E13322C2AD49DE4E2DDD28311366ADDE54BEAE8DBA9D9E3888F69D2857">>},
{<<"stringprep">>, <<"E9699C88E8DB16B3A41F0E45AC6874A4DA81A6E4854A77D76EDE6D09B08E3530">>},
{<<"stun">>, <<"6B318244C21E8524A9AAE3AC9A05CD8234EE994C1C2C815DE68D306086AD768D">>},
{<<"unicode_util_compat">>, <<"25EEE6D67DF61960CF6A794239566599B09E17E668D3700247BC498638152521">>},
{<<"yconf">>, <<"7FF2AB24D3C9833842716B9AAAA01A8F96641A7695CBB701B03445C4DEF01117">>}]}
{<<"xmpp">>, <<"CEEAE43B8FE97649D8F8546B3F7F2B38ECFC931C0CDD5C7445FFB3F80FCB7D85">>},
{<<"yconf">>, <<"FA950EC6503F92D6417FB8CC1D982403F041697E8E1BBF4D4588FB919B9562EA">>}]}
].
+3 -2
View File
@@ -1,6 +1,6 @@
%%%-------------------------------------------------------------------
%%% @author Evgeniy Khramtsov <ekhramtsov@process-one.net>
%%% @copyright (C) 2013-2024, Evgeniy Khramtsov
%%% @copyright (C) 2013-2025, Evgeniy Khramtsov
%%% @doc
%%%
%%% @end
@@ -38,11 +38,12 @@ Vars = case file:consult(filename:join([TopDir, "vars.config"])) of
RequiredOTPApps = [sasl, crypto, public_key, ssl,
mnesia, inets, compiler, asn1,
observer, tools,
syntax_tools, os_mon, xmerl],
ConfiguredOTPApps = lists:flatmap(
fun({tools, true}) ->
[tools, runtime_tools];
[runtime_tools];
({odbc, true}) ->
[odbc];
(_) ->
+3 -2
View File
@@ -1,5 +1,5 @@
--
-- ejabberd, Copyright (C) 2002-2024 ProcessOne
-- ejabberd, Copyright (C) 2002-2025 ProcessOne
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
@@ -18,13 +18,14 @@
CREATE TABLE users (
username text NOT NULL,
type smallint,
server_host text NOT NULL,
password text NOT NULL,
serverkey text NOT NULL DEFAULT '',
salt text NOT NULL DEFAULT '',
iterationcount integer NOT NULL DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (server_host, username)
PRIMARY KEY (server_host, username, type)
);
+5 -3
View File
@@ -1,5 +1,5 @@
--
-- ejabberd, Copyright (C) 2002-2024 ProcessOne
-- ejabberd, Copyright (C) 2002-2025 ProcessOne
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
@@ -17,12 +17,14 @@
--
CREATE TABLE users (
username text PRIMARY KEY,
username text,
type smallint,
password text NOT NULL,
serverkey text NOT NULL DEFAULT '',
salt text NOT NULL DEFAULT '',
iterationcount integer NOT NULL DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
primary key (username, type)
);
+4 -2
View File
@@ -1,5 +1,5 @@
--
-- ejabberd, Copyright (C) 2002-2024 ProcessOne
-- ejabberd, Copyright (C) 2002-2025 ProcessOne
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
@@ -403,6 +403,7 @@ WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW
CREATE TABLE [dbo].[users] (
[username] [varchar] (250) NOT NULL,
[server_host] [varchar] (250) NOT NULL,
[type] [smallint] NOT NULL,
[password] [text] NOT NULL,
[serverkey] [text] NOT NULL DEFAULT '',
[salt] [text] NOT NULL DEFAULT '',
@@ -411,7 +412,8 @@ CREATE TABLE [dbo].[users] (
CONSTRAINT [users_PRIMARY] PRIMARY KEY CLUSTERED
(
[server_host] ASC,
[username] ASC
[username] ASC,
[type] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
) TEXTIMAGE_ON [PRIMARY];
+4 -2
View File
@@ -1,5 +1,5 @@
--
-- ejabberd, Copyright (C) 2002-2024 ProcessOne
-- ejabberd, Copyright (C) 2002-2025 ProcessOne
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
@@ -379,6 +379,7 @@ WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW
CREATE TABLE [dbo].[users] (
[username] [varchar] (250) NOT NULL,
[type] [smallint] NOT NULL,
[password] [text] NOT NULL,
[serverkey] [text] NOT NULL DEFAULT '',
[salt] [text] NOT NULL DEFAULT '',
@@ -386,7 +387,8 @@ CREATE TABLE [dbo].[users] (
[created_at] [datetime] NOT NULL DEFAULT GETDATE(),
CONSTRAINT [users_PRIMARY] PRIMARY KEY CLUSTERED
(
[username] ASC
[username] ASC,
[type] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
) TEXTIMAGE_ON [PRIMARY];
+4 -3
View File
@@ -1,5 +1,5 @@
--
-- ejabberd, Copyright (C) 2002-2024 ProcessOne
-- ejabberd, Copyright (C) 2002-2025 ProcessOne
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
@@ -18,13 +18,14 @@
CREATE TABLE users (
username varchar(191) NOT NULL,
type smallint NOT NULL,
server_host varchar(191) NOT NULL,
password text NOT NULL,
serverkey varchar(128) NOT NULL DEFAULT '',
salt varchar(128) NOT NULL DEFAULT '',
iterationcount integer NOT NULL DEFAULT 0,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (server_host(191), username)
PRIMARY KEY (server_host(191), username, type)
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Add support for SCRAM auth to a database created before ejabberd 16.03:
@@ -122,7 +123,7 @@ CREATE INDEX i_archive_sh_timestamp USING BTREE ON archive(server_host(191), tim
CREATE INDEX i_archive_sh_username_origin_id USING BTREE ON archive(server_host(191), username(191), origin_id(191));
-- To update 'archive' from ejabberd <= 23.10:
-- ALTER TABLE archive ADD COLUMN origin_id text NOT NULL DEFAULT '';
-- ALTER TABLE archive ADD COLUMN origin_id varchar(191) NOT NULL DEFAULT '';
-- ALTER TABLE archive ALTER COLUMN origin_id DROP DEFAULT;
-- CREATE INDEX i_archive_sh_username_origin_id USING BTREE ON archive(server_host(191), username(191), origin_id(191));
+6 -4
View File
@@ -1,5 +1,5 @@
--
-- ejabberd, Copyright (C) 2002-2024 ProcessOne
-- ejabberd, Copyright (C) 2002-2025 ProcessOne
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
@@ -17,12 +17,14 @@
--
CREATE TABLE users (
username varchar(191) PRIMARY KEY,
username varchar(191) NOT NULL,
type smallint NOT NULL,,
password text NOT NULL,
serverkey varchar(128) NOT NULL DEFAULT '',
salt varchar(128) NOT NULL DEFAULT '',
iterationcount integer NOT NULL DEFAULT 0,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (username, type)
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Add support for SCRAM auth to a database created before ejabberd 16.03:
@@ -110,7 +112,7 @@ CREATE INDEX i_timestamp USING BTREE ON archive(timestamp);
CREATE INDEX i_archive_username_origin_id USING BTREE ON archive(username(191), origin_id(191));
-- To update 'archive' from ejabberd <= 23.10:
-- ALTER TABLE archive ADD COLUMN origin_id text NOT NULL DEFAULT '';
-- ALTER TABLE archive ADD COLUMN origin_id varchar(191) NOT NULL DEFAULT '';
-- ALTER TABLE archive ALTER COLUMN origin_id DROP DEFAULT;
-- CREATE INDEX i_archive_username_origin_id USING BTREE ON archive(username(191), origin_id(191));
+3 -2
View File
@@ -1,5 +1,5 @@
--
-- ejabberd, Copyright (C) 2002-2024 ProcessOne
-- ejabberd, Copyright (C) 2002-2025 ProcessOne
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
@@ -172,12 +172,13 @@
CREATE TABLE users (
username text NOT NULL,
server_host text NOT NULL,
"type" smallint NOT NULL,
"password" text NOT NULL,
serverkey text NOT NULL DEFAULT '',
salt text NOT NULL DEFAULT '',
iterationcount integer NOT NULL DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT now(),
PRIMARY KEY (server_host, username)
PRIMARY KEY (server_host, username, "type")
);
-- Add support for SCRAM auth to a database created before ejabberd 16.03:
+5 -3
View File
@@ -1,5 +1,5 @@
--
-- ejabberd, Copyright (C) 2002-2024 ProcessOne
-- ejabberd, Copyright (C) 2002-2025 ProcessOne
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
@@ -17,12 +17,14 @@
--
CREATE TABLE users (
username text PRIMARY KEY,
username text NOT NULL,
"type" smallint NOT NULL
"password" text NOT NULL,
serverkey text NOT NULL DEFAULT '',
salt text NOT NULL DEFAULT '',
iterationcount integer NOT NULL DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT now()
created_at TIMESTAMP NOT NULL DEFAULT now(),
PRIMARY KEY (username, "type")
);
-- Add support for SCRAM auth to a database created before ejabberd 16.03:
+3 -3
View File
@@ -1,5 +1,5 @@
%%%----------------------------------------------------------------------
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -106,8 +106,8 @@ match_acl(_Host, {shared_group, {G, H}}, #{usr := {U, S, _}}) ->
undefined -> false;
Mod -> Mod:is_user_in_group({U, S}, G, H)
end;
match_acl(Host, {shared_group, G}, Map) ->
match_acl(Host, {shared_group, {G, Host}}, Map);
match_acl(Host, {shared_group, G}, #{usr := {_, S, _}} = Map) ->
match_acl(Host, {shared_group, {G, S}}, Map);
match_acl(_Host, {user_regexp, {UR, S1}}, #{usr := {U, S2, _}}) ->
S1 == S2 andalso match_regexp(U, UR);
match_acl(_Host, {user_regexp, UR}, #{usr := {U, S, _}}) ->
+12 -10
View File
@@ -3,7 +3,7 @@
%%% Purpose : Validator for ejabberd configuration options
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -505,10 +505,15 @@ db_type(M) ->
and_then(
atom(),
fun(T) ->
case code:ensure_loaded(db_module(M, T)) of
{module, _} -> T;
{error, _} -> fail({bad_db_type, M, T})
end
case code:ensure_loaded(db_module(M, T)) of
{module, _} -> T;
{error, _} ->
ElixirModule = "Elixir." ++ atom_to_list(T),
case code:ensure_loaded(list_to_atom(ElixirModule)) of
{module, _} -> list_to_atom(ElixirModule);
{error, _} -> fail({bad_db_type, M, T})
end
end
end).
-spec queue_type() -> yconf:validator(ram | file).
@@ -541,13 +546,10 @@ sip_uri() ->
-spec host() -> yconf:validator(binary()).
host() ->
fun(Domain) ->
Host = ejabberd_config:get_myname(),
Hosts = ejabberd_config:get_option(hosts),
Domain1 = (binary())(Domain),
Domain2 = misc:expand_keyword(<<"@HOST@">>, Domain1, Host),
Domain3 = (domain())(Domain2),
Domain3 = (domain())(Domain),
case lists:member(Domain3, Hosts) of
true -> fail({route_conflict, Domain3});
true -> fail({route_conflict, Domain});
false -> Domain3
end
end.
+3 -3
View File
@@ -2,9 +2,9 @@
{ok, Terms} ->
Backends = [mssql, mysql, odbc, pgsql, redis, sqlite],
EBs = lists:filter(fun(Backend) -> lists:member({Backend, true}, Terms) end, Backends),
Elixirs = case lists:keyfind(elixir, 1, Terms) of
{elixir, true} -> [elixir, iex, logger, mix];
_ -> []
Elixirs = case proplists:get_bool(elixir, Terms) of
true -> [elixir, logger, mix];
false -> []
end,
ProfileEnvironmentVariable = os:getenv("REBAR_PROFILE"),
+28 -19
View File
@@ -5,7 +5,7 @@
%%% Created : 16 Nov 2002 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -29,23 +29,20 @@
-protocol({rfc, 6122}).
-protocol({rfc, 7590}).
-protocol({xep, 4, '2.9'}).
-protocol({xep, 59, '1.0'}).
-protocol({xep, 86, '1.0'}).
-protocol({xep, 106, '1.1'}).
-protocol({xep, 170, '1.0'}).
-protocol({xep, 205, '1.0'}).
-protocol({xep, 212, '1.0'}).
-protocol({xep, 216, '1.0'}).
-protocol({xep, 243, '1.0'}).
-protocol({xep, 270, '1.0'}).
-protocol({xep, 368, '1.1.0'}).
-protocol({xep, 386, '0.3.0', '24.02', "", ""}).
-protocol({xep, 388, '0.4.0', '24.02', "", ""}).
-protocol({xep, 424, '0.4.0', '24.02', "", ""}).
-protocol({xep, 440, '0.4.0', '24.02', "", ""}).
-protocol({xep, 474, '0.3.0', '24.02', "", ""}).
-protocol({xep, 485, '0.2.0', '24.02', "", "mod_pubsub_serverinfo in ejabberd-contrib.git"}).
-protocol({xep, 4, '2.9', '0.5.0', "complete", ""}).
-protocol({xep, 59, '1.0', '2.1.0', "complete", ""}).
-protocol({xep, 82, '1.1.1', '2.1.0', "complete", ""}).
-protocol({xep, 86, '1.0', '0.5.0', "complete", ""}).
-protocol({xep, 106, '1.1', '0.5.0', "complete", ""}).
-protocol({xep, 170, '1.0', '17.12', "complete", ""}).
-protocol({xep, 178, '1.1', '17.03', "complete", ""}).
-protocol({xep, 205, '1.0', '1.1.2', "complete", ""}).
-protocol({xep, 368, '1.1.0', '17.09', "complete", ""}).
-protocol({xep, 386, '0.3.0', '24.02', "complete", ""}).
-protocol({xep, 388, '0.4.0', '24.02', "complete", ""}).
-protocol({xep, 440, '0.4.0', '24.02', "complete", ""}).
-protocol({xep, 474, '0.4.0', '24.02', "complete", "0.4.0 since 25.03"}).
-protocol({xep, 485, '0.2.0', '24.02', "complete", "mod_pubsub_serverinfo in ejabberd-contrib.git"}).
-export([start/0, stop/0, halt/0, start_app/1, start_app/2,
get_pid_file/0, check_apps/0, module_name/1, is_loaded/0]).
@@ -53,7 +50,10 @@
-include("logger.hrl").
start() ->
application:ensure_all_started(ejabberd).
case application:ensure_all_started(ejabberd) of
{error, Err} -> error_logger:error_msg("Failed to start ejabberd application: ~p", [Err]);
Ok -> Ok
end.
stop() ->
application:stop(ejabberd).
@@ -176,6 +176,15 @@ module_name([Dir, _, <<H,_/binary>> | _] = Mod) when H >= 65, H =< 90 ->
Lib -> <<"Elixir.Ejabberd.", Lib/binary, ".">>
end,
misc:binary_to_atom(<<Prefix/binary, Module/binary>>);
module_name([<<"auth">> | T] = Mod) ->
case hd(T) of
%% T already starts with "Elixir" if an Elixir module is
%% loaded with that name, as per `econf:db_type/1`
<<"Elixir", _/binary>> -> misc:binary_to_atom(hd(T));
_ -> module_name([<<"ejabberd">>] ++ Mod)
end;
module_name([<<"ejabberd">> | _] = Mod) ->
Module = str:join([erlang_name(M) || M<-Mod], $_),
misc:binary_to_atom(Module);
+13 -3
View File
@@ -5,7 +5,7 @@
%%% Created : 7 Sep 2016 by Paweł Chmielowski <pawel@process-one.net>
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -344,10 +344,20 @@ validator(from) ->
fun(L) when is_list(L) ->
lists:map(
fun({K, V}) -> {(econf:enum([tag]))(K), (econf:binary())(V)};
(A) -> (econf:enum([ejabberd_xmlrpc, mod_cron, mod_http_api, ejabberd_ctl, ejabberd_web_admin]))(A)
(A) -> (econf:enum([ejabberd_ctl,
ejabberd_web_admin,
ejabberd_xmlrpc,
mod_adhoc_api,
mod_cron,
mod_http_api]))(A)
end, lists:flatten(L));
(A) ->
[(econf:enum([ejabberd_xmlrpc, mod_cron, mod_http_api, ejabberd_ctl, ejabberd_web_admin]))(A)]
[(econf:enum([ejabberd_ctl,
ejabberd_web_admin,
ejabberd_xmlrpc,
mod_adhoc_api,
mod_cron,
mod_http_api]))(A)]
end;
validator(what) ->
econf:and_then(
+1 -1
View File
@@ -1,5 +1,5 @@
%%%----------------------------------------------------------------------
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+106 -50
View File
@@ -5,7 +5,7 @@
%%% Created : 7 May 2006 by Mickael Remond <mremond@process-one.net>
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -33,6 +33,7 @@
status/0, stop/0, restart/0,
reopen_log/0, rotate_log/0,
set_loglevel/1,
evacuate_kindly/2,
stop_kindly/2, send_service_message_all_mucs/2,
registered_vhosts/0,
reload_config/0,
@@ -166,9 +167,24 @@ get_commands_spec() ->
"only on log files generated by some modules.",
module = ?MODULE, function = rotate_log,
args = [], result = {res, rescode}},
#ejabberd_commands{name = evacuate_kindly, tags = [server],
desc = "Evacuate kindly all users (kick and prevent login)",
longdesc = "Inform users and rooms, don't allow login, wait, "
"restart the server, and don't allow new logins.\n"
"Provide the delay in seconds, and the "
"announcement quoted, for example: \n"
"`ejabberdctl evacuate_kindly 60 "
"\\\"The server will stop in one minute.\\\"`",
note = "added in 24.12",
module = ?MODULE, function = evacuate_kindly,
args_desc = ["Seconds to wait", "Announcement to send, with quotes"],
args_example = [60, <<"Server will stop now.">>],
args = [{delay, integer}, {announcement, string}],
result = {res, rescode}},
#ejabberd_commands{name = stop_kindly, tags = [server],
desc = "Inform users and rooms, wait, and stop the server",
longdesc = "Provide the delay in seconds, and the "
desc = "Stop kindly the server (informing users)",
longdesc = "Inform users and rooms, wait, and stop the server.\n"
"Provide the delay in seconds, and the "
"announcement quoted, for example: \n"
"`ejabberdctl stop_kindly 60 "
"\\\"The server will stop in one minute.\\\"`",
@@ -203,6 +219,7 @@ get_commands_spec() ->
#ejabberd_commands{name = update, tags = [server],
desc = "Update the given module",
longdesc = "To update all the possible modules, use `all`.",
note = "improved in 24.10",
module = ?MODULE, function = update,
args_example = ["all"],
args = [{module, string}],
@@ -251,6 +268,16 @@ get_commands_spec() ->
#ejabberd_commands{name = join_cluster, tags = [cluster],
desc = "Join our local node into the cluster handled by Node",
longdesc = "This command returns immediately,
even before the joining process has
completed. Consequently, if you are using
`ejabberdctl` (or some `CTL_ON_` container
environment variables) to run more commands
afterwards, you may want to precede them with
the _`started`_ command to ensure the
clustering process has completed before
proceeding. For example: `join_cluster
ejabberd@main` > `started` > `list_cluster`.",
note = "improved in 24.06",
module = ?MODULE, function = join_cluster,
args_desc = ["Nodename of the node to join"],
@@ -270,7 +297,7 @@ get_commands_spec() ->
longdesc = "This command can be run from any running "
"node of the cluster, even the node to be removed. "
"In the removed node, this command works only when "
"using ejabberdctl, not mod_http_api or other code that "
"using ejabberdctl, not _`mod_http_api`_ or other code that "
"runs inside the same ejabberd node that will leave.",
module = ?MODULE, function = leave_cluster,
args_desc = ["Nodename of the node to kick from the cluster"],
@@ -370,17 +397,17 @@ get_commands_spec() ->
args = [{out, string}],
result = {res, rescode}},
#ejabberd_commands{name = delete_expired_messages, tags = [purge],
#ejabberd_commands{name = delete_expired_messages, tags = [offline, purge],
desc = "Delete expired offline messages from database",
module = ?MODULE, function = delete_expired_messages,
args = [], result = {res, rescode}},
#ejabberd_commands{name = delete_old_messages, tags = [purge],
#ejabberd_commands{name = delete_old_messages, tags = [offline, purge],
desc = "Delete offline messages older than DAYS",
module = ?MODULE, function = delete_old_messages,
args_desc = ["Number of days"],
args_example = [31],
args = [{days, integer}], result = {res, rescode}},
#ejabberd_commands{name = delete_old_messages_batch, tags = [purge],
#ejabberd_commands{name = delete_old_messages_batch, tags = [offline, purge],
desc = "Delete offline messages older than DAYS",
note = "added in 22.05",
module = ?MODULE, function = delete_old_messages_batch,
@@ -393,7 +420,7 @@ get_commands_spec() ->
result = {res, restuple},
result_desc = "Result tuple",
result_example = {ok, <<"Removal of 5000 messages in progress">>}},
#ejabberd_commands{name = delete_old_messages_status, tags = [purge],
#ejabberd_commands{name = delete_old_messages_status, tags = [offline, purge],
desc = "Status of delete old offline messages operation",
note = "added in 22.05",
module = ?MODULE, function = delete_old_messages_status,
@@ -403,7 +430,7 @@ get_commands_spec() ->
result = {status, string},
result_desc = "Status test",
result_example = "Operation in progress, delete 5000 messages"},
#ejabberd_commands{name = abort_delete_old_messages, tags = [purge],
#ejabberd_commands{name = abort_delete_old_messages, tags = [offline, purge],
desc = "Abort currently running delete old offline messages operation",
note = "added in 22.05",
module = ?MODULE, function = delete_old_messages_abort,
@@ -528,7 +555,7 @@ get_commands_spec() ->
module = ejabberd_doc, function = man,
args = [], result = {res, restuple}},
#ejabberd_commands{name = webadmin_host_user_queue, tags = [internal],
#ejabberd_commands{name = webadmin_host_user_queue, tags = [offline, internal],
desc = "Generate WebAdmin offline queue HTML",
module = mod_offline, function = webadmin_host_user_queue,
args = [{user, binary}, {host, binary}, {query, any}, {lang, binary}],
@@ -571,8 +598,9 @@ get_commands_spec() ->
args = [{node, atom}, {table, binary}, {page, integer}],
result = {res, any}},
#ejabberd_commands{name = mnesia_list_tables, tags = [internal, mnesia],
#ejabberd_commands{name = mnesia_list_tables, tags = [mnesia],
desc = "List of Mnesia tables",
note = "added in 25.03",
module = ?MODULE, function = mnesia_list_tables,
result = {tables, {list, {table, {tuple, [{name, atom},
{storage_type, binary},
@@ -588,8 +616,10 @@ get_commands_spec() ->
{value, binary}
]}}}}},
#ejabberd_commands{name = mnesia_table_change_storage, tags = [internal, mnesia],
desc = "Change storage type of a Mnesia table to: ram_copies, disc_copies, or disc_only_copies.",
#ejabberd_commands{name = mnesia_table_change_storage, tags = [mnesia],
desc = "Change storage type of a Mnesia table",
note = "added in 25.03",
longdesc = "Storage type can be: `ram_copies`, `disc_copies`, `disc_only_copies`, `remote_copy`.",
module = ?MODULE, function = mnesia_table_change_storage,
args = [{table, binary}, {storage_type, binary}],
result = {res, restuple}},
@@ -636,7 +666,7 @@ status() ->
{value, {_, _, Version}} ->
{ok, io_lib:format("ejabberd ~s is running in that node", [Version])}
end,
{Is_running, String1 ++ " " ++String2}.
{Is_running, String1 ++ "\n" ++String2}.
stop() ->
_ = supervisor:terminate_child(ejabberd_sup, ejabberd_sm),
@@ -671,39 +701,49 @@ set_loglevel(LogLevel) ->
%%% Stop Kindly
%%%
evacuate_kindly(DelaySeconds, AnnouncementTextString) ->
perform_kindly(DelaySeconds, AnnouncementTextString, evacuate).
stop_kindly(DelaySeconds, AnnouncementTextString) ->
Subject = (str:format("Server stop in ~p seconds!", [DelaySeconds])),
WaitingDesc = (str:format("Waiting ~p seconds", [DelaySeconds])),
perform_kindly(DelaySeconds, AnnouncementTextString, stop).
perform_kindly(DelaySeconds, AnnouncementTextString, Action) ->
Subject = str:format("Server stop in ~p seconds!", [DelaySeconds]),
WaitingDesc = str:format("Waiting ~p seconds", [DelaySeconds]),
AnnouncementText = list_to_binary(AnnouncementTextString),
Steps = [
{"Stopping ejabberd port listeners",
ejabberd_listener, stop_listeners, []},
{"Sending announcement to connected users",
mod_announce, send_announcement_to_all,
[ejabberd_config:get_myname(), Subject, AnnouncementText]},
{"Sending service message to MUC rooms",
ejabberd_admin, send_service_message_all_mucs,
[Subject, AnnouncementText]},
{WaitingDesc, timer, sleep, [DelaySeconds * 1000]},
{"Stopping ejabberd", application, stop, [ejabberd]},
{"Stopping Mnesia", mnesia, stop, []},
{"Stopping Erlang node", init, stop, []}
],
PreSteps =
[{"Stopping ejabberd port listeners", ejabberd_listener, stop_listeners, []},
{"Sending announcement to connected users",
mod_announce,
send_announcement_to_all,
[ejabberd_config:get_myname(), Subject, AnnouncementText]},
{"Sending service message to MUC rooms",
ejabberd_admin,
send_service_message_all_mucs,
[Subject, AnnouncementText]},
{WaitingDesc, timer, sleep, [DelaySeconds * 1000]},
{"Stopping ejabberd", application, stop, [ejabberd]}],
SpecificSteps =
case Action of
evacuate ->
[{"Starting ejabberd", application, start, [ejabberd]},
{"Stopping ejabberd port listeners", ejabberd_listener, stop_listeners, []}];
stop ->
[{"Stopping Mnesia", mnesia, stop, []}, {"Stopping Erlang node", init, stop, []}]
end,
Steps = PreSteps ++ SpecificSteps,
NumberLast = length(Steps),
TimestampStart = calendar:datetime_to_gregorian_seconds({date(), time()}),
lists:foldl(
fun({Desc, Mod, Func, Args}, NumberThis) ->
SecondsDiff =
calendar:datetime_to_gregorian_seconds({date(), time()})
- TimestampStart,
io:format("[~p/~p ~ps] ~ts... ",
[NumberThis, NumberLast, SecondsDiff, Desc]),
Result = (catch apply(Mod, Func, Args)),
io:format("~p~n", [Result]),
NumberThis+1
end,
1,
Steps),
lists:foldl(fun({Desc, Mod, Func, Args}, NumberThis) ->
SecondsDiff =
calendar:datetime_to_gregorian_seconds({date(), time()}) - TimestampStart,
io:format("[~p/~p ~ps] ~ts... ", [NumberThis, NumberLast, SecondsDiff, Desc]),
Result = (catch apply(Mod, Func, Args)),
io:format("~p~n", [Result]),
NumberThis + 1
end,
1,
Steps),
ok.
send_service_message_all_mucs(Subject, AnnouncementText) ->
@@ -746,7 +786,7 @@ update_module(ModuleNameString) ->
case ejabberd_update:update([ModuleName]) of
{ok, []} ->
{ok, "Not updated: "++ModuleNameString};
{ok, [{ModuleName, _}]} ->
{ok, [ModuleName]} ->
{ok, "Updated: "++ModuleNameString};
{error, Reason} -> {error, Reason}
end.
@@ -894,14 +934,14 @@ get_cluster_node_details(Node, RunningNodes) ->
get_cluster_node_details2(Node, lists:member(Node, RunningNodes)).
get_cluster_node_details2(Node, false) ->
{Node, "false", "", -1, -1, -1, "unknown"};
{Node, "false", "", -1, -1, -1, unknown};
get_cluster_node_details2(Node, true) ->
try ejabberd_cluster:call(Node, ejabberd_admin, get_cluster_node_details3, []) of
Result -> Result
catch
E:R ->
Status = io_lib:format("~p: ~p", [E, R]),
{Node, "true", Status, -1, -1, -1, "unknown"}
{Node, "true", Status, -1, -1, -1, unknown}
end.
get_cluster_node_details3() ->
@@ -1244,13 +1284,12 @@ is_my_host(Host) ->
%% @format-begin
%% mnesia:del_table_copy(Table, Node);
%% mnesia:change_table_copy_type(Table, Node, Type);
mnesia_table_change_storage(STable, SType) ->
Table = binary_to_existing_atom(STable, latin1),
Type =
case SType of
<<"remote_copy">> ->
remote_copy;
<<"ram_copies">> ->
ram_copies;
<<"disc_copies">> ->
@@ -1260,7 +1299,24 @@ mnesia_table_change_storage(STable, SType) ->
_ ->
false
end,
mnesia:add_table_copy(Table, node(), Type).
Node = node(),
Result =
case Type of
false ->
"Nothing to do";
remote_copy ->
mnesia:del_table_copy(Table, Node),
"Deleted table copy";
_ ->
case mnesia:add_table_copy(Table, Node, Type) of
{aborted, _} ->
mnesia:change_table_copy_type(Table, Node, Type),
"Changed table copy type";
_ ->
"Added table copy"
end
end,
{ok, Result}.
mnesia_table_clear(STable) ->
Table = binary_to_existing_atom(STable, latin1),
+21 -2
View File
@@ -5,7 +5,7 @@
%%% Created : 31 Jan 2003 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -59,10 +59,14 @@ start(normal, _Args) ->
ejabberd_hooks:run(ejabberd_started, []),
ejabberd:check_apps(),
ejabberd_systemd:ready(),
maybe_start_exsync(),
{T2, _} = statistics(wall_clock),
?INFO_MSG("ejabberd ~ts is started in the node ~p in ~.2fs",
[ejabberd_option:version(),
node(), (T2-T1)/1000]),
maybe_print_elixir_version(),
?INFO_MSG("~ts",
[erlang:system_info(system_version)]),
{ok, SupPid};
Err ->
?CRITICAL_MSG("Failed to start ejabberd application: ~p", [Err]),
@@ -175,7 +179,11 @@ file_queue_init() ->
-ifdef(ELIXIR_ENABLED).
is_using_elixir_config() ->
Config = ejabberd_config:path(),
'Elixir.Ejabberd.ConfigUtil':is_elixir_config(Config).
try 'Elixir.Ejabberd.ConfigUtil':is_elixir_config(Config) of
B when is_boolean(B) -> B
catch
_:_ -> false
end.
setup_if_elixir_conf_used() ->
case is_using_elixir_config() of
@@ -194,8 +202,19 @@ start_elixir_application() ->
ok -> ok;
{error, _Msg} -> ?ERROR_MSG("Elixir application not started.", [])
end.
maybe_start_exsync() ->
case os:getenv("RELIVE") of
"true" -> rpc:call(node(), 'Elixir.ExSync.Application', start, []);
_ -> ok
end.
maybe_print_elixir_version() ->
?INFO_MSG("Elixir ~ts", [maps:get(build, 'Elixir.System':build_info())]).
-else.
setup_if_elixir_conf_used() -> ok.
register_elixir_config_hooks() -> ok.
start_elixir_application() -> ok.
maybe_start_exsync() -> ok.
maybe_print_elixir_version() -> ok.
-endif.
+233 -88
View File
@@ -5,7 +5,7 @@
%%% Created : 23 Nov 2002 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -48,7 +48,7 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-export([auth_modules/1, convert_to_scram/1]).
-export([auth_modules/1, convert_to_scram/1, drop_password_type/2, set_password_instance/3]).
-include_lib("xmpp/include/scram.hrl").
-include("logger.hrl").
@@ -76,26 +76,38 @@
-callback store_type(binary()) -> plain | external | scram.
-callback set_password(binary(), binary(), password()) ->
{ets_cache:tag(), {ok, password()} | {error, db_failure | not_allowed}}.
-callback set_password_multiple(binary(), binary(), [password()]) ->
{ets_cache:tag(), {ok, [password()]} | {error, db_failure | not_allowed}}.
-callback set_password_instance(binary(), binary(), password()) ->
ok | {error, db_failure | not_allowed}.
-callback remove_user(binary(), binary()) -> ok | {error, db_failure | not_allowed}.
-callback user_exists(binary(), binary()) -> {ets_cache:tag(), boolean() | {error, db_failure}}.
-callback check_password(binary(), binary(), binary(), binary()) -> {ets_cache:tag(), boolean() | {stop, boolean()}}.
-callback try_register(binary(), binary(), password()) ->
{ets_cache:tag(), {ok, password()} | {error, exists | db_failure | not_allowed}}.
-callback try_register_multiple(binary(), binary(), [password()]) ->
{ets_cache:tag(), {ok, [password()]} | {error, exists | db_failure | not_allowed}}.
-callback get_users(binary(), opts()) -> [{binary(), binary()}].
-callback count_users(binary(), opts()) -> number().
-callback get_password(binary(), binary()) -> {ets_cache:tag(), {ok, password()} | error}.
-callback get_password(binary(), binary()) -> {ets_cache:tag(), {ok, password() | [password()]} | error}.
-callback drop_password_type(binary(), atom()) ->
ok | {error, db_failure | not_allowed}.
-callback use_cache(binary()) -> boolean().
-callback cache_nodes(binary()) -> boolean().
-optional_callbacks([reload/1,
set_password/3,
set_password_multiple/3,
set_password_instance/3,
remove_user/2,
user_exists/2,
check_password/4,
try_register/3,
try_register_multiple/3,
get_users/2,
count_users/2,
get_password/2,
drop_password_type/2,
use_cache/1,
cache_nodes/1]).
@@ -265,15 +277,41 @@ check_password_with_authmodule(User, AuthzId, Server, Password, Digest, DigestGe
false
end.
convert_password_for_storage(_Server, #scram{} = Password) ->
{Password, [Password]};
convert_password_for_storage(Server, Password) ->
P = case ejabberd_option:auth_stored_password_types(Server) of
[] ->
case ejabberd_option:auth_password_format(Server) of
plain ->
[Password];
_ ->
[password_to_scram(Server, Password)]
end;
M ->
lists:sort(lists:map(
fun(scram_sha1) ->
password_to_scram(Server, Password, sha, ?SCRAM_DEFAULT_ITERATION_COUNT);
(scram_sha256) ->
password_to_scram(Server, Password, sha256, ?SCRAM_DEFAULT_ITERATION_COUNT);
(scram_sha512) ->
password_to_scram(Server, Password, sha512, ?SCRAM_DEFAULT_ITERATION_COUNT);
(plain) ->
Password
end, M))
end,
{Password, P}.
-spec set_password(binary(), binary(), password()) -> ok | {error,
db_failure | not_allowed |
invalid_jid | invalid_password}.
set_password(User, Server, Password) ->
case validate_credentials(User, Server, Password) of
{ok, LUser, LServer} ->
{Plain, Passwords} = convert_password_for_storage(Server, Password),
lists:foldl(
fun(M, {error, _}) ->
db_set_password(LUser, LServer, Password, M);
db_set_password(LUser, LServer, Plain, Passwords, M);
(_, ok) ->
ok
end, {error, not_allowed}, auth_modules(LServer));
@@ -281,6 +319,32 @@ set_password(User, Server, Password) ->
Err
end.
set_password_instance(User, Server, Password) ->
case validate_credentials(User, Server, Password) of
{ok, LUser, LServer} ->
lists:foldl(
fun(Mod, {error, _} = Acc) ->
case erlang:function_exported(Mod, set_password_instance, 3) of
true ->
R = Mod:set_password_instance(LUser, LServer, Password),
case use_cache(Mod, LServer) of
true ->
ets_cache:delete(cache_tab(Mod), {LUser, LServer},
cache_nodes(Mod, LServer));
_ ->
ok
end,
R;
_ ->
Acc
end;
(_, ok) ->
ok
end, {error, not_allowed}, auth_modules(LServer));
Err ->
Err
end.
-spec try_register(binary(), binary(), password()) -> ok | {error,
db_failure | not_allowed | exists |
invalid_jid | invalid_password}.
@@ -293,19 +357,25 @@ try_register(User, Server, Password) ->
false ->
case ejabberd_router:is_my_host(LServer) of
true ->
case lists:foldl(
fun(_, ok) ->
ok;
(Mod, _) ->
db_try_register(
LUser, LServer, Password, Mod)
end, {error, not_allowed},
auth_modules(LServer)) of
ok ->
ejabberd_hooks:run(
register_user, LServer, [LUser, LServer]);
{error, _} = Err ->
Err
case ejabberd_hooks:run_fold(check_register_user, LServer, true,
[User, Server, Password]) of
true ->
{Plain, Passwords} = convert_password_for_storage(Server, Password),
case lists:foldl(
fun(_, ok) ->
ok;
(Mod, _) ->
db_try_register(
LUser, LServer, Plain, Passwords, Mod)
end, {error, not_allowed}, auth_modules(LServer)) of
ok ->
ejabberd_hooks:run(
register_user, LServer, [LUser, LServer]);
{error, _} = Err ->
Err
end;
false ->
{error, not_allowed}
end;
false ->
{error, not_allowed}
@@ -351,32 +421,27 @@ count_users(Server, Opts) ->
auth_modules(LServer)))
end.
-spec get_password(binary(), binary()) -> false | password().
-spec get_password(binary(), binary()) -> false | [password()].
get_password(User, Server) ->
case validate_credentials(User, Server) of
{ok, LUser, LServer} ->
case lists:foldl(
fun(M, error) -> db_get_password(LUser, LServer, M);
(_M, Acc) -> Acc
end, error, auth_modules(LServer)) of
{ok, Password} ->
Password;
error ->
false
end;
_ ->
false
case get_password_with_authmodule(User, Server) of
{Passwords, _} -> Passwords
end.
-spec get_password_s(binary(), binary()) -> password().
get_password_s(User, Server) ->
case get_password(User, Server) of
false -> <<"">>;
Password -> Password
Passwords ->
{_, Pass} = lists:foldl(
fun(Plain, _) when is_binary(Plain) -> {true, Plain};
(Pass, {false, _}) -> {true, Pass};
(_, Acc) -> Acc
end, {false, <<"">>}, Passwords),
Pass
end.
-spec get_password_with_authmodule(binary(), binary()) ->
{false | {false, atom(), binary()} | password(), module()}.
{false | {false, atom(), binary()} | [password()], module()}.
get_password_with_authmodule(User, Server) ->
case validate_credentials(User, Server) of
{ok, LUser, LServer} ->
@@ -390,8 +455,10 @@ get_password_with_authmodule(User, Server) ->
(_M, Acc) ->
Acc
end, {error, undefined}, auth_modules(LServer)) of
{{ok, Password}, Module} ->
{{ok, Password}, Module} when is_list(Password) ->
{Password, Module};
{{ok, Password}, Module} ->
{[Password], Module};
{error, Module} ->
{false, Module}
end
@@ -450,6 +517,30 @@ user_exists_in_other_modules_loop([AuthModule | AuthModules], User, Server) ->
maybe_exists
end.
drop_password_type(LServer, Type) ->
Hash = case Type of
plain -> plain;
scram_sha1 -> sha;
scram_sha256 -> sha256;
scram_sha512 -> sha512
end,
lists:foreach(
fun(M) ->
case erlang:function_exported(M, drop_password_type, 2) of
true ->
M:drop_password_type(LServer, Hash),
case use_cache(M, LServer) of
true ->
ets_cache:clear(cache_tab(M),
cache_nodes(M, LServer));
false ->
ok
end;
_ ->
ok
end
end, auth_modules(LServer)).
-spec which_users_exists(list({binary(), binary()})) -> list({binary(), binary()}).
which_users_exists(USPairs) ->
ByServer = lists:foldl(
@@ -587,54 +678,86 @@ get_is_banned(User, Server) ->
%%%----------------------------------------------------------------------
%%% Backend calls
%%%----------------------------------------------------------------------
-spec db_try_register(binary(), binary(), password(), module()) -> ok | {error, exists | db_failure | not_allowed}.
db_try_register(User, Server, Password, Mod) ->
case erlang:function_exported(Mod, try_register, 3) of
-spec db_try_register(binary(), binary(), binary(), [password()], module()) -> ok | {error, exists | db_failure | not_allowed}.
db_try_register(User, Server, PlainPassword, Passwords, Mod) ->
Ret = case erlang:function_exported(Mod, try_register_multiple, 3) of
true ->
Password1 = case Mod:store_type(Server) of
scram -> password_to_scram(Server, Password);
_ -> Password
end,
Ret = case use_cache(Mod, Server) of
true ->
ets_cache:update(
cache_tab(Mod), {User, Server}, {ok, Password},
fun() -> Mod:try_register(User, Server, Password1) end,
cache_nodes(Mod, Server));
false ->
ets_cache:untag(Mod:try_register(User, Server, Password1))
end,
case Ret of
{ok, _} -> ok;
{error, _} = Err -> Err
case use_cache(Mod, Server) of
true ->
ets_cache:update(
cache_tab(Mod), {User, Server}, {ok, Passwords},
fun() -> Mod:try_register_multiple(User, Server, Passwords) end,
cache_nodes(Mod, Server));
false ->
ets_cache:untag(Mod:try_register_multiple(User, Server, Passwords))
end;
false ->
{error, not_allowed}
_ ->
case erlang:function_exported(Mod, try_register, 3) of
true ->
case use_cache(Mod, Server) of
true ->
ets_cache:update(
cache_tab(Mod), {User, Server}, {ok, [PlainPassword]},
fun() ->
case Mod:try_register(User, Server, PlainPassword) of
{Tag, {ok, Pass}} -> {Tag, {ok, [Pass]}};
Other -> Other
end
end, cache_nodes(Mod, Server));
false ->
case Mod:try_register(User, Server, PlainPassword) of
{_, {ok, Pass}} -> {ok, [Pass]};
V -> ets_cache:untag(V)
end
end;
false ->
{error, not_allowed}
end
end,
case Ret of
{ok, _} -> ok;
{error, _} = Err -> Err
end.
-spec db_set_password(binary(), binary(), password(), module()) -> ok | {error, db_failure | not_allowed}.
db_set_password(User, Server, Password, Mod) ->
case erlang:function_exported(Mod, set_password, 3) of
true ->
Password1 = case Mod:store_type(Server) of
scram -> password_to_scram(Server, Password);
_ -> Password
end,
Ret = case use_cache(Mod, Server) of
-spec db_set_password(binary(), binary(), binary(), [password()], module()) -> ok | {error, db_failure | not_allowed}.
db_set_password(User, Server, PlainPassword, Passwords, Mod) ->
Ret = case erlang:function_exported(Mod, set_password_multiple, 3) of
true ->
case use_cache(Mod, Server) of
true ->
ets_cache:update(
cache_tab(Mod), {User, Server}, {ok, Password},
fun() -> Mod:set_password(User, Server, Password1) end,
cache_nodes(Mod, Server));
cache_tab(Mod), {User, Server}, {ok, Passwords},
fun() -> Mod:set_password_multiple(User, Server, Passwords) end,
cache_nodes(Mod, Server));
false ->
ets_cache:untag(Mod:set_password(User, Server, Password1))
end,
case Ret of
{ok, _} -> ok;
{error, _} = Err -> Err
end;
false ->
{error, not_allowed}
ets_cache:untag(Mod:set_password_multiple(User, Server, Passwords))
end;
_ ->
case erlang:function_exported(Mod, set_password, 3) of
true ->
case use_cache(Mod, Server) of
true ->
ets_cache:update(
cache_tab(Mod), {User, Server}, {ok, [PlainPassword]},
fun() ->
case Mod:set_password(User, Server, PlainPassword) of
{Tag, {ok, Pass}} -> {Tag, {ok, [Pass]}};
Other -> Other
end
end, cache_nodes(Mod, Server));
false ->
case Mod:set_password(User, Server, PlainPassword) of
{_, {ok, Pass}} -> {ok, [Pass]};
V -> ets_cache:untag(V)
end
end;
false ->
{error, not_allowed}
end
end,
case Ret of
{ok, _} -> ok;
{error, _} = Err -> Err
end.
db_get_password(User, Server, Mod) ->
@@ -644,16 +767,28 @@ db_get_password(User, Server, Mod) ->
case ets_cache:lookup(cache_tab(Mod), {User, Server}) of
{ok, exists} -> error;
not_found -> error;
{ok, List} = V when is_list(List) -> V;
{ok, Single} -> {ok, [Single]};
Other -> Other
end;
false ->
error;
true when UseCache ->
ets_cache:lookup(
cache_tab(Mod), {User, Server},
fun() -> Mod:get_password(User, Server) end);
cache_tab(Mod), {User, Server},
fun() ->
case Mod:get_password(User, Server) of
{_, {ok, List}} = V when is_list(List) -> V;
{Tag, {ok, Single}} -> {Tag, {ok, [Single]}};
Other -> Other
end
end);
true ->
ets_cache:untag(Mod:get_password(User, Server))
case Mod:get_password(User, Server) of
{_, {ok, List}} when is_list(List) -> {ok, List};
{_, {ok, Single}} -> {ok, [Single]};
Other -> ets_cache:untag(Other)
end
end.
db_user_exists(User, Server, Mod) ->
@@ -698,8 +833,8 @@ db_user_exists(User, Server, Mod) ->
db_check_password(User, AuthzId, Server, ProvidedPassword,
Digest, DigestFun, Mod) ->
case db_get_password(User, Server, Mod) of
{ok, ValidPassword} ->
match_passwords(ProvidedPassword, ValidPassword, Digest, DigestFun);
{ok, ValidPasswords} ->
match_passwords(ProvidedPassword, ValidPasswords, Digest, DigestFun);
error ->
case {Mod:store_type(Server), use_cache(Mod, Server)} of
{external, true} ->
@@ -804,7 +939,9 @@ password_to_scram(Host, Password) ->
password_to_scram(_Host, #scram{} = Password, _IterationCount) ->
Password;
password_to_scram(Host, Password, IterationCount) ->
Hash = ejabberd_option:auth_scram_hash(Host),
password_to_scram(Host, Password, ejabberd_option:auth_scram_hash(Host), IterationCount).
password_to_scram(_Host, Password, Hash, IterationCount) ->
Salt = p1_rand:bytes(?SALT_LENGTH),
SaltedPassword = scram:salted_password(Hash, Password, Salt, IterationCount),
StoredKey = scram:stored_key(Hash, scram:client_key(Hash, SaltedPassword)),
@@ -888,15 +1025,23 @@ auth_modules() ->
auth_modules(Server) ->
LServer = jid:nameprep(Server),
Methods = ejabberd_option:auth_method(LServer),
[ejabberd:module_name([<<"ejabberd">>, <<"auth">>,
[ejabberd:module_name([<<"auth">>,
misc:atom_to_binary(M)])
|| M <- Methods].
-spec match_passwords(password(), password(),
-spec match_passwords(password(), [password()],
binary(), digest_fun() | undefined) -> boolean().
match_passwords(Password, #scram{} = Scram, <<"">>, undefined) ->
match_passwords(Provided, Passwords, Digest, DigestFun) ->
lists:any(
fun(Pass) ->
match_password(Provided, Pass, Digest, DigestFun)
end, Passwords).
-spec match_password(password(), password(),
binary(), digest_fun() | undefined) -> boolean().
match_password(Password, #scram{} = Scram, <<"">>, undefined) ->
is_password_scram_valid(Password, Scram);
match_passwords(Password, #scram{} = Scram, Digest, DigestFun) ->
match_password(Password, #scram{} = Scram, Digest, DigestFun) ->
StoredKey = base64:decode(Scram#scram.storedkey),
DigRes = if Digest /= <<"">> ->
Digest == DigestFun(StoredKey);
@@ -907,9 +1052,9 @@ match_passwords(Password, #scram{} = Scram, Digest, DigestFun) ->
true ->
StoredKey == Password andalso Password /= <<"">>
end;
match_passwords(ProvidedPassword, ValidPassword, <<"">>, undefined) ->
match_password(ProvidedPassword, ValidPassword, <<"">>, undefined) ->
ProvidedPassword == ValidPassword andalso ProvidedPassword /= <<"">>;
match_passwords(ProvidedPassword, ValidPassword, Digest, DigestFun) ->
match_password(ProvidedPassword, ValidPassword, Digest, DigestFun) ->
DigRes = if Digest /= <<"">> ->
Digest == DigestFun(ValidPassword);
true -> false
@@ -978,7 +1123,7 @@ convert_to_scram(Server) ->
lists:foreach(
fun({U, S}) ->
case get_password(U, S) of
Pass when is_binary(Pass) ->
[Pass] when is_binary(Pass) ->
SPass = password_to_scram(Server, Pass),
set_password(U, S, SPass);
_ ->
+2 -2
View File
@@ -5,7 +5,7 @@
%%% Created : 17 Feb 2006 by Mickael Remond <mremond@process-one.net>
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -28,7 +28,7 @@
-behaviour(ejabberd_auth).
-author('mickael.remond@process-one.net').
-protocol({xep, 175, '1.2'}).
-protocol({xep, 175, '1.2', '1.1.0', "complete", ""}).
-export([start/1,
stop/1,
+1 -1
View File
@@ -5,7 +5,7 @@
%%% Created : 12 Dec 2004 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+4 -4
View File
@@ -5,7 +5,7 @@
%%% Created : 16 Mar 2019 by Mickael Remond <mremond@process-one.net>
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -44,9 +44,9 @@
%%%----------------------------------------------------------------------
start(Host) ->
%% We add our default JWT verifier with hook priority 100.
%% So if you need to check or verify your custom JWT before the
%% default verifier, It's better to use this hook with priority
%% little than 100 and return bool() or {stop, bool()} in your own
%% So if you need to check or verify your custom JWT before the
%% default verifier, It's better to use this hook with priority
%% little than 100 and return bool() or {stop, bool()} in your own
%% callback function.
ejabberd_hooks:add(check_decoded_jwt, Host, ?MODULE, check_decoded_jwt, 100),
case ejabberd_option:jwt_key(Host) of
+1 -1
View File
@@ -5,7 +5,7 @@
%%% Created : 12 Dec 2004 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as

Some files were not shown because too many files have changed in this diff Show More