Compare commits

..

474 Commits

Author SHA1 Message Date
Badlop 654601ff23 Set version to 24.02
Container / Container (push) Failing after 1m44s
Installers / Binaries (push) Failing after 1m32s
Runtime / Rebars (20, rebar) (push) Failing after 4s
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 3s
Runtime / Rebars (26, rebar3) (push) Failing after 3s
Runtime / Rebars (27, rebar) (push) Failing after 47s
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.0-rc1) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.13.4, 23.0) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.13.4, 25) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.15.7, 25) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.15.7, 26) (push) Has been cancelled
Runtime / Rebar3+Elixir (1.15.7, 27.0-rc1) (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.16, 27.0-rc1) (push) Has been cancelled
Runtime / Mix (1.13.4, 23.0) (push) Has been cancelled
Runtime / Mix (1.13.4, 25) (push) Has been cancelled
Runtime / Mix (1.15.7, 25) (push) Has been cancelled
Runtime / Mix (1.15.7, 26) (push) Has been cancelled
Runtime / Mix (1.15.7, 27.0-rc1) (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.16, 27.0-rc1) (push) Has been cancelled
2024-02-27 10:32:55 +01:00
Badlop d29ef59514 Update links to SQL files in the man page 2024-02-27 10:06:40 +01:00
Badlop e3e8b9afb4 COMPILE.md: Update text about OTP release to match current behaviour
Also keep this document direct, short and introductory, there's a
already a section in the ejabberd Docs site with all the details.
2024-02-27 10:06:39 +01:00
Badlop a8e3af3586 Update Japanese translation (thanks to Mako N) 2024-02-27 10:06:37 +01:00
Badlop 11ff7d1ff9 Update Italian translation (thanks to Ermete Melchiorre) 2024-02-27 10:06:36 +01:00
Badlop b04b16825f Revert "CI: Don't run CT with OTP 27 until "Peer certificate rejected" gets solved"
This recent fix in fast_tls solves the problem:
https://github.com/processone/fast_tls/commit/528d9759d6bec714115b5042827726d03e4de0ed

This reverts commit 95e9a63dcb.
2024-02-27 10:06:34 +01:00
Paweł Chmielowski 0f43a7f36b Update deps 2024-02-26 17:26:30 +01:00
Badlop 95e9a63dcb CI: Don't run CT with OTP 27 until "Peer certificate rejected" gets solved 2024-02-26 16:16:19 +01:00
Badlop 146d958fc0 CHANGELOG.md: Update to match the newest commits 2024-02-26 16:16:17 +01:00
Badlop bb349d6085 Update "make edoc" to use ExDoc 2024-02-26 16:16:14 +01:00
Badlop cb9053cd79 Makefile.in: Inform what build tools support some tasks 2024-02-26 16:16:13 +01:00
Badlop 4146f19814 Update man page 2024-02-26 16:16:11 +01:00
Badlop 79eca7c098 Update version number from the unreleased 24.01 to 24.02 2024-02-26 16:16:09 +01:00
Badlop 723c53e1df Revert "Container: Update make-binaries to support setup-beam v1.17.2"
We can now revert commit c81a47a692
because erlef/setup-beam v1.17.3 has recovered its original behavior in
https://github.com/erlef/setup-beam/commit/951dd857ae77719ae708c8feb0d9224247a5ac43
2024-02-26 16:16:08 +01:00
Badlop daca3b558b Use another example, because "archive" is replaced when generating EDoc 2024-02-26 16:16:06 +01:00
Badlop 2075480b14 Improve some documentation: URLs are parsed later when preparing Docs 2024-02-26 16:16:05 +01:00
Badlop e43194d59b README.md: Fix typo in link to COPYING file: its name is plain-text, not markdown 2024-02-26 16:16:03 +01:00
Badlop 8bbc27fd39 CHANGELOG.md: Fix warnings reported by "make edoc" 2024-02-26 16:16:01 +01:00
Badlop 9a9a466bd4 CHANGELOG.md: Lower markdown headers level so they get better rendered 2024-02-26 16:16:00 +01:00
Badlop 92c533f42a CONTRIBUTING.md: Remove anchor with name attribute 2024-02-26 16:15:58 +01:00
Badlop 863b7eee8b CONTAINER.md: Update documentation about sofware version numbers 2024-02-26 16:15:56 +01:00
Badlop 417294339d Matrix: Minor documentation improvements 2024-02-26 16:15:51 +01:00
Holger Weiss 6aaefc663b Fix XEP-0425: Message Moderation with SQL storage
Use the correct server name and room JID when removing moderated
messages from SQL.
2024-02-24 22:06:36 +01:00
Jérôme Sautret a6b10ac4c0 Merge branch 'master' of github.com:processone/ejabberd 2024-02-23 12:09:51 +01:00
Jérôme Sautret 2b7b92edee Add mod_matrix_gw doc 2024-02-23 12:09:10 +01:00
Paweł Chmielowski f4de0cef26 Add alternative types that should fix dialyzer on r26 2024-02-22 17:25:56 +01:00
Paweł Chmielowski 1b5a9c1a1f Fix dialyzer warnings in ejabberd_sql in R27 2024-02-22 16:12:04 +01:00
Badlop a09f222b4c Use Luerl 1.0 for Erlang 20, 1.1.1 for 21-26, and temporary fork for 27
The Luerl 1.1.0 and 1.1.1 hex packages contain garbage files that
break compilation with Erlang 20.
2024-02-21 16:46:37 +01:00
Badlop 5fb76b4918 Use http_uri only when matrix requires it, ammend commit 59ff77e 2024-02-21 16:46:37 +01:00
Badlop 27d5a1d5bb configure.ac: Update enable-tools description to its current usage 2024-02-21 16:46:37 +01:00
Badlop ba1917d23c vars.config.in: Remove comment that nowadays is obsolete 2024-02-21 16:46:37 +01:00
Badlop 0b37d50dac rebar.config.script: Don't check REBAR_PROFILE here
To get release with development tools,
don't check rebar profile here.
Instead, use "./configure --enable-tools" and it will be
checked in ejabberd.app.src.script
2024-02-21 16:46:37 +01:00
Badlop 9275bf40b2 Rebar3/Mix: If dev profile/environment, enable tools automatically 2024-02-21 16:46:37 +01:00
Badlop 4431fbbe5a Include only observer; runtime_tools is automatically added 2024-02-21 16:46:37 +01:00
Badlop 8c64ce67fc CI/Runtime: Test also with the new Erlang/OTP 27.0-rc1 2024-02-21 16:46:26 +01:00
Badlop 1ddc4a5c5d CI/Runtime: For OTP < 24 use rebar binaries from ejabberd 21.12 2024-02-21 16:45:28 +01:00
Badlop 081cab821b Rebar/Rebar3: Update binaries to work with Erlang/OTP 24-27
They are compiled from their git repositories, main branches,
using erlang:24-slim docker image.

To compile ejabberd using rebar/rebar3 and Erlang 20.0 up to 23.3,
you can download the old binaries from ejabberd 21.12, available at:
  https://github.com/processone/ejabberd/raw/21.12/rebar
  https://github.com/processone/ejabberd/raw/21.12/rebar3
2024-02-21 16:45:24 +01:00
Badlop efe5c76469 Runtime: Test compilation with the included rebar/rebar3 binaries 2024-02-19 15:33:09 +01:00
Badlop 16c9b169f2 Runtime: Properly purge nginx in Rebars job, as done in commit 853f35c 2024-02-19 15:33:09 +01:00
Badlop 73f20a8f1e Makefile: Now --with-rebar detects if it's system-installed, otherwise use local one 2024-02-19 15:33:09 +01:00
Badlop 70e430cff1 Makefile: No need to use escript to run rebar|rebar3|mix
Usage of escript to run rebar was added to Makefile.in
when support for rebar2 was added in 4d8f770 for ejabberd 13.10.
Nowadays this seems unnecessary, and configure.ac right now can
determine what binary to use: the sysmte installed or local one.
2024-02-19 15:33:09 +01:00
Badlop aa21aee14b configure: If --with-rebar=rebar3 but rebar3 not system-installed, use local one 2024-02-19 15:33:09 +01:00
Badlop 59ff77e171 Matrix: Fix commit 816900a for OTP below 25.0
uri_string:quote was added in OTP 25.0
2024-02-19 15:33:09 +01:00
Paweł Chmielowski 045170a67e Fix dialyzer warning on R26 in mod_matrix* 2024-02-19 12:08:56 +01:00
Alexey Shchepin c9deea1f6f Bugfix in mod_matrix_gw_room:get_sender_power_level 2024-02-19 14:05:25 +03:00
Alexey Shchepin c10f2a22b6 Fix dialyzer errors 2024-02-16 06:00:57 +03:00
Alexey Shchepin 45f24c63cb Update mod_matrix_gw copyright dates 2024-02-15 09:38:14 +03:00
Badlop 18cb0bca19 Fix compilation with Erlang/OTP 27: don't use the reserved word 'maybe' 2024-02-15 01:57:44 +01:00
Badlop 071dc08405 Container: Support OTP versions with "-rc" string 2024-02-15 01:57:42 +01:00
Badlop b8181974ec Replace 'if' preprocessor directive with 'ifndef', add OTP_BELOW_24
The 'if' preprocessor directive was added in Erlang/OTP 21.0,
but ejabberd currently supports Erlang 20.0 and higher...
Let's use 'ifndef' instead.

https://www.erlang.org/doc/reference_manual/macros.html#flow-control-in-macros
https://www.erlang.org/doc/apps/compiler/notes#compiler-7.2
https://www.erlang.org/patches/otp-21.0#compiler-7.2
2024-02-15 01:57:41 +01:00
Badlop 816900a6cf Use uri_string module instead of the deprecated http_uri
http_uri is marked for deprecation since OTP 23
Use uri_string which is available since OTP 21
No need to provide alternative, because it's used only by mod_matrix,
and this runs only with Erlang/OTP 24 or higher.

https://www.erlang.org/patches/otp-23.0#inets-7.2
https://www.erlang.org/docs/23/man/http_uri
2024-02-15 01:57:39 +01:00
Badlop 2438fc8b31 Add OTP_BELOW_25 to mix.exs that was added to rebar.config in 4ae06f0 2024-02-15 01:57:38 +01:00
Badlop 8b84f991e1 make-binaries: Bump many dependency versions
Unfortunately, newer versions of linux-pam throw compilation problems:

linux-pam 1.5.3:
tty_conv.c:9:10: fatal error: termio.h: No such file or directory

linux-pam 1.6.0:
pam_namespace.c:649:41: error: 'SIZE_MAX' undeclared (first use in this function)
2024-02-15 01:57:36 +01:00
Badlop 3c98ec5b48 Update "make translations" to reduce build requirements
Previously, preparing translations required rebar3 and:
  ./configure --enable-tools
  make
  make translations

With this change it works with rebar3 and mix, just running:
  ./configure
  make translations
2024-02-15 01:57:34 +01:00
Badlop e1f863afa4 Makefile: Group all variable definitions, and later just use them 2024-02-15 01:57:32 +01:00
Badlop f40a036d97 Makefile: Express rebar3 profile using "as profile"
This allows to use REBAR_PROFILE to add another profile.
Right now it doesn't seem specially useful, but it's possible:
  REBAR_PROFILE=dev make prod
  REBAR_PROFILE=translations make dev

https://rebar3.org/docs/configuration/profiles/
2024-02-15 01:57:30 +01:00
dependabot[bot] 3f07e232aa Bump actions/upload-artifact from 3 to 4
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-15 01:57:28 +01:00
Alexey Shchepin f44e23b8cc Add mod_matrix_gw 2024-02-14 06:59:23 +03:00
Paweł Chmielowski 67a6776fba Add ability to ignore failures in execution of container CTL_ON_* commands
This will allow to use register in CTL_ON_CREATE and not abort if used with
existing data that have account already registered.
2024-02-13 11:55:23 +01:00
Badlop cdaf45f91c Test: Check that the message we get is the welcome message, not other 2024-02-09 14:12:22 +01:00
Badlop e1b94487ef Container: Apply commit 35b727a
ejabberdctl: Detect problem running iex and show explanation
2024-02-09 14:12:21 +01:00
Badlop 2531ebf685 Container: Apply commit abf0796
ejabberdctl: Detect problem running etop and show some help
2024-02-09 14:12:20 +01:00
Badlop 01909b07ce Container: Apply commit e1f14ac
Rebar3: Provide proper path to iex
2024-02-09 14:12:18 +01:00
Badlop 39ea08b7cb Container: Apply commit 841d5c0 and 81ceefe
Fix startup problem when having set EJABBERD_OPTS and logger options
Remove spurious line
2024-02-09 14:12:17 +01:00
Badlop 413ffd7470 Container: Apply commit 19e2e16
Let "ejabberdctl etop" work in a release (if observer is available)
2024-02-09 14:12:15 +01:00
Badlop 66645baa75 Container: Apply commit 122af79
move spool dir to make it fully configurable per ejabberdctl.cfg (#3863)
2024-02-09 14:12:13 +01:00
Badlop 021f0be119 Container: Update to Erlang/OTP 26.2, Elixir 1.16.1 and Alpine 3.19 2024-02-09 14:12:12 +01:00
Badlop 1962fc88d6 make-binaries: Bump OpenSSL 3.2.1, Erlang/OTP 26.2.2, Elixir 1.16.1
The update of OpenSSL follows:
https://github.com/processone/eturnal/commit/eae4ab473de7042daf28d538bbc9be2bfbbda12a
https://github.com/processone/eturnal/commit/39823a8009f97e309d4144ef66761f11263481f1
https://github.com/processone/eturnal/commit/92e9a41888f1a3008ed7b89a263c84e5e3381082
2024-02-09 14:12:10 +01:00
Badlop fa12301e08 ejabberdctl: Fix problem when running ejabberdctl in container 2024-02-09 14:12:08 +01:00
Badlop 9f934abd48 ejabberdctl: Fix crash running defined commands in container and installers 2024-02-09 14:12:06 +01:00
Badlop 4680954112 README.md: Add links to nightly builds 2024-02-09 14:12:03 +01:00
Paweł Chmielowski 7e6ffc34fb Update mix.lock 2024-02-07 19:32:49 +01:00
Paweł Chmielowski 95135af6b3 Rework temporary node name generation in ejabberdctl
This should limit number of possible node names generated by and with that
prevent atom space exhaustion in ejabberd process.

On R23+ we switch to using native dynamic node features and on older
versions we iterate over small number of possible names and skip those
already in use.
2024-02-07 12:17:16 +01:00
Badlop c81a47a692 Container: Update make-binaries to support setup-beam v1.17.2
With setup-beam v1.17.2, make-binaries failed in the Container action with:

* ERROR:   No usable Erlang/OTP system for the build machine found! Cannot
*          cross compile without such a system.
*
*          Either build a bootstrap system for the build machine, or provide
*          an Erlang/OTP-26 system in the $PATH, and try again. For more
*          information on cross compiling Erlang/OTP-26, see the
*          $ERL_TOP/xcomp/README file.

The problematic commit is:
  https://github.com/erlef/setup-beam/commit/cf854bf14995e965ed7a4f7ec68e426278929376
more concretely this change:
  -  core.exportVariable(installDirForVarName, cachePath)
  +  core.exportVariable(installDirForVarName, catchPathBin)

Up until setup-beam@v1.17.1, the INSTALL_DIR_FOR_OTP was something like
  /opt/hostedtoolcache/otp/ubuntu-22.04/OTP-26.1.1/x64
but starting in v1.17.2, the path contains /bin, for example:
  /opt/hostedtoolcache/otp/ubuntu-22.04/OTP-26.1.1/x64/bin
2024-02-06 17:57:27 +01:00
Badlop 3bd9fc9f43 Container: Fix typo in cache key name 1.25->1.26 2024-02-06 17:57:27 +01:00
Badlop c664d6dc32 Workflows: Update actions to use Node.js 20 as recommended by Github Actions 2024-02-06 17:57:27 +01:00
Badlop a182ec12cf Workflows: Use explicit ubuntu-22.04 instead of a varying ubuntu-latest
Also notice that ubuntu-22.04 doesn't include Erlang/OTP.
2024-02-06 17:57:27 +01:00
Badlop 70bf316f9d Explain that reopen_log and rotate_log only affect some modules (#4156) 2024-02-06 17:52:31 +01:00
Badlop 2979fb4a9b ext_mod: Support in WebAdmin when a module spec lacks some information 2024-02-06 17:52:29 +01:00
Badlop a33be2d67a ejabberdctl.bc: Improve caching of commands list
Improvements:
- Keep command cache for one hour
- Fix parsing command list with ECMA-48 SGR escape sequence for font attributes
2024-02-06 17:52:27 +01:00
Badlop c6878f9c9d ejabberdctl: Print argument description, examples and note in help 2024-02-06 17:52:25 +01:00
Badlop 1d65f4471b ejabberdctl: Document exclusive ejabberdctl commands like all the others 2024-02-06 17:52:24 +01:00
Badlop e9de3748bd ejabberdctl: Reorganize commands related to mnesia info
- ejabberdctl mnesia: already implemented in ejabberd_admin.erl
- ejabberdctl mnesia info: renamed to mnesia_info_ctl
- ejabberdctl mnesia Arg: command removed, use mnesia_info_ctl instead
2024-02-06 17:52:22 +01:00
Badlop ea40afbe03 update_sql_schema: Fix typo, add example MySQL version number 2024-02-06 17:52:19 +01:00
Holger Weiss 01c70868ef Ignore hints when checking for chat states
Ignore XEP-0334 elements when checking whether a stanza is a stand-alone
XEP-0085 chat state notification.  This allows for CSI-filtering chat
states with (e.g.) a no-store hint.

Thanks to Thilo Molitor for reporting the issue.
2024-02-03 13:20:34 +01:00
Alexey Shchepin 66d701e788 Add print_sql_schema ejabberdctl command 2024-01-24 22:52:20 +03:00
Badlop 6eff14a71d Update changelog 2024-01-23 14:41:23 +01:00
Paweł Chmielowski 506152d4e7 Use tagged version of dependencies 2024-01-23 13:39:21 +01:00
Badlop 6e9c96a0e5 Run: make doap 2024-01-22 17:29:24 +01:00
Badlop e58be4d57e Update man page 2024-01-22 17:29:23 +01:00
Badlop e94edbdb8f Update Chinese translation (thanks to Sketch6580) 2024-01-22 17:29:21 +01:00
Badlop 0c8d2ea557 Update Ukrainian translation (thanks to Олександр Кревський) 2024-01-22 17:29:20 +01:00
Badlop 07e3456631 Update Portuguese translation (thanks to Silvério Santos) 2024-01-22 17:29:19 +01:00
Badlop e65d554309 Update Dutch translation (thanks to Ranforingus) 2024-01-22 17:29:17 +01:00
Badlop f5652cf946 Update Czech translation (thanks to Jan Aschenbrenner) 2024-01-22 17:29:16 +01:00
Badlop 399d0a5bf0 Update Bulgarian translation (thanks to Mr. EddX) 2024-01-22 17:29:14 +01:00
Badlop 589521bfd8 Update copyright year to 2024 (#4139) 2024-01-22 17:29:13 +01:00
Badlop d802b6ab44 Fix version number in ejabberd_xmlrpc.erl 2024-01-22 17:29:12 +01:00
Badlop 45863b4651 Grant execution permission to install-sh
The file `src/install-sh` was added in c311ea1.
Most files from that commit were removed in 4d8f770 and install-sh was moved.
Since recent commit 7cae092, `./configure` checks for a race-free `mkdir -p`,
the `install-sh` script may be used, and it needs execution permission.
2024-01-22 17:29:10 +01:00
Badlop f34c2b1714 Document new XEPs supported thanks to its implementation in the xmpp library 2024-01-22 17:29:09 +01:00
Badlop 78750bf753 Annotate version when the commands v1 are available 2024-01-22 17:29:07 +01:00
Badlop 65d585496c Document sql_flags option introduced in 00c7600 2024-01-22 17:29:06 +01:00
badlop 194d3b9e17 Merge pull request #4143 from badlop/elixir-all-in
Improve support for Elixir, Mix and Rebar3
2024-01-22 12:44:21 +01:00
Badlop b4b85e569e Runtime: Clean Rebar tests and add Rebar2 to them 2024-01-17 14:44:09 +01:00
Badlop daabfeb0e2 Makefile: Add install-rel and uninstall-rel 2024-01-17 14:44:09 +01:00
Badlop c61b57f7ab Makefile: Uninstall also the man file 2024-01-17 14:44:09 +01:00
Badlop 7cae0920b8 Makefile: Use AWK and MKDIR_P 2024-01-17 14:44:09 +01:00
Badlop 920e4ba6b1 Makefile: Fix TAGS target 2024-01-17 14:44:09 +01:00
Badlop 16e58a1911 Makefile: Update PHONY targets 2024-01-17 14:44:09 +01:00
Badlop ec7570f93e Makefile: Add sections, headers and Vim folding 2024-01-17 14:44:09 +01:00
Badlop ae2993ecae Rebar: Use excl_archive_filters only when Erlang < 26
That option is required when Erlang < 26 to disable the archive feature.
The feature and the option were removed in Erlang 26, and the release
building process fails if the option is used.
https://www.erlang.org/patches/otp-26.0
2024-01-17 14:43:24 +01:00
Badlop ee778ca8f9 COMPILE.md: For Elixir, recommend at least 1.13.4 with Erlang/OTP 23.0 2024-01-17 10:24:34 +01:00
Badlop a2ff5fbfdb Add observer and runtime_tools in releases when --enable-tools
When --enable-tools, include observer and runtime_tools
in the OTP releases, as they are required by "ejabberdctl etop".

With this fix, "ejabberdctl etop" works correctly when:
* rebar3 + make rel
* mix + make dev
* mix + make rel
2024-01-17 10:24:34 +01:00
Badlop eeb4be6e4b Makefile: Rename "make rel" to "make prod"
Rebar2 could create a release, so it made sense to call it "make rel".

Nowadays, Rebar3 and Mix support creating different types of releases:
production, development, ...
In this sense, our "make rel" target is more properly named "make prod"

For backwards compatibility, "make rel" redirects to "make prod"
2024-01-17 10:24:34 +01:00
Badlop aad3306bdf Makefile: Support using --with-rebar=/path/to/mix 2024-01-17 10:24:34 +01:00
Badlop 35b727ac39 ejabberdctl: Detect problem running iex and show explanation 2024-01-17 10:24:34 +01:00
Badlop abf07966be ejabberdctl: Detect problem running etop and show some help 2024-01-17 10:24:34 +01:00
Badlop a1c81955d3 ejabberdctl: Document to stop live shell with control+g, following cd421f9 2024-01-17 10:24:34 +01:00
Badlop ad7538f394 Runtime: Rebar3+Elixir: Add new job to test Rebar3 compiling Elixir 2024-01-17 10:24:34 +01:00
Badlop c0a909296e Runtime: Mix: Enable ModPresenceDemo and Elixir dep 2024-01-17 10:24:34 +01:00
Badlop 7186cd09bf Runtime: Test also "make install" 2024-01-17 10:24:34 +01:00
Badlop db8583b1c6 Runtime: Mix: Add step to view logs 2024-01-17 10:24:34 +01:00
Badlop 07be61585c Runtime: Mix: No need to specify --disable-elixir 2024-01-17 10:24:34 +01:00
Badlop 8bdd811a16 Runtime: Mix: Update Erlang and Elixir versions to test 2024-01-17 10:24:34 +01:00
Badlop c69d88c45a Runtime: Rebars: Add log tests similar to the Mix job 2024-01-17 10:24:34 +01:00
Badlop b18fa2ebc2 Runtime: Rebars: Use the rebar binaries included in the repository 2024-01-17 10:24:34 +01:00
Badlop f838319455 Runtime: Rebars: Get old rebar binaries when testing old erlang versions 2024-01-17 10:24:34 +01:00
Badlop 0d852474be Use Mix or Rebar3 by default instead of Rebar2 to compile ejabberd
Use the program specified in option: --with-rebar=/path/to/bin
When none is specified, use the system mix
When Elixir not found, use the system rebar3
When Rebar3 not found, use the rebar3 binary included with ejabberd
2024-01-17 10:24:34 +01:00
Badlop dd5a198222 Rebar3: Include Elixir files when making a release 2024-01-17 10:24:34 +01:00
Badlop 2d067f7498 Rebar3: Workaround to fix protocol consolidation 2024-01-17 10:24:34 +01:00
Badlop a6c1e42c0a Rebar3: Add support to compile Elixir dependencies
As described in
https://rebar3.org/docs/configuration/plugins/#elixir-dependencies
2024-01-17 10:24:34 +01:00
Badlop ff783d15e8 Rebar3: Compile explicitly our Elixir files when --enable-elixir 2024-01-17 10:24:34 +01:00
Badlop e1f14aca9b Rebar3: Provide proper path to iex
We can't use iex variable, because rebar3/relx_overlay.erl already uses
all existing app names as variables.
2024-01-17 10:24:34 +01:00
Badlop 65ff45e202 Rebar/Rebar3: Remove elixir as a gitonly_deps, and add ejabberd_po
Adding ejabberd_po to gitonly_deps isn't strictly needed,
because we request a branch in the ejabberd-po git repository,
and rebar.config.script understands that this means ejabberd_po
should be downloaded from git, not hex.pm.
2024-01-17 10:24:34 +01:00
Badlop f330267361 Rebar/Rebar3: Remove Elixir as a rebar dependency
Elixir is standalone since years ago. When Elixir support is required,
better simply install Elixir and use Mix as build tool.
Or install Elixir and use the experimental Rebar3 support to compile
Elixir files and dependencies.
2024-01-17 10:24:34 +01:00
Badlop 1de28fa566 Rebar/Rebar3: Update binaries to work with Erlang/OTP 23-26
They are compiled from their git repositories, main branches,
using erlang:23-slim docker image.

To compile ejabberd using rebar/rebar3 and Erlang 22.3 or older,
you can download the old binaries from ejabberd 21.12, available at:
  https://github.com/processone/ejabberd/raw/21.12/rebar
  https://github.com/processone/ejabberd/raw/21.12/rebar3
2024-01-17 10:24:34 +01:00
Badlop b08001183e ext_mod: Support Elixir modules with several defimpl, like Decimal 2024-01-17 10:24:34 +01:00
Badlop 0121adec03 ext_mod: Compile *.ex files also in source subfolders 2024-01-17 10:24:34 +01:00
Badlop 4daeb41f0e Elixir: Fix compiling ejabberd as a dependency (4128) 2024-01-17 10:24:34 +01:00
Badlop b2df22469b Elixir: Fix ejabberdctl start/live when installed
The problem appeared when:
  ./configure --with-rebar=mix
  make install
  ejabberdctl live

=INFO REPORT==== 19-Dec-2023::21:28:36.006306 ===
    application: ssl
    exited: stopped
    type: temporary
...
2024-01-17 10:24:34 +01:00
Badlop 1bf80e861d Elixir: Fix: FORMATTER ERROR: bad return value (4087)
This is required since Elixir 1.15 when starting ejabberd with:
  ./configure --with-rebar=mix
  make relive
  make relive && ejabberdctl iexlive
  make install && ejabberdctl iexlive

Reference:
  https://elixir-lang.org/blog/2023/06/19/elixir-v1-15-0-released/
  https://hexdocs.pm/logger/Logger.Formatter.html#module-formatting
2024-01-17 10:24:34 +01:00
Badlop 5bb2beb179 Elixir: Fix: Couldn't find file Elixir.Hex.API
Fix for error when starting ejabberd with Elixir 1.15:
  [critical] Couldn't find file Elixir.Hex.API needed for Erlang application 'hex'.
2024-01-17 10:24:34 +01:00
Badlop 852a540cb0 Elixir: Fix Elixir 1.17-dev warnings about single-quoted charlists 2024-01-17 10:24:34 +01:00
Badlop 8b38aebbc7 Mix: Enable stun by default when vars.config not found
configure.ac by default enables stun and zlib, in fact ejabberd.yml
has ejabberd_stun enabled by default, so for coherence mix.exs should
enable stun too when vars.config is not found.
2024-01-17 10:24:34 +01:00
Badlop fa3c25ab66 Mix: New option vars_config_path to set path to vars.config (4128)
Useful when setting ejabberd as dependency in another Elixir project,
and you want to enable or disable some ejabberd dependencies, see
https://www.process-one.net/blog/how-to-use-ejabberd-as-an-elixir-application-dependency/
2024-01-17 10:24:34 +01:00
Badlop 30df1dbe3f Mix: Set the nodename when using the ejabberd script generated by Elixir
Also use start instead of console in Elixir script
2024-01-17 10:24:34 +01:00
Badlop 6d61e3590d Mix: Print shell commands output to the console when "make dev" 2024-01-17 10:24:34 +01:00
Badlop e71650e6ab Mix: Fix ejabberdctl iexlive problem locating iex in an OTP release
The problem appeared when:
  ./configure --with-rebar=mix
  make dev
  _build/dev/rel/ejabberd/bin/ejabberdctl iexlive
2024-01-17 10:24:34 +01:00
Badlop d81b3805e3 Mix: Elixir 1.14 requires mix, and Elixir 1.16 warns about duplicate 2024-01-17 10:24:34 +01:00
Badlop 416253496d Mix: Add yecc compiler as suggested by Elixir 1.16 warning over p1_pgsql 2024-01-17 10:24:34 +01:00
Paweł Chmielowski 29ec5bff60 Add option to disable XEP-0474: SASL SCRAM Downgrade Protection support
Looks like clients using strophejs aren't able to authenticate when we
add data required by that spec to scram packets, so at least give a way
to disable this until clients will be fixed.
2024-01-16 12:03:35 +01:00
Holger Weiss 6c691a73bd Support XEP-0198 pings
If stream management is enabled, let mod_ping trigger XEP-0198
<r/>equests rather than sending XEP-0199 pings.  This avoids the
overhead of the ping IQ stanzas, which, if stream management is enabled,
are accompanied by XEP-0198 elements anyway.

Thanks to MoyaApp (<https://moya.app>) for sponsoring this work.
2024-01-15 21:38:54 +01:00
Badlop 74cb2e054f Rephrase sentences to avoid using "allow to + verb" 2024-01-11 13:42:06 +01:00
Badlop 5b6329a12e Fix a few spelling errors 2024-01-11 13:41:40 +01:00
Badlop 973ba58744 mod_avatar implements XEP-0398 0.2.0 since ddc29d4 2024-01-08 18:21:15 +01:00
Badlop 1f60bcb2d0 Fix syntax of enable-user and enable-group options help 2024-01-08 18:21:13 +01:00
Badlop 8e8354caec Fix explanation of --enable-group option (#4135) 2024-01-08 18:21:10 +01:00
badlop e26c547afc Merge pull request #4118 from badlop/api-version-1
Commands API version 1
2024-01-05 13:10:06 +01:00
Badlop fc13fdceca Docs: Separate tags with commas in markdown docs 2024-01-04 22:01:21 +01:00
Badlop d585b1fcb6 Docs: When definer is unknown, don't show Module section 2024-01-04 22:01:21 +01:00
Badlop 57bd0ef4f5 Docs: Optional support to get commands from runtime instead of BEAM files, based in bdeb4a7 2024-01-04 22:01:21 +01:00
Badlop d140f99b68 ejabberd_xmlrpc: Fix support for restuple error response 2024-01-04 22:01:21 +01:00
Badlop 90766685ae ejabberd_ctl: When API version>0, update syntax of list results 2024-01-04 21:53:14 +01:00
Badlop d65638efe1 ejabberd_ctl: Pass API version to format_result 2024-01-04 21:53:14 +01:00
Badlop b34572e7ce ejabberd_ctl: Show proper command help when version is explicitly set 2024-01-04 21:53:14 +01:00
Badlop c4c0cd1b77 ejabberd_ctl: Add support for list and tuple arguments
Tuple elements are separated with :
List elements are separated with ,

For example:
  ejabberdctl add_rosteritem user1 localhost testuser7 localhost NickUser77l gr1,gr2,gr3 both
  ejabberdctl create_room_with_opts room1 conference.localhost localhost public:false,persistent:true
  ejabberdctl subscribe_room_many user1@localhost:User1,admin@localhost:Admin room1@conference.localhost urn:xmpp:mucsub:nodes:messages,urn:xmpp:mucsub:nodes:affiliations

Affected commands:
- add_rosteritem
- create_room_with_opts
- oauth_issue_token
- send_direct_invitation
- set_vcard2_multi
- srg_create
- subscribe_room
- subscribe_room_many
2024-01-04 21:53:14 +01:00
Badlop 9f42f17088 mod_http_api: Fix to allow the client override the API version
When configured like:
listen:
  -
    request_handlers:
      /api: mod_http_api
      /apizero/v0: mod_http_api

What API version will be used depending on the URL:
- api/commandname use the latest available version
- api/commandname/v0 use version 0
- apizero/v0/commandname use version 0
- apizero/v0/commandname/v2 use version 2
2024-01-04 21:53:14 +01:00
Badlop d570870be5 mod_http_api: When using API version>0, avoid result names for integers and strings 2024-01-04 21:53:14 +01:00
Badlop 8671bf70ab mod_http_api: When no specific API version is requested, use the latest 2024-01-04 21:53:14 +01:00
Badlop e26729b483 Commands: Use list arguments in many commands that used separators
Commands that has some argument change:
- add_rosteritem
- oauth_issue_token
- send_direct_invitation
- srg_create
- subscribe_room
- subscribe_room_many
2024-01-04 21:53:14 +01:00
Badlop d4113d9569 Commands: set_presence: switch priority argument from string to integer 2024-01-04 21:53:14 +01:00
Badlop c5a5dd859e Commands: Improve syntax of many commands documentation 2024-01-04 21:53:14 +01:00
Badlop 0961fa1830 Commands: When result is rescode, result_desc is automatically added 2024-01-04 21:53:14 +01:00
Badlop f18b8d464d Commands: Add a new muc_sub tag to all the relevant commands 2024-01-04 21:53:14 +01:00
Badlop 98d7519274 ejabberd_commands: Add the command version as a tag "vX" 2024-01-04 21:53:14 +01:00
Badlop 1326a7764a ejabberd_commands: Update -type and remove obsolete @type 2024-01-04 21:53:14 +01:00
Alexey Shchepin 97568195d6 Update SQL schema files 2023-12-27 17:01:57 +03:00
Alexey Shchepin 8d2d3a6540 Support XEP-0424 in mod_mam_mnesia 2023-12-27 09:42:22 +03:00
Alexey Shchepin 4f6730621a Add default value to #archive_msg.origin_id 2023-12-27 09:28:02 +03:00
Alexey Shchepin a4bb695fc3 Support for XEP-0424 "Message Retraction" 2023-12-27 08:59:20 +03:00
Badlop a57bdfffb7 Document recent change from 7d4330b57 2023-12-22 13:19:53 +01:00
Paweł Chmielowski bdb513a660 Update xmpp 2023-12-19 10:43:37 +01:00
Paweł Chmielowski b5ce53c907 Update xmpp to fix issue with scram with missing channel bindings
This makes scram downgrade protection hash calculation work properly when
using non -plus sasl mechanism or when stream is not encrypted

This should fix issue #4123.
2023-12-18 12:10:28 +01:00
Paweł Chmielowski b556fae08f Update xmpp to bring support for XEP-0474: SASL SCRAM Downgrade Protection 2023-12-13 10:08:31 +01:00
Paweł Chmielowski f87ab9a99f Update xmpp 2023-12-12 14:37:01 +01:00
Paweł Chmielowski a5c973f86b Mention in docs for sql_prepared_statements that it works with MySQL 2023-12-12 11:29:12 +01:00
Holger Weiss 6b2b89da78 mod_push: Fix disabling of notifications
Remove the correct field from the c2s state when the client explicitly
disables push notifications.  This fixes a regression introduced by
commit c148ab4430.
2023-12-08 18:52:53 +01:00
Paweł Chmielowski 7d4330b57a Increase default value of negotiation_timeout from 30s to 2m
This timeout also covers in-band registration, and if user don't fill
registration form in that time leads to disconnect and aborting
registration. This will allow for more time to finish that.
2023-12-04 13:24:32 +01:00
Badlop 225d14cbbe Minor improvements in auth_password_format documentation 2023-12-01 00:07:21 +01:00
Paweł Chmielowski d2a84c96a4 Update xmpp to fix incompatibility with < R21 2023-11-22 18:40:10 +01:00
Paweł Chmielowski 48f0d9c15e Update xmpp to make us present both sasl1 and sasl2 with from in initial stanza 2023-11-22 18:34:18 +01:00
Paweł Chmielowski 9c7e91a1e9 Update xmpp and make opening bind2 session close other sessions with same tag 2023-11-21 13:55:40 +01:00
Paweł Chmielowski 91e74204b2 Teach mod_carboncopy how to interact with bind2 inline requests 2023-11-20 18:55:07 +01:00
Paweł Chmielowski fdee4efe98 Fix presenting features and returning results of inline bind2 elements 2023-11-20 18:54:23 +01:00
Paweł Chmielowski 59bb6dae14 Make apps passed to check in dialyzer consult configure optons 2023-11-20 18:47:42 +01:00
Paweł Chmielowski 3300f8bafb Update fast_tls in mix 2023-11-20 15:39:07 +01:00
Paweł Chmielowski c61e56d8a6 Fix for one more dialyzer warning 2023-11-16 20:49:28 +01:00
Paweł Chmielowski ad15659fb2 Fix warnings 2023-11-16 18:45:33 +01:00
Paweł Chmielowski efffc3142a Add implementation for SASL2 and Bind2 2023-11-16 16:52:55 +01:00
Alexey Shchepin b0a9b58958 Use the first unique index as a primary key in ejabberd_sql_schema 2023-11-16 16:00:35 +03:00
Paweł Chmielowski 4ea46c5765 Set EJABBERD_OPTS back to "", and use previous flags as example
Also try to clarify distinction between EJABBERD_OPTS and ERLANG_OPTS
2023-11-15 14:16:53 +01:00
Paweł Chmielowski 7de0ba95d0 Update mysql to bring sha256_password auth plugin support 2023-11-09 15:43:47 +01:00
Paweł Chmielowski 3ad30c3ff5 Use correct commit hash for xmpp 2023-10-31 10:15:35 +01:00
Paweł Chmielowski 3ed2b41a5a Update xmpp to bring tls-server-end-point channel binding and sasl2 codec 2023-10-31 09:41:25 +01:00
Paweł Chmielowski 3bf4cf5c3f Fix reversed logic in node fixup function 2023-10-26 15:44:45 +02:00
Paweł Chmielowski 52e7c166fc Normalize pubsub max_items node options on read
Older version used infinity value, for what never version use max, let's
always return max in that case.
2023-10-26 14:31:40 +02:00
Paweł Chmielowski 08a78a1654 Change logic for eldap tls_verify=soft and false
Looks like originally both soft and hard worked the same way, so lets make
them do that, and we also need to add {verify, verify_none} for false case
otherwise it fails on R26.
2023-10-26 11:17:17 +02:00
Paweł Chmielowski 81ceefe2f1 Remove spurious line 2023-10-25 20:35:25 +02:00
Paweł Chmielowski c2d04bc478 Don't set fail_if_no_peer_cert for eldap ssl client connections
Looks like R26 generates error when this option is used for client
connection, let's just use verify_peer/verify_none for
ldap_tls_verify hard/soft options.

This should fix issue #4110.
2023-10-25 20:31:50 +02:00
Paweł Chmielowski 36fffa5b23 Revert dialyzer changes commited by mistake 2023-10-25 20:07:02 +02:00
Paweł Chmielowski 841d5c0299 Fix startup problem when having set EJABBERD_OPTS and logger options
Make sure that logger options that we extract from config file are put in
correct places when starting erl, directly after -ejabberd, custom
EJABBERD_OPTS should be places after them.

This fixes issue #4109
2023-10-25 20:05:27 +02:00
Paweł Chmielowski 0bdca8fd9e Updated deps to bring support for tls-exporter channel binding 2023-10-25 16:46:03 +02:00
Paweł Chmielowski f48275bc11 Only care about pep bookmarks options when creating node from scratch 2023-10-19 19:26:25 +02:00
Paweł Chmielowski aa369de280 Fix xmpp dep in mix 2023-10-18 16:17:11 +02:00
Badlop 543404bcb8 Fixing minor typos in CHANGELOG
Container / Container (push) Failing after 2m8s
Installers / Binaries (push) Failing after 53s
Runtime / Rebars (20.3, rebar) (push) Failing after 2s
Runtime / Rebars (20.3, rebar3) (push) Failing after 3s
Runtime / Rebars (25.3, rebar) (push) Failing after 2s
Runtime / Rebars (25.3, rebar3) (push) Failing after 2s
Runtime / Rebars (26, rebar3) (push) Failing after 3s
Installers / Release (push) Has been skipped
CI / Tests (20.0) (push) Has been cancelled
CI / Tests (25.3) (push) Has been cancelled
CI / Tests (26.1) (push) Has been cancelled
Runtime / Mix (1.10.3, 21.3) (push) Has been cancelled
Runtime / Mix (1.11.4, 21.3) (push) Has been cancelled
Runtime / Mix (1.13.4, 25.0) (push) Has been cancelled
Runtime / Mix (1.14.5, 25.0) (push) Has been cancelled
Runtime / Mix (1.14.5, 26) (push) Has been cancelled
Runtime / Mix (1.15, 25.0) (push) Has been cancelled
Runtime / Mix (1.15, 26) (push) Has been cancelled
2023-10-17 15:57:50 +02:00
Badlop b7166d7da0 Set version to 23.10 2023-10-17 15:31:32 +02:00
Badlop cf54608c71 Update changelog 2023-10-17 15:29:20 +02:00
Alexey Shchepin ec20691188 Disable update_sql_schema by default 2023-10-16 19:31:32 +03:00
Alexey Shchepin c1af36ac20 Automatically create and update SQL schema 2023-10-16 18:21:08 +03:00
Alexey Shchepin f6e8eb52f0 Fix ejabberd_sql:sql_query* types 2023-10-16 18:21:08 +03:00
Paweł Chmielowski ad7db90c80 Use tagged deps 2023-10-16 15:14:31 +02:00
Holger Weiss cbfb8eb805 Example configuration: Specify s2s shaper
Specify a shaper for incoming s2s connections (got lost in commit
91a74e3e27).

Thanks to Paul Menzel for noting that it was missing.
2023-10-16 14:44:01 +02:00
Holger Weiss df60818883 Example configuration: Clarify direct TLS listener
The ejabberd_c2s listener for port 5223 is meant to support direct TLS
access rather than STARTTLS.  Therefore, remove the 'starttls_required'
option, which had no effect.
2023-10-16 14:32:38 +02:00
Badlop d5de93b8fa Update other translations 2023-10-16 11:28:51 +02:00
Badlop ab6da9530d Update Ukrainian translation (thanks to Олександр Кревський) 2023-10-16 11:28:29 +02:00
Badlop ca82376657 Update man page 2023-10-16 11:18:59 +02:00
Badlop 87f18aa8d7 Result of running: make doap options 2023-10-16 11:09:13 +02:00
Badlop 6340d61397 Dcoument ejabberd version number in the new options 2023-10-16 10:58:59 +02:00
Badlop 80d1e36542 mod_private: Document that it supports XEP-0402 now 2023-10-16 10:56:15 +02:00
Paweł Chmielowski f75909db4c Allow pubsub node owner to overwrite items published by other persons
Owner is already permitted to delete those items, so it could do that by
deleting old item, and publishing it again, so i don't see reason to not
allow that overwrite.
2023-10-12 13:16:32 +02:00
Paweł Chmielowski 12d47455ba Add auth_external_user_exists_check option
This makes `user_check` hook work better with authentication methods
that don't have a way to determine if user exists (like is the case for
jwt and cert based authentication), and as result will improve mod_offline
and mod_mam handling of offline messages to those users. This reuses
information stored by `mod_last` for this purpose.

Should fix issue #3377.
2023-10-11 14:17:18 +02:00
Badlop 9acf591242 Run 'make translations' 2023-10-11 01:17:27 +02:00
Badlop bab8673055 Update Portuguese (Brazil) translation (thanks to Wellington Uemura) 2023-10-11 01:17:24 +02:00
Badlop 3851a77134 Update German translation (thanks to nautilusx) 2023-10-11 01:17:21 +02:00
Badlop 8e324e67a4 New Bulgarian translation (thanks to Mr. EddX) 2023-10-11 01:13:49 +02:00
Badlop 10245b40ee Add support to register nick in a room (#3455)
Registering a nick in the MUC service or in a room is mutually exclusive:
- A nick that is registered in the service cannot be registered in any
  room, not even the original owner can register it.
- Similarly, a nick registered in any room cannot be registered in the
  service.
2023-10-10 13:08:56 +02:00
Badlop 9534ca2da1 ext_mod: Support when git repository name is not identical to the module name
For example, ejabberd-contrib has an extra module, mod_prometheus,
that is hosted in a git repository named ejabberd-prometheus-exporter
2023-10-04 20:57:02 +02:00
Badlop f9d11265d0 ext_mod: Don't crash when github page response is 403 2023-10-04 20:55:01 +02:00
Badlop d85c125bef ext_mod: Use the same URL that ejabberd-contrib spec files 2023-10-04 20:54:49 +02:00
Paweł Chmielowski 62d3d7a32d Relay pubsub iq queries to muc members without using bare jid
We do something similar for vcard queries, this allows target server
to respond to those queries by target server, which is what we want to
do in both of those cases.
2023-10-04 17:20:20 +02:00
Holger Weiss a3f4a05b0c make-binaries: Don't use non-prefixed cross tools
Omit the directory that contains cross compilation tools without
"$target-" prefix from the PATH.  Having it in the path might lead to
problems when native tools are needed during cross compilation.  For
actual cross compilation, the prefixed tools should always be used
anyway.
2023-10-03 17:56:27 +02:00
Paweł Chmielowski 86465c418d Try to fill xep-0402 bookmarks from private storage on first access 2023-10-02 14:39:30 +02:00
Paweł Chmielowski a63d3bf0d6 Fix crash in mod_private bookmarks converter
This should fix issue reported in #4092
2023-10-02 08:32:24 +02:00
Holger Weiss 762e4951f2 make-binaries: Bump Erlang/OTP version to 26.1.1 2023-09-29 19:01:50 +02:00
Holger Weiss d4fc54be18 make-binaries: Let curl fail on HTTP errors 2023-09-29 17:33:09 +02:00
Holger Weiss f327f4cc67 make-binaries: Suppress curl's info messages 2023-09-29 17:32:17 +02:00
Paweł Chmielowski 9ba645503b Fix dialyzer warning 2023-09-27 23:02:32 +02:00
badlop 5406693a1e Merge pull request #4079 from sando38/fix/Dockerfile-odbc
Dockerfile: add missing dependency for mssql databases
2023-09-27 21:10:16 +02:00
Paweł Chmielowski d55955f7d8 Clean also urn:xmpp:bookmarks:1 after mod_private tests 2023-09-27 19:38:14 +02:00
Paweł Chmielowski 765770aaa5 Add support for xep-0402 - PEP Native Bookmarks 2023-09-27 18:36:30 +02:00
Paweł Chmielowski c3e0b746d7 Add pubsub_delete_item hook 2023-09-27 18:30:17 +02:00
Paweł Chmielowski accb0bc35a Report support of config-node-max in pep 2023-09-27 18:29:56 +02:00
Holger Weiss b16530bb6a make-binaries: Bump dependency versions 2023-09-27 00:28:46 +02:00
Holger Weiss ad00553bf8 make-binaries: Bump Erlang/OTP version to 26.1 2023-09-27 00:17:30 +02:00
Holger Weiss b70bef77cb make-binaries: Bump crosstool-NG version to 1.26.0 2023-09-26 23:55:01 +02:00
Holger Weiss ac47b7b8cb ejabberd_web_admin: Make text translatable
This also fixes a type issue.
2023-09-26 23:21:45 +02:00
Badlop abe0817553 Mention what software versions are used to build the container image 2023-09-26 18:51:57 +02:00
Badlop ab431b378a WebAdmin: Show a warning when visiting webadmin with non-privileged account (4089) 2023-09-26 18:51:56 +02:00
Badlop a534196315 Fix unused variable, forgotten in the recent commit 739a231 2023-09-26 18:51:51 +02:00
Badlop cd421f98d7 ejabberdctl: Document how to stop a debug shell: control+g
control+g is the correct way to enter shell break mode, as documented in
https://www.erlang.org/doc/apps/erts/tty

The ejabberdctl script included in installers use the included VT100,
and that may break when hitting control+c.
In that scenario let's explicitly recommend to not use control+c.

Thanks to Holger Weiß for the report.
2023-09-26 18:51:47 +02:00
badlop b33d660f88 Merge pull request #4088 from badlop/get-roster-command
Improve get_roster command result: show groups as a list
2023-09-25 13:15:26 +02:00
Badlop 245c9ae446 ejabberd_ctl: Support policy=user in the help and return proper arguments 2023-09-21 13:47:07 +02:00
Badlop 8d39431d68 ejabberd_ctl: Improve printing lists in results
When formatting the results of a command:
- If the top of the result is a list, split elements with newline as usual
- If it's a list in one of the resulting lines, split elements with ;
2023-09-21 13:47:05 +02:00
Badlop 739a231259 Improve get_roster command to return groups in a list instead of newlines 2023-09-21 13:47:00 +02:00
Paweł Chmielowski 426fd14b11 Make sure that policy=user commands have host instead of server arg in docs
We renamed them in ejabberd_command, but forgot to update doc geenerator.
2023-09-20 14:06:23 +02:00
dependabot[bot] 4735372682 Bump docker/build-push-action from 4 to 5
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4 to 5.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v4...v5)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 11:05:15 +02:00
dependabot[bot] 4b3fa13163 Bump docker/setup-buildx-action from 2 to 3
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 11:05:15 +02:00
dependabot[bot] d40250c3d6 Bump docker/setup-qemu-action from 2 to 3
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 11:05:15 +02:00
dependabot[bot] 7d2cfd2aaa Bump docker/metadata-action from 4 to 5
Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 4 to 5.
- [Release notes](https://github.com/docker/metadata-action/releases)
- [Upgrade guide](https://github.com/docker/metadata-action/blob/master/UPGRADE.md)
- [Commits](https://github.com/docker/metadata-action/compare/v4...v5)

---
updated-dependencies:
- dependency-name: docker/metadata-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 11:05:14 +02:00
dependabot[bot] 11fdd417dd Bump docker/login-action from 2 to 3
Bumps [docker/login-action](https://github.com/docker/login-action) from 2 to 3.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 11:05:14 +02:00
dependabot[bot] 1b7b23fab6 Bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 11:05:14 +02:00
dependabot[bot] 10882af7c8 Bump ex_doc from 0.30.5 to 0.30.6
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.30.5 to 0.30.6.
- [Changelog](https://github.com/elixir-lang/ex_doc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/elixir-lang/ex_doc/compare/v0.30.5...v0.30.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-18 11:05:14 +02:00
Holger Weiss 6c573cc9fd mod_push: Set 'last-message-sender' to bare JID
If the mod_push option 'include_sender' is set to 'true', use the bare
JID rather than the full JID for the 'last-message-sender' field.
2023-09-09 17:33:16 +02:00
Holger Weiss 2782430887 mod_push: Add 'notify_on' option
If the new 'notify_on' option is set to 'messages', notifications are
only triggered by actual chat messages with a body (or encrypted
payload).  The default behavior remains to generate a notification on
any kind of stanzas.

Thanks to EISST International Ltd for sponsoring this work.
2023-09-08 19:49:17 +02:00
Badlop 7522c29f25 Update xmpp version to send roomconfig_changesubject in disco info (#4085) 2023-09-08 18:37:38 +02:00
Badlop 706424f0d2 Fix crash when loading room from DB older than ffa07c6, 23.04
Before commit ffa07c6, the subject_author was just the author nick,
since that commit, subject_author contains {author nick, JID}.
2023-09-04 11:32:28 +02:00
Badlop 57d404a99b Remove mailing list link, it had no activity and was removed long ago 2023-09-04 11:32:07 +02:00
Badlop 19e2e169b1 Let "ejabberdctl etop" work in a release (if observer is available) 2023-08-28 18:27:30 +02:00
Badlop 2a6ea79260 When building OTP release with mix, keep ERLANG_NODE=ejabberd@localhost
This updates the mix.exs code from commit 8ca12d4 (ejabberd 21.07)
Consequently, no need in make-binaries to update ERLANG_NODE.
The ecs docker image 23.04 got a similar change in
  https://github.com/processone/docker-ejabberd/pull/73/commits/f81905d5e315d2eb813a715b51d4a8351a7d4e6b
2023-08-28 18:27:23 +02:00
Badlop 40333066d6 Update syntax of function calls as recommended by Elixir compiler 2023-08-28 18:26:55 +02:00
Badlop 6d596063de Elixir 1.15 removed support for --app
Removing that argument does not affect iexlive at all

For reference:
https://github.com/elixir-lang/elixir/commit/e1eecb8ca698712f5cff76f52ff49b381ce64aa9
2023-08-28 18:26:55 +02:00
Badlop a7c3c9b77d Pass ERLANG_OPTS when calling erl to parse the INET_DIST_INTERFACE (#4066)
This is required when running ejabberdctl in binary installers
and INET_DIST_INTERFACE was configured, because some boot files were removed
2023-08-28 18:26:48 +02:00
Badlop a01de8d944 Fix small bug introduced in 5d549dc
When providing a client-id as explained in
  https://www.process-one.net/blog/understanding-ejabberd-oauth-support-roadmap/
ejabberd crashed with an error
  exception error: no function clause matching
  ejabberd_oauth:get_client_identity(
as reported in
  https://stackoverflow.com/questions/76922951/ejabberd-oauth-api-http-1-1-502-bad-gateway
2023-08-28 18:26:03 +02:00
Paweł Chmielowski c0e7774937 Don't always store messages passed through muc_filter_message
Recently we added new places where we call muc_filter_message to add
occupandid info to messages, but this also made them be stored in archive
as mod_mam uses that hook for getting sent messages - in case of those
messages we shouldn't be doing this.

This should fix issue #4083
2023-08-25 14:20:51 +02:00
Paweł Chmielowski 00c76003cb Add ability to force alternative upsert implementation in mysql 2023-08-18 11:46:37 +02:00
Badlop b29f87a978 Result of running: make doap options 2023-08-16 13:14:02 +02:00
Holger Weiss 2dc843cddd mod_privilege: Don't fail to edit roster (#3942) 2023-08-16 13:08:21 +02:00
dependabot[bot] 9f08b4aa15 Bump ex_doc from 0.30.1 to 0.30.5
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.30.1 to 0.30.5.
- [Changelog](https://github.com/elixir-lang/ex_doc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/elixir-lang/ex_doc/compare/v0.30.1...v0.30.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-16 12:27:23 +02:00
Badlop a84fbd6a74 Improve syntax of many command descriptions for the Docs site 2023-08-16 12:27:23 +02:00
Badlop f8af3a0005 create_room_with_opts: fix typo and move examples to args_example (#4080) 2023-08-16 12:27:23 +02:00
Badlop 83e51c815d Pass also MUC room retract messages over the muc_filter_message (#3397) 2023-08-16 12:27:23 +02:00
Badlop ff24700156 Fix support to retract a MUC room message
Now this works as expected
https://xmpp.org/extensions/xep-0425.html#example-4
2023-08-16 12:27:22 +02:00
Badlop 7683691f5a mod_muc_occupantid: New mnesia table to store rooms salts (#3397) 2023-08-16 12:27:22 +02:00
Badlop 3479f88dab Pass MUC room private messages over the muc_filter_message too (#3397) 2023-08-16 12:27:22 +02:00
Badlop 86fc2f157e Always add the occupant id, even in non-anonymous rooms (#3397) 2023-08-16 12:27:22 +02:00
Badlop ffa07c649b Store the subject author JID, and run muc_filter_message when sending subject (#3397)
When changing the room subject, store the original author JID,
so later it can be provided in the hook and mod_room_occupantid
can use it to calculate and provide the occupant id

This is noticeable when a new occupant joins an existing room,
and receives the room subject.
2023-08-16 12:27:22 +02:00
Badlop 2bd61abd71 Convert allow_private_message MUC room option to allowpm (#3736) 2023-08-16 12:25:46 +02:00
Badlop 66df953da1 Fix usage of plugins option, which produced default_node_config ignore (#4070) 2023-08-16 12:25:42 +02:00
Badlop 550a586d2a New listener option unix_socket, useful when setting unix socket files (#4059)
listen:
  -
    port: "unix://tmp/asd/socket"
    unix_socket:
      mode: '0775'
      owner: 117
      group: 135
2023-08-16 12:25:36 +02:00
Badlop 16473ab691 When sending message on behalf of user, trigger user_send_packet (#3990)
This way, MAM and CarbonCopy get triggered.
This is useful for transports like Slidge.
2023-08-16 12:25:29 +02:00
Paweł Chmielowski c5afd0322e Properly parse mysql version even if it doesn't have type tag 2023-08-14 17:12:16 +02:00
sando38 c4563c429c Dockerfile: add missing dependency for mssql databases 2023-08-12 14:46:30 +02:00
Alexey Shchepin eeacace02a Update some modules to the new gen_mod API 2023-08-09 17:08:45 +03:00
Holger Weiss caf3807bcc ejabberd_systemd: Add a few debug messages 2023-08-09 01:58:48 +02:00
Holger Weiss 6c7e85d3d8 ejabberd_systemd: Avoid using gen_server timeout
Don't (ab)use the gen_server timeout mechanism for pinging the systemd
watchdog.  Under certain conditions (e.g., the process receiving sys
messages), the gen_server timeout might not be triggered as expected.

Fixes #4054, fixes #4058,
2023-08-09 01:54:12 +02:00
Holger Weiss f0db7623d1 mod_push_keepalive: Don't let hook crash
Check whether mod_push_keepalive is loaded for a given host before
querying the module configuration for that host.  This avoids a hook
crash in the case where the module is enabled for some but not all
hosts.
2023-08-09 00:11:43 +02:00
Holger Weiss 26ed6539ba mod_push_keepalive: Delay 'wake_on_start'
Delay the 'wake_on_start' notifications until ejabberd is fully
initialized.  This makes sure no s2s connections are initiated before
certificates are loaded.

Many thanks to Friedrich Altheide for reporting the issue.
2023-08-08 20:17:10 +02:00
Alexey Shchepin a9347cd248 Fix unused variable warnings in mod_stats 2023-08-04 20:54:02 +03:00
Alexey Shchepin 60002fc145 Update some modules to the new gen_mod API 2023-08-04 18:53:50 +03:00
Paweł Chmielowski 20a8654be2 Reset scram fields when setting plain password in ejabberd_auth_sql
Setting scram password, then disabling scram and setting plain password
again, will make us think we are still using scramed password and crash
when trying to process it as such. This makes sure that when set plain
password we don't leave parts from old scram password.
2023-08-03 13:07:13 +02:00
Badlop 25411333da Add support for XEP-0421 Occupant Id in anonymous MUC rooms (#3397) 2023-08-02 17:54:54 +02:00
Badlop 07d4282603 Update XMPP library which supports XEP-0421 (3397) 2023-08-02 17:54:07 +02:00
Alexey Shchepin 4bd77797fc Add shorter forms for gen_mod hook/iq_handler API 2023-08-01 18:14:08 +03:00
Alexey Shchepin 03ffbe00c1 Update mod_disco to the new gen_mod API 2023-07-31 16:52:00 +03:00
Alexey Shchepin 5a9099f49c Extend gen_mod API to simplify hooks and IQ handlers registration 2023-07-31 16:52:00 +03:00
Badlop b501ee2b8d Remove obsolete example files, and add link in Docs to the archived copies 2023-07-27 14:03:40 +02:00
Badlop a7c3368635 Move example Perl extauth script from ejabberd git to Docs site 2023-07-27 14:03:37 +02:00
Paweł Chmielowski 84ee724aa3 Fix dialyzer warning 2023-07-25 18:49:45 +02:00
Paweł Chmielowski da7fe59834 Commit changes to ejabberd_sql.hrl as well 2023-07-25 18:24:24 +02:00
Paweł Chmielowski 3710dc1e3b Use prepared statement with mysql 2023-07-25 18:11:24 +02:00
Badlop db03c7428c Web Admin roster page: move the AddJID textbox to top (#4067) 2023-07-24 20:27:01 +02:00
Badlop 9c6fe98f76 Partially revert "Improve ejabberdctl script: Copy recent commit 6272c0e90 to the container"
This reverts commit e66ba2e424
following the revert in commit 8288774787
2023-07-24 20:26:37 +02:00
Holger Weiss c03af0afb3 make-binaries: Remove outdated workaround
Remove a workaround for an issue that has been fixed in Erlang/OTP 25:

https://github.com/erlang/otp/pull/5558
2023-07-24 00:11:32 +02:00
Holger Weiss d109d7f0c5 make-binaries: Revert to Linux-PAM 1.5.2
Linux-PAM's --disable-examples flag doesn't seem to have the expected
effect.
2023-07-23 16:34:21 +02:00
Holger Weiss bf9b257eab make-binaries: Don't build Linux-PAM examples
Building the examples shipped with Linux-PAM 1.5.3 fails with musl libc:

https://github.com/linux-pam/linux-pam/commit/5374f677e4cae669eb9accf2449178b602e8a40a
2023-07-23 16:08:25 +02:00
Holger Weiss 11dc0c1774 make-binaries: Bump dependency versions 2023-07-23 15:52:32 +02:00
Holger Weiss 0a5eda0777 make-binaries: Fix check for current Expat version 2023-07-23 15:51:27 +02:00
Holger Weiss a657a6d2f6 make-binaries: Apply another minor simplification 2023-07-23 15:35:09 +02:00
Holger Weiss 121acd1da7 make-binaries: Apply minor simplifications 2023-07-23 15:06:40 +02:00
Holger Weiss ec86079747 make-binaries: Don't duplicate config entries 2023-07-23 14:56:01 +02:00
Holger Weiss f1b0a9cb32 make-binaries: Don't hard-code musl version
The default is to link against the most-recent musl version available
within the crosstool-ng toolchain, which is currently 1.2.2.  Unlike
with glibc, there's no point in sticking to some older version.
2023-07-23 14:54:04 +02:00
Holger Weiss 0b6cb77b3c make-binaries: Omit unnecessary glibc setting
The CT_GLIBC_KERNEL_VERSION_NONE option is about the minimum kernel
version supported by the toolchain's glibc.  The default is to stick to
the version of the kernel headers, which should be just fine.
2023-07-23 14:52:18 +02:00
Holger Weiss 8a740d5087 make-binaries: Set kernel version for all builds
Specify the same min. supported kernel version for builds against musl
libc and glibc.
2023-07-23 14:49:07 +02:00
Jérôme Sautret 8288774787 Add EJABBERD_OPTS in ejabberdctl.cfg & revert "Improve ejabberdctl script"
EJABBERD_OPTS is used to pass options to erl only when starting
ejabberd, to enable -heart for example.

This partially reverts commit 6272c0e901.
2023-07-18 15:31:10 +02:00
Paweł Chmielowski d349e3a88e Revert "Add stun app to cond_apps in mix.exs"
Looks like this is required only when using older mix versions.

This reverts commit 2ef9fbc111.
2023-07-18 11:14:57 +02:00
Paweł Chmielowski 2ef9fbc111 Add stun app to cond_apps in mix.exs 2023-07-17 18:40:39 +02:00
Badlop 78f81de252 Improve support to stop external modules written in Elixir 2023-07-13 13:41:18 +02:00
dependabot[bot] 8d9ee8e35b Bump ex_doc from 0.29.4 to 0.30.1
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.29.4 to 0.30.1.
- [Changelog](https://github.com/elixir-lang/ex_doc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/elixir-lang/ex_doc/compare/v0.29.4...v0.30.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>
2023-07-13 13:41:14 +02:00
Badlop e66ba2e424 Improve ejabberdctl script: Copy recent commit 6272c0e90 to the container 2023-07-13 13:41:06 +02:00
Paweł Chmielowski fafb48e88f Merge pull request #4025 from jpds/increase-default-backlog
ejabberd_listener.erl: Increase default listen queue backlog value
2023-07-11 12:19:33 +02:00
Jérôme Sautret 6272c0e901 Improve ejabberdctl script
Improved handling of ERLANG_OPTS and fixed hanging process when running some ejabberdctl commands as root, such as debug or foreground.
2023-07-10 16:18:06 +02:00
Paweł Chmielowski 54314e5bb9 Better error handling in mod_muc_rtbl
Should fix issue #4050
2023-07-04 18:18:49 +02:00
Badlop ffbcf19156 Halt ejabberd if a command in CTL_ON_ fails during ejabberd startup
See processone/ejabberd-contrib#97
2023-06-20 17:54:10 +02:00
Badlop dcc8149f58 New command to halt ejabberd abruptly with an error status code
Used for processone/ejabberd-contrib#97
2023-06-20 17:54:10 +02:00
Badlop d2c54fd5fe Fix calling ejabberdctl command with wrong number of arguments with Erlang 26
In Erlang up to 25.3, the lists:zip arguments were [A1, A2]
Since Erlang 26.0, the arguments are: [A1, A2, fail]

https://github.com/erlang/otp/commit/93748a8d841efc8f8246074ca721607efecebe2d
2023-06-13 12:25:27 +02:00
Badlop f40a7b1c77 OAuth: Handle badpass error message 2023-06-13 12:25:22 +02:00
Badlop 16f758e13f Support to provide only the dependency name
This is used in ejabberd-contrib repository's ci.yml,
and useful for a custom development that doesn't require rebar2 support.
2023-06-12 20:48:47 +02:00
Badlop c333cc0776 New option install_contrib_modules
This option is read during ejabberd start or config reload.
It installs the listed modules which aren't yet installed,
as long as allow_contrib_modules is not disabled.
Edit ejabberd.yml and configure the desired ejabberd-contrib modules,
add them in the install_contrib_modules option,
finally start ejabberd (or reload config).
2023-06-09 10:27:13 +02:00
Badlop 3263e81972 Move Xref and Dialyzer options from workflows to rebar.config
And also include some more applications in Dialyzer plt_extra_apps,
which apparently is required since Erlang 26.
2023-06-09 00:02:20 +02:00
Badlop 397a08afca Move configure options from the Test to the Compile section 2023-06-09 00:02:18 +02:00
Badlop 19070e4b04 Add sections to rebar.config to organize its content 2023-06-09 00:02:17 +02:00
Badlop 0bbc255814 Dialyzer dirty workarounds because re:mp() is not an exported type
Since Erlang/OTP 26, Dialyzer by default reports unknown types.
ejabberd's type specs refer to the re:mp() type,
but that isn't exported in the OTP source code,
and cannot be used in any other modules.
This commit provides very dirty workarounds, and any cleaner
alternative is very welcomed.
2023-06-09 00:02:15 +02:00
Badlop 1b06f4ca4f The warnings_as_errors compiler option is already disabled by default 2023-06-09 00:02:13 +02:00
Badlop b3eeac637f Update tests to Erlang/OTP 26 and recent Elixir 2023-06-09 00:02:10 +02:00
Badlop 480b42b36d Run Dialyzer again with Erlang/OTP 26, and let's solve its problems 2023-06-09 00:02:06 +02:00
Badlop 436074c67a When installing module already configured, keep config as example
When installing a module using ext_mod, if it has already configuration
in the modules section, copy its specific config file as an example
(copy file and rename it).
This may happen when using the new install_contrib_modules option.
2023-06-09 00:02:02 +02:00
Badlop c9a2117570 Ignore .tool-versions in git, this file is used by asdf 2023-06-09 00:01:56 +02:00
sando38 6155b001b4 Dockerfile: Reorder stages and steps for consistency
Also avoid duplicated lines.
2023-06-09 00:01:54 +02:00
sando38 8f05af7810 Dockerfile: Use Alpine as base for METHOD=package
No need to use the "large" docker.io/erlang image as we do not need any erlang/otp for the binary installers.
2023-06-09 00:01:51 +02:00
sando38 33ac7916d3 Dockerfile: Cosmetic changes
Ommit the path to ejabberdctl as it is already located at the $PATH

Also, do not copy Dockerfile into the container as this may unnecessarily trigger re-compiling of ejabberd.
2023-06-09 00:01:49 +02:00
sando38 461c1ddf3d Dockerfile: Rename packages to improve compatibility
Rename libcap packages to improve compatibility between Alpine versions. This may be beneficial if one specifies an OTP_VSN which was built using an older Alpine base version.

The alpine package libcap has been splitted into libcap2 and libcap-utils in Alpine 3.17. 'libcap' is now an alias for libcap2 and libcap-utils. We define 'so:libcap.so.2' for the runtime stage, as we only need the libraries, not the binaries.
2023-06-09 00:01:46 +02:00
sando38 2428f74fbd Dockerfile: Provide specific OTP and elixir vsn for direct compilation
Ejabberd images can now be built with specific erlang/OTP and elixir vsn with the new build arguments OTP_VSN and ELIXIR_VSN.
2023-06-09 00:01:36 +02:00
Paweł Chmielowski bb8e892323 Add alternate version of mysql upsert
This one works by issuing select and then insert or update or skip depending
on what select returns. We use this on mysql 5.7.26 and 8.0.20 where
previous implementation using 'replace' or 'on conflict update' can cause
excessive deadlocks.
2023-06-07 16:38:07 +02:00
Paweł Chmielowski 3eecf4ae8a Remove existing role information for users that are kicked from room
This should fix issue reported in #4035
2023-05-24 12:15:20 +02:00
Paweł Chmielowski 4a53d4cb56 Expand rule "mucsub subscribers are members in members only rooms" to more places 2023-05-24 11:26:48 +02:00
Paweł Chmielowski 1818a29c29 Don't crash in mod_shared_roster_ldap:get_member_jid on empty output
This based on crash from issue #3614
2023-05-22 12:48:29 +02:00
Paweł Chmielowski dd2efc360b Fix return values from calculate_diff inside mod_privacy_sql 2023-05-02 15:59:40 +02:00
Paweł Chmielowski 8e64992f47 Use more efficient way to calculate changes in set_privacy_list 2023-05-02 11:43:29 +02:00
Jonathan Davies 040c72f1c8 ejabberd_listener.erl: Increase default listen queue backlog value to 128, which
is the default value on both Linux and FreeBSD.
2023-04-25 20:11:04 +01:00
Badlop d95a1bac3e Use container names to differentiate them; don't force logo height 2023-04-25 09:50:19 +02:00
Badlop c6b295b5a0 Fix typo in the previous commit 2023-04-25 09:48:02 +02:00
Badlop 2a4a6bec18 Add trailing backslash to URLs shown in mod_muc_log disco#info 2023-04-24 13:43:09 +02:00
Badlop 0d3f8c7b9f Make mod_register_web redirect to page that end with / (#3177)
Code copied from ejabberd_web_admin.erl, commit 5ec21438
2023-04-24 13:43:07 +02:00
Badlop d299b97261 Raise Erlang/OTP requirement to 20.0 2023-04-24 13:43:00 +02:00
Paweł Chmielowski 5b8ebed81b Optimize mod_privacy_sql:set_list
Previously we always did delete everything and set all entries back, now
we check if we need to delete anything and if not insert only missing data.
2023-04-20 10:55:30 +02:00
Badlop bb28265261 Set version to 23.04
Container / Container (push) Failing after 1m47s
Installers / Binaries (push) Failing after 56s
Runtime / Rebars (20.3, rebar) (push) Failing after 3s
Runtime / Rebars (20.3, rebar3) (push) Failing after 3s
Runtime / Rebars (25.3, rebar) (push) Failing after 3s
Runtime / Rebars (25.3, rebar3) (push) Failing after 2s
Runtime / Rebars (26, rebar3) (push) Failing after 1m24s
Installers / Release (push) Has been skipped
CI / Tests (20.0) (push) Has been cancelled
CI / Tests (25.3) (push) Has been cancelled
CI / Tests (26.0-rc3) (push) Has been cancelled
Runtime / Mix (1.10.3, 21.3) (push) Has been cancelled
Runtime / Mix (1.10.3, 22.0) (push) Has been cancelled
Runtime / Mix (1.11.4, 21.3) (push) Has been cancelled
Runtime / Mix (1.11.4, 22.0) (push) Has been cancelled
Runtime / Mix (1.12.3, 22.0) (push) Has been cancelled
Runtime / Mix (1.13.0, 22.0) (push) Has been cancelled
Runtime / Mix (1.13.0, 25.0) (push) Has been cancelled
Runtime / Mix (1.14.0, 25.0) (push) Has been cancelled
2023-04-18 11:39:33 +02:00
Paweł Chmielowski 46f33e5051 Update dependencies 2023-04-18 11:22:33 +02:00
Badlop 06669b12e8 Update changelog 2023-04-18 11:12:18 +02:00
Badlop 1ca126381b Update man 2023-04-18 10:37:22 +02:00
dependabot[bot] bf5de81b24 Bump ex_doc from 0.29.3 to 0.29.4
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.29.3 to 0.29.4.
- [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.29.3...v0.29.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-18 10:37:16 +02:00
Badlop d717ffd1a0 Update version notes of options and commands 2023-04-18 10:37:14 +02:00
Badlop c271d73dbd CI: Update Erlang/OTP to 26.0-rc3 2023-04-18 10:37:11 +02:00
Badlop e1a8980d6c Container: no need to specify captcha_url, auto may be enough in most cases 2023-04-18 10:37:08 +02:00
Badlop ec7ff88dda Update Portuguese translation (thanks to Silvério Santos) 2023-04-18 10:37:06 +02:00
Badlop 5b695766ae Mention what ejabberd version first supports rtbl 2023-04-18 10:37:04 +02:00
Paweł Chmielowski f5b6909cca Unregister hooks on stop in mod_muc_rbtl 2023-04-17 18:03:21 +02:00
Paweł Chmielowski 98d348893b Make mod_muc_rtbl notify only local node rooms 2023-04-17 17:07:59 +02:00
Paweł Chmielowski c942c31e38 Add mod_muc_rtbl
This implements Real-time blocklists for XMPP (xmppbl.org).

Closes #4017
2023-04-17 16:59:42 +02:00
Paweł Chmielowski 70cbdd1117 Allow to update state from muc_process_iq hook 2023-04-17 16:57:54 +02:00
Paweł Chmielowski 1114a35e0a Recognize message retractions in mod_muc 2023-04-14 12:32:35 +02:00
Paweł Chmielowski d12e5a44b8 Add by attribute to generated muc moderation messages 2023-04-14 12:31:34 +02:00
Badlop 34420444db Container: Revert change in entrypoint that was added in d15cf994a 2023-04-11 15:29:28 +02:00
Badlop 38eb50bf5c Container: Reorganize how to build container image 2023-04-11 15:29:26 +02:00
Badlop 6705679cf3 Container: Update instructions to build image following d15cf994a (#3983) 2023-04-11 15:29:24 +02:00
Badlop 10635bccc9 Container: Reword sentences about docker.io and ghcr.io 2023-04-11 15:29:23 +02:00
Badlop dee0ec50b9 Remove ci-19.3, as Github Actions no longer supports ubuntu-18.04 2023-04-11 15:29:21 +02:00
sando38 401bdedae8 Dockerfile: Detect runtime dependencies automatically
Only libcap2 and tini can't be auto-detected. libcap2 has been renamed in Alpine version 3.17, hence the Dockerfile is not compatible with Alpine versions <3.17
2023-04-11 15:27:49 +02:00
Badlop 99e51a2123 Mention in mod_mam.erl its support for XEP-0425: Message Moderation
Then run "make doap" to regenerate ejabberd.doap
2023-03-30 17:02:54 +02:00
Badlop d43ce53f9a Update xmpp version in mix following commit 6da1bb5b2 2023-03-30 16:54:35 +02:00
Paweł Chmielowski f6385fae50 Fix dialyzer warning 2023-03-30 14:53:51 +02:00
Paweł Chmielowski 6da1bb5b22 Add support for "xep-0424 Message Moderation"
This fixes issue #3730
2023-03-30 14:38:08 +02:00
Badlop 64e1cfcbba Test only with oldest OTP supported, newest stable and bleeding edge 2023-03-28 11:41:57 +02:00
Badlop fbfcebf417 Container: Remove Elixir Matchers to prevent useless warnings in github actions page 2023-03-28 11:41:56 +02:00
Saarko d15cf994a2 Container: Add METHOD to build container using packages (#3983)
make-*: include musl build in make-binaries

Ctr actions: use github runners to provide bootstrap erlang

- adjust make-binaries script to use github runners' installed erlang
  for bootstrapping
- this reduces the need to build an unnecessary toolchain for glibc
  based binaries
2023-03-28 11:41:54 +02:00
Saarko c71887db43 Container: Add tini as runtime init 2023-03-28 11:41:52 +02:00
Badlop 7c634f3615 Container: No need of openssl package at runtime 2023-03-28 11:41:51 +02:00
Badlop 874b961680 Container: Remove unused Mix stuff: ejabberd script and static COOKIE
Instead of including this file in the container with static content:
  /opt/ejabberd-master/releases/COOKIE
the cookie file will be generated by erlang in
  /opt/ejabberd/.erlang.cookie
or by ejabberdctl if ERLANG_COOKIE environment variable was provided.
2023-03-28 11:41:49 +02:00
Badlop 2c1ee698cc Container: Copy captcha scripts to /opt/ejabberd-*/lib like the installers
Instead of a path like
  /opt/ejabberd-master/lib/ejabberd-23.1.0/priv/bin
they are now in
  /opt/ejabberd-master/lib
2023-03-28 11:41:47 +02:00
Badlop b0f0dd3227 Container: Expose only HOME volume, it contains all the required subdirs 2023-03-28 11:41:46 +02:00
Badlop de477f7b6c Container: Update Alpine to 3.17 to get Erlang/OTP 25 and Elixir 1.14 2023-03-28 11:41:44 +02:00
Saarko 440ede313b make-binaries: fix building with erlang/otp v25.x
Signed-off-by: sando38 <sandomir@tutanota.com>
2023-03-28 11:41:43 +02:00
Saarko 976c6c5e41 make-binaries: bump versions, e.g. erlang/otp to 25.3 2023-03-28 11:41:41 +02:00
Badlop 7e6d25314d make-packages: Fix for installers workflow, which didn't find lynx... 2023-03-28 11:41:39 +02:00
Badlop cc5c3f7b2c ejabberdctl: Don't use .../releases/COOKIE, it's no longer included
And slightly clean the .erlang.cookie line
This partially reverts 9c23a7dc3f
2023-03-28 11:41:33 +02:00
Badlop 1d62dc4621 Set roster name from XEP-0172, or the stored one (#1611) 2023-03-28 11:41:27 +02:00
Badlop e2496562f9 Preliminary support to store extra elements in subscription request (#840) 2023-03-28 11:41:24 +02:00
Badlop c4a2f8d64f captcha_url option now accepts 'auto' value, and it's the default 2023-03-22 16:23:41 +01:00
Badlop 6c620f6f43 Remove wrong get_room_history command fields specification 2023-03-22 16:23:37 +01:00
dependabot[bot] af29adb558 Bump ex_doc from 0.29.2 to 0.29.3
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.29.2 to 0.29.3.
- [Release notes](https://github.com/elixir-lang/ex_doc/releases)
- [Changelog](https://github.com/elixir-lang/ex_doc/blob/v0.29.3/CHANGELOG.md)
- [Commits](https://github.com/elixir-lang/ex_doc/compare/v0.29.2...v0.29.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-22 16:23:33 +01:00
Paweł Chmielowski 3c97775573 Pubsub xdata fields max_item/item_expira/children_max use 'max' not 'infinity'
Codec in xmpp crashes when we use infinity (see issue #4011), so lets
convert those values before passing them to xmpp:encode(0
2023-03-21 15:30:44 +01:00
Blake Miller f953dc3f5e Persist none role for outcasts
`none` roles *should* be persisted for banned users. I totally forgot about this, my bad. I'm shocked nobody else noticed it.
2023-03-20 17:07:10 +01:00
dependabot[bot] 04b431f191 Bump ex_doc from 0.29.1 to 0.29.2
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.29.1 to 0.29.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.29.1...v0.29.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>
2023-03-07 13:11:26 +01:00
Badlop 5cd6c524ea Allow XML to be visible in web browser in Common Test page 2023-03-07 13:11:24 +01:00
Badlop 37676757e3 CI: Add OTP 26.0-rc1 to the test matrix
But disable dialyzer in 26, as it complains verbosely without reason
2023-03-07 13:11:22 +01:00
Badlop 1c82daacb2 CI: Upload Common Test logs as artifact in case of failure 2023-03-07 13:11:21 +01:00
Badlop 9f0a5c5ef0 CI: Produce less verbose logs for tests
This gets a line first introduced in 5b5548b8c that was lost later
2023-03-07 13:11:19 +01:00
Badlop 9bb86132c6 CI: Use default verbosity to let log files contain XMPP stanzas
This partially reverts 2a7780507
2023-03-07 13:11:17 +01:00
Badlop 2137a4f663 Fix Shellcheck warnings in shell scripts 2023-02-21 18:17:26 +01:00
Badlop c9143dd3d8 Fix TSQLlint warnings in MSSQL test script 2023-02-21 18:17:25 +01:00
Badlop 66d58504d0 Fix TSQLlint warning about typo in mssql.new.sql 2023-02-21 18:16:59 +01:00
Badlop 0def333550 Fix Remark-lint warnings 2023-02-21 18:14:02 +01:00
Badlop dea452bdfd Fix Prospector and Pylint warnings in test extauth.py 2023-02-21 18:14:02 +01:00
dependabot[bot] d504ed8a9b Container: Bump docker/build-push-action from 3 to 4
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3 to 4.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-21 18:13:15 +01:00
Paweł Chmielowski 9503beca6c Make mod_muc_room:set_opts process persistent flag first
As processing some other options depends on this setting flag in room
state.
2023-02-20 13:42:52 +01:00
Paweł Chmielowski dfe4884d16 Allow passing affiliations and subscribers to create_room_with_opts command 2023-02-20 13:03:46 +01:00
Paweł Chmielowski f10f6d176f Store state in db in mod_muc:create_room() 2023-02-20 12:56:41 +01:00
Paweł Chmielowski 4e7aa41e3f Make subscribers members by default 2023-02-20 12:55:31 +01:00
Paweł Chmielowski d91812730b Stop ejabberd_system_monitor before stopping node
Sometimes monitor module is performing checks when node is stopping and
this causes crash in monitoring process.
2023-02-08 19:53:19 +01:00
Paweł Chmielowski 54cf37e917 Invalidate vcard_xupdate cache on all nodes when vcard is updated 2023-02-08 19:06:44 +01:00
Paweł Chmielowski 3de803be2f Add get_room_history command in mod_muc_admin 2023-02-08 11:04:26 +01:00
Paweł Chmielowski 5ca59807d9 Fix problem with results of mam queries using rsm with max and before
Plus add test case for it.
2023-02-03 11:37:54 +01:00
Paweł Chmielowski 5c3b43cd63 Update spec 2023-02-01 17:32:22 +01:00
Paweł Chmielowski 1a6baf223c Re-allow anonymous connection for connection without client certificates
This fixes issue #3985. Initial issue was introduced in
5506b838c8 adding tls client cert
authentication.
2023-02-01 16:58:25 +01:00
Paweł Chmielowski 74c9aa8ac0 Merge pull request #3982 from nosnilmot/sql-update-tests
SQL schema migration fixes and testing
2023-02-01 12:03:48 +01:00
Badlop fb16727180 Ammend previous commit with another fix 2023-01-27 15:40:34 +01:00
Badlop 9842b035e3 Fix compilation problem with Erlang/OTP older than 21 introduced recently
Those macros were first introduced in c88a2d0
2023-01-27 15:29:41 +01:00
Alexey Shchepin f6b5a52104 Add s2s_out_bounce_packet hook 2023-01-27 03:54:31 +03:00
Alexey Shchepin f650b1e83c Log HTTP handler exceptions 2023-01-27 03:54:31 +03:00
Badlop 03cbc9b004 Revert previous commit, stick with Alpine 3.16 and Erlang/OTP 24 (#3983)
Alpine 3.17 includes Erlang/OTP 25, and it segfaults when
used in QEMU for arm64.

Revert "Update Alpine to 3.17 to get Elixir 1.14 required by recent libraries"
This reverts commit 43cae922f3.
2023-01-26 14:53:14 +01:00
Badlop 43cae922f3 Update Alpine to 3.17 to get Elixir 1.14 required by recent libraries 2023-01-25 17:58:27 +01:00
Badlop c5c7e7fc4d ext_mod: Improve support for loading *.so files from ext_mod dependencies
Copying files from deps/*/priv/*.so to the ejabberd priv/
is not possible when running ejabberd as OTP release or in a container.
Instead, let's copy the deps/*/priv/*.so maintaining the file structure,
and then using code:add_pathz for those dirs.

This partially reverts 5c1b72853f
2023-01-25 17:58:12 +01:00
Stu Tomlinson 0c1cf43519 Fix a long standing bug in new schema migration
... and make the test that uncovered it explicitly fail (there was already a
TODO) instead of passing but with errors logged
2023-01-21 15:42:43 +00:00
Stu Tomlinson cbbf85c555 Add support for running tests on MS SQL 2023-01-21 15:42:43 +00:00
Stu Tomlinson 56e974ab80 Add ability to run tests on upgraded DB
To test update_sql operation and functionality of resulting DB:

1. Load original schema to DB
2. Set {update_sql, true} in suite.erl
3. Run tests
2023-01-21 15:42:43 +00:00
Stu Tomlinson 9398052b65 New schema migration 'update_sql' improvements
- check that server_host column does not already exist before addding it
  and making other changes to table (update_sql becomes idempotent,
  yay!)
- check that indexes exist before dropping them (some are historical and
  are not created in more recent deployments), elminating spurious
  errors from logs
- update new_sql_schema config after migration, to allow near
  zero-downtime migrations (and help with automated testing)
2023-01-21 14:54:36 +00:00
Stu Tomlinson 6a8899677d Un-deprecate ejabberd_config:set_option/2
There does not appear to be an alternative way to set individual config
options, and this is already used by test/ejabberd_SUITE.erl
2023-01-21 14:54:36 +00:00
Paweł Chmielowski 3b34538038 Remove debug line from last commit 2023-01-20 17:12:50 +01:00
Paweł Chmielowski 6cf1e05993 Try to populate room history from mam when unhibernating 2023-01-20 16:27:08 +01:00
Paweł Chmielowski baf1336761 Merge pull request #3980 from nosnilmot/sql-maintenance
SQL related fixes and updates
2023-01-20 14:18:55 +01:00
Stu Tomlinson 4f0e426a12 Change PostgreSQL SERIAL to BIGSERIAL columns
This is consistent with other schemas, internally consistent with
foreign keys, and allows for > 2B records in these tables.
2023-01-19 23:36:42 +00:00
Stu Tomlinson d5bf051e79 Fix minor SQL schema inconsistencies 2023-01-19 23:36:42 +00:00
Stu Tomlinson c7c982b67b Add MS SQL support for new schema migration 2023-01-19 23:36:42 +00:00
Stu Tomlinson f7f0d3b1fb Enable MySQL support for new schema migration 2023-01-19 23:36:42 +00:00
Stu Tomlinson d4ab4d16e8 Use python3 to run extauth.py for tests 2023-01-19 23:36:42 +00:00
Stu Tomlinson aeed1679d8 Add 'new' schema for MS SQL 2023-01-19 23:36:42 +00:00
Stu Tomlinson 6fc67d83f4 Minor MS SQL improvements
Support 'sql_ssl' option for MS SQL - set Encryption=required and
Encrypt=yes in ODBC connection string to require SSL using default
FreeTDS driver and Microsoft ODBC Driver for SQL Server repectively.

Allow setting full ODBC connection string in 'sql_server' for MS SQL,
allowing custom connection configuration beyond what is possible with
just 'sql_odbc_driver' option.
2023-01-19 23:36:42 +00:00
Stu Tomlinson 06ffe995e1 Remove unnecessary indexes
For columns are already included in a compound index there is no
benefit to having a separate index with a subset of the same columns in
the same order, it just wastes space.
2023-01-19 23:36:42 +00:00
Stu Tomlinson 93bf4d5411 New SQL schema migrate fix
'server_host' column on 'route' table already exists in old schema and
does not need adding for new schema migration.
2023-01-19 23:36:42 +00:00
Stu Tomlinson 19f2f1fa86 Fix MS SQL error caused by ORDER BY in subquery
'The ORDER BY clause is invalid in views, inline functions, derived
tables, subqueries, and common table expressions, unless TOP, OFFSET
or FOR XML is also specified.'

Omit the ORDER BY clause from subquery if the SELECT is not constrained
by TOP.
2023-01-19 23:36:42 +00:00
Stu Tomlinson 5e94fdcfd5 MS SQL schema fixes
* Add missing 'mix' tables and indexes

* Fix text vs varchar issues

Various tests triggered this error:
The data types text and varchar are incompatible in the equal to operator.

Caused by incompatible 'text' columns in muc_online_room,
muc_online_users, pubsub_node_option, and pubsub_node tables.

* Fix definition of mqtt_pub table

This table incorrectly included 'server_host' column in old schema, and
had other inconsistencies.
2023-01-19 23:35:05 +00:00
Stu Tomlinson ec6f5c17c8 Correct README for creating test docker MS SQL DB 2023-01-19 14:06:11 +00:00
Paweł Chmielowski 758c87f564 Revert notes placement when generating markdown api commands documentation 2023-01-19 13:24:51 +01:00
Paweł Chmielowski b6dde41000 Improve output in gen_html_doc_for_commands command 2023-01-19 11:45:33 +01:00
Stu Tomlinson 648c83ea03 Fix ejabberdctl output formatting (#3979)
ECMA-48 SGR sequence ESC [21m is actually 'set double underline' but was
incorrectly implemented as 'set normal intensity' in Linux prior to
4.17.

The correct sequence for 'set normal intensity' is ESC [22m, which fixes
output formatting of 'ejabberdctl' and 'ejabberdctl help' on macos.
2023-01-19 11:18:59 +01:00
378 changed files with 15498 additions and 3977 deletions
+1 -1
View File
@@ -43,4 +43,4 @@ Mnesia.nonode@nohost/
/ejabberd-*.rpm
/ejabberd-*.run
/ejabberd-*.tar.gz
/.github/container/Dockerfile
+1 -2
View File
@@ -6,8 +6,7 @@ assignees: ''
---
Before creating a ticket, please consider if this should fit the discussion forum better:
https://github.com/processone/ejabberd/discussions
Before creating a ticket, please consider if this should fit the [discussion forum](https://github.com/processone/ejabberd/discussions) better.
## Environment
+6 -3
View File
@@ -7,17 +7,20 @@ assignees: ''
---
Before creating a ticket, please consider if this should fit the discussion forum better:
https://github.com/processone/ejabberd/discussions
Before creating a ticket, please consider if this should fit the [discussion forum](https://github.com/processone/ejabberd/discussions) better.
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
A clear and concise description of what the problem is. Ex. I'm always frustrated when...
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
+156 -83
View File
@@ -1,55 +1,112 @@
FROM alpine:3.16 AS build
ARG VERSION=master
#' Define default build variables
## specifc ARGs for METHOD='direct'
ARG OTP_VSN='26.2'
ARG ELIXIR_VSN='1.16.1'
## specifc ARGs for METHOD='package'
ARG ALPINE_VSN='3.19'
## general ARGs
ARG UID='9000'
ARG USER='ejabberd'
ARG HOME="opt/$USER"
ARG METHOD='direct'
ARG BUILD_DIR="/$USER"
ARG VERSION='master'
RUN apk upgrade --update musl \
&& apk add \
autoconf \
automake \
bash \
build-base \
curl \
elixir \
erlang-odbc \
erlang-reltool \
expat-dev \
file \
gd-dev \
git \
jpeg-dev \
libpng-dev \
libwebp-dev \
linux-pam-dev \
openssl \
openssl-dev \
sqlite-dev \
yaml-dev \
zlib-dev
################################################################################
#' METHOD='direct' - build and install ejabberd directly from source
FROM docker.io/erlang:${OTP_VSN}-alpine AS direct
RUN apk -U add --no-cache \
autoconf \
automake \
bash \
build-base \
curl \
expat-dev \
file \
gd-dev \
git \
jpeg-dev \
libpng-dev \
libwebp-dev \
linux-pam-dev \
openssl-dev \
sqlite-dev \
yaml-dev \
zlib-dev
ARG ELIXIR_VSN
RUN wget -O - https://github.com/elixir-lang/elixir/archive/v$ELIXIR_VSN.tar.gz \
| tar -xzf -
WORKDIR elixir-$ELIXIR_VSN
RUN make install clean
RUN mix local.hex --force \
&& mix local.rebar --force
COPY . ./ejabberd
WORKDIR ejabberd
ARG BUILD_DIR
COPY / $BUILD_DIR/
WORKDIR $BUILD_DIR
RUN mv .github/container/ejabberdctl.template . \
&& ./autogen.sh \
&& ./configure --with-rebar=mix --enable-all \
&& make deps \
&& make rel
RUN cp -r _build/prod/rel/ejabberd/ /opt/ejabberd-$VERSION \
&& mkdir -p /opt/ejabberd \
&& mv /opt/ejabberd-$VERSION/conf /opt/ejabberd/conf
WORKDIR /rootfs
ARG VERSION
ARG HOME
RUN mkdir -p $HOME $HOME-$VERSION \
&& cp -r $BUILD_DIR/_build/prod/rel/ejabberd/* $HOME-$VERSION \
&& mv $HOME-$VERSION/conf $HOME/conf
RUN BINPATH=$(dirname $(find /opt -name msgs))/bin/ \
&& mkdir -p $BINPATH \
&& cp tools/captcha*.sh $BINPATH
RUN cp -p $BUILD_DIR/tools/captcha*.sh $HOME-$VERSION/lib
RUN [ ! -d .ejabberd-modules ] || cp -r .ejabberd-modules /opt/ejabberd/
RUN find "$HOME-$VERSION/bin" -name 'ejabberd' -delete \
&& find "$HOME-$VERSION/releases" -name 'COOKIE' -delete
RUN export PEM=/opt/ejabberd/conf/server.pem \
&& curl -o "/opt/ejabberd/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' \
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"
################################################################################
#' 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
RUN if [ ! -d $HOME/.ejabberd-modules ]; \
then \
if [ -d $BUILD_DIR/.ejabberd-modules ]; \
then cp -r $BUILD_DIR/.ejabberd-modules $HOME; \
else git clone https://github.com/processone/ejabberd-contrib --depth 1 \
$HOME/.ejabberd-modules/sources/ejabberd-contrib; \
fi \
fi
RUN export PEM=$HOME/conf/server.pem \
&& openssl req -x509 \
-batch \
-nodes \
@@ -57,63 +114,79 @@ RUN export PEM=/opt/ejabberd/conf/server.pem \
-keyout $PEM \
-out $PEM \
-days 3650 \
-subj "/CN=localhost" \
&& sed -i '/^loglevel:/a \ \
\nca_file: /opt/ejabberd/conf/cacert.pem \
\ncertfiles: \
\n - /opt/ejabberd/conf/server.pem' "/opt/ejabberd/conf/ejabberd.yml"
-subj "/CN=localhost"
FROM alpine:3.16
ENV HOME=/opt/ejabberd
ARG VERSION=master
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 CONFIG_DIR=/$HOME/conf \
\nexport LOGS_DIR=/$HOME/logs \
\nexport SPOOL_DIR=/$HOME/database \
\nexec /$(find $home_root_dir -name ejabberdctl) \"\$@\"" \
> usr/local/bin/ejabberdctl \
&& chmod +x usr/local/bin/* \
&& scanelf --needed --nobanner --format '%n#p' --recursive $home_root_dir \
| tr ',' '\n' \
| sort -u \
| awk 'system("[ -e $home_root_dir" $1 " ]") == 0 { next } { print "so:" $1 }' \
| sed -e "s|so:libc.so|so:libc.musl-$(uname -m).so.1|" \
> /tmp/runDeps
RUN apk upgrade --update musl \
&& apk add \
expat \
freetds \
gd \
jpeg \
libgd \
libpng \
libstdc++ \
libwebp \
linux-pam \
ncurses-libs \
openssl \
sqlite \
sqlite-libs \
unixodbc \
yaml \
zlib \
&& ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so \
&& rm -rf /var/cache/apk/*
ARG UID
RUN chown -R $UID:$UID $HOME
COPY --from=build /opt /opt
RUN echo -e \
"#!/bin/sh \
\n[ -z \$ERLANG_NODE_ARG ] && export ERLANG_NODE_ARG=ejabberd@localhost \
\nexport CONFIG_DIR=/opt/ejabberd/conf \
\nexport LOGS_DIR=/opt/ejabberd/logs \
\nexport SPOOL_DIR=/opt/ejabberd/database \
\nexec /opt/ejabberd-$VERSION/bin/ejabberdctl \"\$@\"" > /usr/local/bin/ejabberdctl \
&& chmod +x /usr/local/bin/ejabberdctl
################################################################################
#' METHOD='direct' - Remove erlang/OTP & rebar3
FROM docker.io/erlang:${OTP_VSN}-alpine AS runtime-direct
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
RUN addgroup ejabberd -g 9000 \
&& adduser -s /bin/sh -D -G ejabberd ejabberd -u 9000 \
&& mkdir -p $HOME/conf $HOME/database $HOME/logs $HOME/upload \
&& chown -R ejabberd:ejabberd $HOME
################################################################################
#' 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 \
tini \
&& ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so
ARG USER
ARG UID
ARG HOME
RUN addgroup $USER -g $UID \
&& adduser -s /sbin/nologin -D -u $UID -h /$HOME -G $USER $USER
################################################################################
#' Build together production image
FROM scratch AS prod
ARG USER
ARG HOME
COPY --from=runtime / /
COPY --from=ejabberd /rootfs /
HEALTHCHECK \
--interval=1m \
--timeout=5s \
--start-period=5s \
--retries=10 \
CMD /usr/local/bin/ejabberdctl status
CMD ejabberdctl status
WORKDIR $HOME
USER ejabberd
VOLUME ["$HOME/conf", "$HOME/database", "$HOME/logs", "$HOME/upload"]
WORKDIR /$HOME
USER $USER
VOLUME ["/$HOME"]
EXPOSE 1883 4369-4399 5210 5222 5269 5280 5443
ENTRYPOINT ["/usr/local/bin/ejabberdctl"]
ENTRYPOINT ["/sbin/tini","--","ejabberdctl"]
CMD ["foreground"]
+105 -33
View File
@@ -15,10 +15,10 @@ SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)"
# shellcheck disable=SC2034
ERTS_VSN="{{erts_vsn}}"
ERL="{{erl}}"
IEX="{{bindir}}/iex"
EPMD="{{epmd}}"
[ -z "$ERLANG_COOKIE" ] && ERL_OPTIONS="-setcookie $(cat "${SCRIPT_DIR%/*}/releases/COOKIE")"
[ -n "$ERLANG_COOKIE" ] && [ ! -f "$HOME"/.erlang.cookie ] && echo "$ERLANG_COOKIE" > "$HOME"/.erlang.cookie && chmod 400 "$HOME"/.erlang.cookie
IEX="{{iexpath}}"
COOKIE_FILE="$HOME"/.erlang.cookie
[ -n "$ERLANG_COOKIE" ] && [ ! -f "$COOKIE_FILE" ] && echo "$ERLANG_COOKIE" > "$COOKIE_FILE" && chmod 400 "$COOKIE_FILE"
# check the proper system user is used
case $(id -un) in
@@ -60,7 +60,6 @@ done
# define ejabberd variables if not already defined from the command line
: "${CONFIG_DIR:="{{config_dir}}"}"
: "${LOGS_DIR:="{{logs_dir}}"}"
: "${SPOOL_DIR:="{{spool_dir}}"}"
: "${EJABBERD_CONFIG_PATH:="$CONFIG_DIR/ejabberd.yml"}"
: "${EJABBERDCTL_CONFIG_PATH:="$CONFIG_DIR/ejabberdctl.cfg"}"
# Allows passing extra Erlang command-line arguments in vm.args file
@@ -69,6 +68,7 @@ done
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
: "${SPOOL_DIR:="{{spool_dir}}"}"
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
# define erl parameters
@@ -77,7 +77,7 @@ if [ -n "$FIREWALL_WINDOW" ] ; then
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
fi
if [ -n "$INET_DIST_INTERFACE" ] ; then
INET_DIST_INTERFACE2=$("$ERL" -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
INET_DIST_INTERFACE2=$("$ERL" $ERLANG_OPTS -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
if [ -n "$INET_DIST_INTERFACE2" ] ; then
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
fi
@@ -90,11 +90,12 @@ ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
ERL_INETRC="$CONFIG_DIR"/inetrc
# define ejabberd parameters
EJABBERD_OPTS="$EJABBERD_OPTS\
$(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]\{1,\}\).*/ \1/;s/:[ \t]*\(infinity\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_burst_limit_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_burst_limit_window_time/!d;s/:[ \t]*\([0-9]*[a-z]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")"
EJABBERD_OPTS="\
$(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]\{1,\}\).*/ \1/;s/:[ \t]*\(infinity\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_burst_limit_count/!d;s/:[ \t]*\([0-9]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_burst_limit_window_time/!d;s/:[ \t]*\([0-9]*[a-z]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$EJABBERD_OPTS"
[ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS"
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
@@ -129,8 +130,8 @@ run_cmd()
exec_cmd()
{
case $EXEC_CMD in
as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;;
as_current_user) exec "$@" ;;
as_install_user) su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@" ;;
esac
}
run_erl()
@@ -162,9 +163,11 @@ debugwarning()
echo "Please be extremely cautious with your actions,"
echo "and exit immediately if you are not completely sure."
echo ""
echo "To detach this shell from ejabberd, press:"
echo " control+c, control+c"
echo "To exit and detach this shell from ejabberd, press:"
echo " control+g and then q"
echo ""
#vt100 echo "Please do NOT use control+c in this debug shell !"
#vt100 echo ""
echo "--------------------------------------------------------------------"
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
echo " EJABBERD_BYPASS_WARNINGS=true"
@@ -185,8 +188,8 @@ livewarning()
echo "Please be extremely cautious with your actions,"
echo "and exit immediately if you are not completely sure."
echo ""
echo "To exit this LIVE mode and stop ejabberd, press:"
echo " q(). and press the Enter key"
echo "To exit and detach this shell from ejabberd, press:"
echo " control+g and then q"
echo ""
echo "--------------------------------------------------------------------"
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
@@ -197,6 +200,39 @@ livewarning()
fi
}
check_etop_result()
{
result=$?
if [ $result -eq 1 ] ; then
echo ""
echo "It seems there was some problem running 'ejabberdctl etop'."
echo "Is the error message something like this?"
echo " Failed to load module 'etop' because it cannot be found..."
echo "Then probably ejabberd was compiled with development tools disabled."
echo "To use 'etop', recompile ejabberd with: ./configure --enable-tools"
echo ""
exit $result
fi
}
check_iex_result()
{
result=$?
if [ $result -eq 127 ] ; then
echo ""
echo "It seems there was some problem finding 'iex' binary from Elixir."
echo "Probably ejabberd was compiled with Rebar3 and Elixir disabled, like:"
echo " ./configure"
echo "which is equivalent to:"
echo " ./configure --with-rebar=rebar3 --disable-elixir"
echo "To use 'iex', recompile ejabberd enabling Elixir or using Mix:"
echo " ./configure --enable-elixir"
echo " ./configure --with-rebar=mix"
echo ""
exit $result
fi
}
help()
{
echo ""
@@ -225,16 +261,30 @@ help()
}
# dynamic node name helper
uid()
{
uuid=$(uuidgen 2>/dev/null)
random=$(awk 'BEGIN { srand(); print int(rand()*32768) }' /dev/null)
[ -z "$uuid" ] && [ -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid)
[ -z "$uuid" ] && uuid=$(printf "%X" "${random:-$$}$(date +%M%S)")
uuid=$(printf '%s' $uuid | sed 's/^\(...\).*$/\1/')
[ $# -eq 0 ] && echo "${uuid}-${ERLANG_NODE}"
[ $# -eq 1 ] && echo "${uuid}-${1}-${ERLANG_NODE}"
[ $# -eq 2 ] && echo "${uuid}-${1}@${2}"
uid() {
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
PF=$(( $$ % 97 ))
while
case $# in
0) NN="${PF}-${N}-${ERLANG_NODE}"
;;
1) NN="${PF}-${N}-${1}-${ERLANG_NODE}"
;;
2) NN="${PF}-${N}-${1}@${2}"
;;
esac
N=$(( N + 1 + ( $$ % 5 ) ))
"$EPMD" -names 2>/dev/null | grep -q " ${NN%@*} "
do :; done
echo $NN
else
# Erlang/OTP 23 or higher: use native dynamic node code
# https://www.erlang.org/patches/otp-23.0#OTP-13812
echo undefined
fi
}
# stop epmd if there is no other running node
@@ -281,8 +331,19 @@ post_waiter_loop()
LIST=$@
HEAD=${LIST%% ; *}
TAIL=${LIST#* ; }
echo ":> ejabberdctl $HEAD"
$0 $HEAD
HEAD2=${HEAD#\! *}
echo ":> ejabberdctl $HEAD2"
$0 $HEAD2
ctlstatus=$?
if [ $ctlstatus -ne 0 ] ; then
if [ "$HEAD" != "$HEAD2" ] ; then
echo ":> FAILURE in command '$HEAD2' !!! Ignoring result"
else
echo ":> FAILURE in command '$HEAD' !!! Stopping ejabberd..."
$0 halt > /dev/null
exit $ctlstatus
fi
fi
[ "$HEAD" = "$TAIL" ] || post_waiter_loop $TAIL
}
@@ -299,7 +360,9 @@ wait_status()
if [ $timeout -eq 0 ] ; then
status="$1"
else
run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
run_erl "$(uid ctl)" -hidden -noinput \
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
-s ejabberd_ctl \
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
status="$?"
fi
@@ -342,24 +405,31 @@ case $1 in
;;
etop)
set_dist_client
exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \
-s erlang halt -output text
exec_erl "$(uid top)" -hidden -remsh "$ERLANG_NODE" \
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
-s etop \
-output text
check_etop_result
;;
iexdebug)
debugwarning
set_dist_client
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
check_iex_result
;;
iexlive)
livewarning
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS" --app ejabberd
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS"
check_iex_result
;;
ping)
PEER=${2:-$ERLANG_NODE}
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
set_dist_client
exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \
-noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
-noinput -hidden \
-eval 'net_kernel:connect_node('"'$PEER'"')' \
-eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
-s erlang halt -output text
;;
started)
@@ -375,7 +445,9 @@ case $1 in
;;
*)
set_dist_client
run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
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
-229
View File
@@ -1,229 +0,0 @@
name: CI (19.3)
on:
push:
paths-ignore:
- '.devcontainer/**'
- 'examples/**'
- 'lib/**'
- 'man/**'
- 'priv/**'
- '**.md'
pull_request:
paths-ignore:
- '.devcontainer/**'
- 'examples/**'
- 'lib/**'
- 'man/**'
- 'priv/**'
- '**.md'
jobs:
tests:
name: Tests
strategy:
fail-fast: false
matrix:
otp: ['19.3']
runs-on: ubuntu-18.04
services:
redis:
image: redis
ports:
- 6379:6379
steps:
- uses: actions/checkout@v3
- name: Get specific Erlang/OTP
uses: erlef/setup-beam@v1
with:
otp-version: ${{ matrix.otp }}
- name: Get a compatible Rebar3
run: |
rm rebar3
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
chmod +x rebar3
- name: Prepare databases
run: |
sudo systemctl start mysql.service
sudo systemctl start postgresql.service
mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost'
IDENTIFIED BY 'ejabberd_test';"
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
TO 'ejabberd_test'@'localhost';"
mysql -u root -proot ejabberd_test < sql/mysql.sql
pg_isready
sudo -u postgres psql -c "CREATE USER ejabberd_test
WITH PASSWORD 'ejabberd_test';"
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
sudo -u postgres psql ejabberd_test -f sql/pg.sql
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
ON DATABASE ejabberd_test TO ejabberd_test;"
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
TABLES IN SCHEMA public
TO ejabberd_test;"
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
SEQUENCES IN SCHEMA public
TO ejabberd_test;"
- 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
- name: Prepare rebar
run: |
echo '{xref_ignores, [{eldap_filter_yecc, return_error, 2}
]}.' >>rebar.config
echo '{xref_checks, [deprecated_function_calls, deprecated_functions,
locals_not_used, undefined_function_calls, undefined_functions]}.
% Disabled: exports_not_used,' >>rebar.config
echo '{dialyzer, [{get_warnings, true}, {plt_extra_apps, [cache_tab,
eimp, epam, esip, ezlib, fast_tls, fast_xml, fast_yaml,
mqtree, p1_acme, p1_mysql, p1_oauth2, p1_pgsql, p1_utils, pkix,
sqlite3, stringprep, stun, xmpp, yconf]} ]}.' >>rebar.config
echo '{ct_extra_params, "-verbosity 20"}.' >>rebar.config
echo "{ct_opts, [{verbosity, 20}, {keep_logs, 20}]}." >>rebar.config
- name: Remove syntax_tools from release
run: sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
- name: Cache rebar
uses: actions/cache@v3
with:
path: |
~/.cache/rebar3/
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
- name: Compile
run: |
./autogen.sh
./configure --with-rebar=./rebar3 \
--prefix=/tmp/ejabberd \
--enable-all \
--disable-elixir \
--disable-mssql \
--disable-odbc
make update
make
- run: make install -s
- run: make hooks
- run: make options
- run: make xref
- run: make dialyzer
- name: Check Production Release
run: |
make rel
RE=_build/prod/rel/ejabberd
$RE/bin/ejabberdctl start
$RE/bin/ejabberdctl started
$RE/bin/ejabberdctl stop
$RE/bin/ejabberdctl stopped
cat $RE/logs/ejabberd.log
grep -q "is stopped in" $RE/logs/ejabberd.log
- name: Check Development Release
run: |
make dev
RE=_build/dev/rel/ejabberd
$RE/bin/ejabberdctl start
$RE/bin/ejabberdctl started
$RE/bin/ejabberdctl stop
$RE/bin/ejabberdctl stopped
cat $RE/logs/ejabberd.log
grep -q "is stopped in" $RE/logs/ejabberd.log
- name: Run tests
id: ct
run: |
(cd priv && ln -sf ../sql)
COMMIT=`echo $GITHUB_SHA | cut -c 1-7`
DATE=`date +%s`
REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"`
NODENAME=$DATE@$GITHUB_RUN_NUMBER-$GITHUB_ACTOR-$REF_NAME-$COMMIT
LABEL=`git show -s --format=%s | cut -c 1-30`
./rebar3 ct --name $NODENAME --label "$LABEL"
./rebar3 cover
- name: Check results
if: always() && (steps.ct.outcome != 'skipped' || steps.ct2.outcome != 'skipped')
id: ctresults
run: |
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
ln `find logs/ -name suite.log` logs/suite.log
grep 'TEST COMPLETE' logs/suite.log
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
test $(find logs/ -empty -name error.log)
- name: View logs failures
if: failure() && steps.ctresults.outcome == 'failure'
run: |
cat logs/suite.log | awk \
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
find logs/ -name error.log -exec cat '{}' ';'
find logs/ -name exunit.log -exec cat '{}' ';'
- name: Upload test logs
if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd'
uses: peaceiris/actions-gh-pages@v3
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: Prepare new schema
run: |
[[ -d logs ]] && rm -rf logs
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
mysql -u root -proot -e "DROP DATABASE ejabberd_test;"
sudo -u postgres psql -c "DROP DATABASE ejabberd_test;"
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
TO 'ejabberd_test'@'localhost';"
mysql -u root -proot ejabberd_test < sql/mysql.new.sql
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
sudo -u postgres psql ejabberd_test -f sql/pg.new.sql
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
ON DATABASE ejabberd_test TO ejabberd_test;"
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
TABLES IN SCHEMA public
TO ejabberd_test;"
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
SEQUENCES IN SCHEMA public
TO ejabberd_test;"
sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl
- run: CT_BACKENDS=mysql,pgsql make test
id: ctnewschema
- name: Check results
if: always() && steps.ctnewschema.outcome != 'skipped'
run: |
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
ln `find logs/ -name suite.log` logs/suite.log
grep 'TEST COMPLETE' logs/suite.log
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
test $(find logs/ -empty -name error.log)
- name: View logs failures
if: failure() && steps.ctnewschema.outcome != 'skipped'
run: |
cat logs/suite.log | awk \
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
find logs/ -name error.log -exec cat '{}' ';'
find logs/ -name exunit.log -exec cat '{}' ';'
+81 -29
View File
@@ -25,7 +25,7 @@ jobs:
strategy:
fail-fast: false
matrix:
otp: ['20.0', '21.3', '24.3', '25']
otp: ['20.0', '25', '26', '27.0-rc1']
runs-on: ubuntu-20.04
services:
redis:
@@ -35,10 +35,10 @@ jobs:
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Test shell scripts
if: matrix.otp == 25
if: matrix.otp == '26'
run: |
shellcheck test/ejabberd_SUITE_data/gencerts.sh
shellcheck tools/captcha.sh
@@ -46,35 +46,45 @@ jobs:
shellcheck -x ejabberdctl.template
- name: Get specific Erlang/OTP
if: matrix.otp != 25
uses: erlef/setup-beam@v1
with:
otp-version: ${{ matrix.otp }}
- name: Get a compatible Rebar3
if: matrix.otp <= '21.3'
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" \
-v $(pwd)/test/docker/db/mssql/initdb/initdb_mssql.sql:/initdb_mssql.sql:ro \
-v $(pwd)/sql/mssql.sql:/mssql.sql:ro \
-v $(pwd)/sql/mssql.new.sql:/mssql.new.sql:ro \
-p 1433:1433 --name ejabberd-mssql "mcr.microsoft.com/mssql/server:2019-latest"
sleep 10
- 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
sudo systemctl start mysql.service
sudo systemctl start postgresql.service
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost'
IDENTIFIED BY 'ejabberd_test';"
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
TO 'ejabberd_test'@'localhost';"
mysql -u root -proot ejabberd_test < sql/mysql.sql
mysql -u ejabberd_test -pejabberd_test ejabberd_test < sql/mysql.sql
pg_isready
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
sudo -u postgres psql -c "CREATE USER ejabberd_test
WITH PASSWORD 'ejabberd_test';"
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
sudo -u postgres psql ejabberd_test -f sql/pg.sql
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
ON DATABASE ejabberd_test TO ejabberd_test;"
PGPASSWORD="ejabberd_test" psql -h localhost -U ejabberd_test ejabberd_test -f sql/pg.sql
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
TABLES IN SCHEMA public
TO ejabberd_test;"
@@ -89,32 +99,18 @@ jobs:
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
- name: Prepare rebar
run: |
echo '{xref_ignores, [{eldap_filter_yecc, return_error, 2}
]}.' >>rebar.config
echo '{xref_checks, [deprecated_function_calls, deprecated_functions,
locals_not_used, undefined_function_calls, undefined_functions]}.
% Disabled: exports_not_used,' >>rebar.config
echo '{dialyzer, [{get_warnings, true}, {plt_extra_apps, [cache_tab,
eimp, epam, esip, ezlib, fast_tls, fast_xml, fast_yaml,
mqtree, p1_acme, p1_mysql, p1_oauth2, p1_pgsql, p1_utils, pkix,
sqlite3, stringprep, stun, xmpp, yconf]} ]}.' >>rebar.config
echo '{ct_extra_params, "-verbosity 20"}.' >>rebar.config
echo "{ct_opts, [{verbosity, 20}, {keep_logs, 20}]}." >>rebar.config
- name: Remove syntax_tools from release
run: sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
- name: Cache rebar
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: |
~/.cache/rebar3/
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
- name: Download test logs
if: matrix.otp == 25 && github.repository == 'processone/ejabberd'
if: matrix.otp == '26' && github.repository == 'processone/ejabberd'
continue-on-error: true
run: |
mkdir -p _build/test
@@ -166,6 +162,7 @@ jobs:
id: ct
run: |
(cd priv && ln -sf ../sql)
sed -i -e 's/ct:pal/ct:log/' test/suite.erl
COMMIT=`echo $GITHUB_SHA | cut -c 1-7`
DATE=`date +%s`
REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"`
@@ -193,7 +190,7 @@ jobs:
find logs/ -name exunit.log -exec cat '{}' ';'
- name: Send to coveralls
if: matrix.otp == 25
if: matrix.otp == '26'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
@@ -221,20 +218,60 @@ jobs:
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
with:
filters: |
sql:
- 'sql/**'
- 'src/mod_admin_update_sql.erl'
- name: Prepare for schema upgrade test
id: prepupgradetest
if: ${{ steps.filter.outputs.sql == 'true' }}
run: |
[[ -d logs ]] && rm -rf logs
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
sed -i 's|update_sql, false|update_sql, true|g' test/suite.erl
- name: Run DB tests on upgraded schema (mssql, mysql, pgsql)
run: CT_BACKENDS=mssql,mysql,pgsql make test
if: always() && steps.prepupgradetest.outcome != 'skipped'
id: ctupgradedschema
- name: Check results
if: always() && steps.ctupgradedschema.outcome != 'skipped'
run: |
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
ln `find logs/ -name suite.log` logs/suite.log
grep 'TEST COMPLETE' logs/suite.log
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
test $(find logs/ -empty -name error.log)
- name: View logs failures
if: failure() && steps.ctupgradedschema.outcome != 'skipped'
run: |
cat logs/suite.log | awk \
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
find logs/ -name error.log -exec cat '{}' ';'
find logs/ -name exunit.log -exec cat '{}' ';'
- name: Prepare new schema
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];"
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
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
TO 'ejabberd_test'@'localhost';"
mysql -u root -proot ejabberd_test < sql/mysql.new.sql
mysql -u ejabberd_test -pejabberd_test ejabberd_test < sql/mysql.new.sql
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
sudo -u postgres psql ejabberd_test -f sql/pg.new.sql
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
ON DATABASE ejabberd_test TO ejabberd_test;"
PGPASSWORD="ejabberd_test" psql -h localhost -U ejabberd_test ejabberd_test -f sql/pg.new.sql
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
TABLES IN SCHEMA public
TO ejabberd_test;"
@@ -242,7 +279,8 @@ jobs:
SEQUENCES IN SCHEMA public
TO ejabberd_test;"
sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl
- run: CT_BACKENDS=mysql,pgsql make test
- name: Run DB tests on new schema (mssql, mysql, pgsql)
run: CT_BACKENDS=mssql,mysql,pgsql make test
id: ctnewschema
- name: Check results
if: always() && steps.ctnewschema.outcome != 'skipped'
@@ -259,3 +297,17 @@ jobs:
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
find logs/ -name error.log -exec cat '{}' ';'
find logs/ -name exunit.log -exec cat '{}' ';'
- name: Upload CT logs
if: failure()
uses: actions/upload-artifact@v4
with:
name: ejabberd-ct-logs-${{matrix.otp}}
#
# Appending the wildcard character ("*") is a trick to make
# "ejabberd-packages" the root directory of the uploaded ZIP file:
#
# https://github.com/actions/upload-artifact#upload-using-multiple-paths-and-exclusions
#
path: _build/test/logs
retention-days: 14
+57 -9
View File
@@ -1,6 +1,8 @@
name: Container
on:
schedule:
- cron: '22 2 */6 * *' # every 6 days to avoid gha cache being evicted
push:
paths-ignore:
- '.devcontainer/**'
@@ -17,24 +19,69 @@ env:
jobs:
container:
name: Container
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
permissions:
packages: write
steps:
- name: Check out repository code
uses: actions/checkout@v3
uses: actions/checkout@v4
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@v3
uses: actions/checkout@v4
with:
repository: processone/ejabberd-contrib
path: .ejabberd-modules/sources/ejabberd-contrib
- name: Log in to the Container registry
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
@@ -46,7 +93,7 @@ jobs:
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v4
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
labels: |
@@ -55,15 +102,16 @@ jobs:
org.opencontainers.image.vendor=ProcessOne
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
- name: Build and push Docker image
uses: docker/build-push-action@v3
uses: docker/build-push-action@v5
with:
build-args: |
METHOD=package
VERSION=${{ steps.gitdescribe.outputs.ver }}
cache-from: type=gha
cache-to: type=gha,mode=max
+7 -7
View File
@@ -21,13 +21,13 @@ on:
jobs:
binaries:
name: Binaries
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
steps:
- name: Cache build directory
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: ~/build/
key: ${{runner.os}}-ct-ng-1.25.0
key: ${{runner.os}}-ct-ng-1.26.0
- name: Install prerequisites
run: |
sudo apt-get -qq update
@@ -41,7 +41,7 @@ jobs:
gem install --no-document --user-install fpm
echo $HOME/.local/share/gem/ruby/*/bin >> $GITHUB_PATH
- name: Check out repository code
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Build binary archives
@@ -55,7 +55,7 @@ jobs:
mkdir ejabberd-packages
mv ejabberd_*.deb ejabberd-*.rpm ejabberd-*.run ejabberd-packages
- name: Upload packages
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: ejabberd-packages
#
@@ -70,11 +70,11 @@ jobs:
release:
name: Release
needs: [binaries]
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
if: github.ref_type == 'tag'
steps:
- name: Download packages
uses: actions/download-artifact@v3
uses: actions/download-artifact@v4
with:
name: ejabberd-packages
- name: Draft Release
+267 -58
View File
@@ -31,105 +31,140 @@ jobs:
strategy:
fail-fast: false
matrix:
otp: ['19.3', '20.3', '24.3', '25']
otp: ['20', '25', '26', '27']
rebar: ['rebar', 'rebar3']
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
container:
image: erlang:${{ matrix.otp }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- 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: |
apt-get -qq update
apt-get purge -y libgd3
apt-get purge -y libgd3 nginx
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
- name: Compile
run: |
./autogen.sh
./configure --with-rebar=`which ${{ matrix.rebar }}` \
./configure --with-rebar=./${{ matrix.rebar }} \
--prefix=/tmp/ejabberd \
--enable-all \
--disable-elixir \
--disable-tools \
--disable-odbc
make update
make
- name: Prepare rebar
run: |
echo '{xref_ignores, [{eldap_filter_yecc, return_error, 2}
]}.' >>rebar.config
echo '{xref_checks, [deprecated_function_calls, deprecated_functions,
locals_not_used, undefined_function_calls, undefined_functions]}.
% Disabled: exports_not_used,' >>rebar.config
- run: make xref
- name: Test rel (rebar2)
- name: Prepare rel (rebar2)
if: matrix.rebar == 'rebar'
run: |
make rel
rel/ejabberd/bin/ejabberdctl start \
&& rel/ejabberd/bin/ejabberdctl started
rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
rel/ejabberd/bin/ejabberdctl registered_users localhost
cat rel/ejabberd/logs/*
mkdir -p _build/prod && ln -s `pwd`/rel/ _build/prod/rel
mkdir -p _build/dev && ln -s `pwd`/rel/ _build/dev/rel
- name: Test rel
if: matrix.rebar != 'rebar'
- name: Run rel
run: |
make rel
_build/prod/rel/ejabberd/bin/ejabberdctl start \
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
cat _build/prod/rel/ejabberd/logs/*
- name: Test dev
if: matrix.rebar != 'rebar'
- name: Run dev
run: |
make dev
_build/dev/rel/ejabberd/bin/ejabberdctl start \
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
_build/dev/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost
_build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
cat _build/dev/rel/ejabberd/logs/*
mix:
name: Mix
- name: Run install
run: |
make install
/tmp/ejabberd/sbin/ejabberdctl start \
&& /tmp/ejabberd/sbin/ejabberdctl started
/tmp/ejabberd/sbin/ejabberdctl register user3 localhost s0mePass
/tmp/ejabberd/sbin/ejabberdctl registered_users localhost >> registered.log
/tmp/ejabberd/sbin/ejabberdctl stop \
&& /tmp/ejabberd/sbin/ejabberdctl stopped
- name: View logs
run: |
echo "===> Registered:"
cat registered.log
echo "===> Prod:"
cat _build/prod/rel/ejabberd/logs/*
echo "===> Dev:"
cat _build/dev/rel/ejabberd/logs/*
echo "===> Install:"
cat /tmp/ejabberd/var/log/ejabberd/*
- name: Check logs
run: |
grep -q '^user1$' registered.log
grep -q '^user2$' registered.log
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
test $(find _build/prod/rel/ -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
test $(find _build/dev/rel/ -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
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
- name: View logs failures
if: always()
run: |
cat _build/prod/rel/ejabberd/logs/ejabberd.log
cat _build/prod/rel/ejabberd/logs/error.log
cat _build/dev/rel/ejabberd/logs/ejabberd.log
cat _build/dev/rel/ejabberd/logs/error.log
cat /tmp/ejabberd/var/log/ejabberd/ejabberd.log
cat /tmp/ejabberd/var/log/ejabberd/error.log
rebar3-elixir:
name: Rebar3+Elixir
strategy:
fail-fast: false
matrix:
otp: ['21.3', '22.0', '25.0']
elixir: ['1.10.3', '1.11.4', '1.12.3', '1.13.0', '1.14.0']
otp: ['23.0', '25', '26', '27.0-rc1']
elixir: ['1.13.4', '1.15.7', '1.16']
exclude:
- otp: '21.3'
elixir: '1.12.3'
- otp: '21.3'
elixir: '1.13.0'
- otp: '21.3'
elixir: '1.14.0'
- otp: '22.0'
elixir: '1.14.0'
- otp: '25.0'
elixir: '1.10.3'
- otp: '25.0'
elixir: '1.11.4'
- otp: '25.0'
elixir: '1.12.3'
- otp: '23.0'
elixir: '1.15.7'
- otp: '23.0'
elixir: '1.16'
- otp: '26'
elixir: '1.13.4'
- otp: '27.0-rc1'
elixir: '1.13.4'
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Get specific Erlang/OTP
uses: erlef/setup-beam@v1
@@ -137,6 +172,16 @@ jobs:
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
@@ -144,23 +189,21 @@ jobs:
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
- name: Remove Elixir Matchers
- name: Enable ModPresenceDemo and an Elixir dependency
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::"
sed -i "s|^modules:|modules:\n 'ModPresenceDemo': {}|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: Compile
run: |
./autogen.sh
./configure --with-rebar=mix \
./configure --with-rebar=./rebar3 \
--prefix=/tmp/ejabberd \
--enable-all \
--disable-elixir \
--disable-odbc
mix deps.get
make update
make
- run: make xref
@@ -185,17 +228,46 @@ jobs:
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
- name: Check rel
- name: Run install
run: |
make install
/tmp/ejabberd/sbin/ejabberdctl start \
&& /tmp/ejabberd/sbin/ejabberdctl started
/tmp/ejabberd/sbin/ejabberdctl register user3 localhost s0mePass
/tmp/ejabberd/sbin/ejabberdctl registered_users localhost >> registered.log
/tmp/ejabberd/sbin/ejabberdctl stop \
&& /tmp/ejabberd/sbin/ejabberdctl stopped
- name: View logs
if: always()
run: |
echo "===> Registered:"
cat registered.log
echo "===> Prod:"
cat _build/prod/rel/ejabberd/logs/*
echo "===> Dev:"
cat _build/dev/rel/ejabberd/logs/*
echo "===> Install:"
cat /tmp/ejabberd/var/log/ejabberd/*
- name: Check logs
if: always()
run: |
grep -q '^user1$' registered.log
grep -q '^user2$' registered.log
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
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
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
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
- name: View logs failures
if: failure()
@@ -204,3 +276,140 @@ jobs:
cat _build/prod/rel/ejabberd/logs/error.log
cat _build/dev/rel/ejabberd/logs/ejabberd.log
cat _build/dev/rel/ejabberd/logs/error.log
cat /tmp/ejabberd/var/log/ejabberd/ejabberd.log
cat /tmp/ejabberd/var/log/ejabberd/error.log
mix:
name: Mix
strategy:
fail-fast: false
matrix:
otp: ['23.0', '25', '26', '27.0-rc1']
elixir: ['1.13.4', '1.15.7', '1.16']
exclude:
- otp: '23.0'
elixir: '1.15.7'
- otp: '23.0'
elixir: '1.16'
- otp: '26'
elixir: '1.13.4'
- otp: '27.0-rc1'
elixir: '1.13.4'
runs-on: ubuntu-20.04
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
- 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: Enable ModPresenceDemo and an Elixir dependency
run: |
sed -i "s|^modules:|modules:\n 'ModPresenceDemo': {}|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: Compile
run: |
./autogen.sh
./configure --with-rebar=mix \
--prefix=/tmp/ejabberd \
--enable-all \
--disable-odbc
mix deps.get
make
- run: make xref
- run: make edoc
- name: Run rel
run: |
make rel
_build/prod/rel/ejabberd/bin/ejabberdctl start \
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
- name: Run dev
run: |
make dev
_build/dev/rel/ejabberd/bin/ejabberdctl start \
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
_build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
- name: Run install
run: |
make install
/tmp/ejabberd/sbin/ejabberdctl start \
&& /tmp/ejabberd/sbin/ejabberdctl started
/tmp/ejabberd/sbin/ejabberdctl register user3 localhost s0mePass
/tmp/ejabberd/sbin/ejabberdctl registered_users localhost >> registered.log
/tmp/ejabberd/sbin/ejabberdctl stop \
&& /tmp/ejabberd/sbin/ejabberdctl stopped
- name: View logs
if: always()
run: |
echo "===> Registered:"
cat registered.log
echo "===> Prod:"
cat _build/prod/rel/ejabberd/logs/*
echo "===> Dev:"
cat _build/dev/rel/ejabberd/logs/*
echo "===> Install:"
cat /tmp/ejabberd/var/log/ejabberd/*
- name: Check logs
if: always()
run: |
grep -q '^user1$' registered.log
grep -q '^user2$' registered.log
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
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
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
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
- name: View logs failures
if: failure()
run: |
cat _build/prod/rel/ejabberd/logs/ejabberd.log
cat _build/prod/rel/ejabberd/logs/error.log
cat _build/dev/rel/ejabberd/logs/ejabberd.log
cat _build/dev/rel/ejabberd/logs/error.log
cat /tmp/ejabberd/var/log/ejabberd/ejabberd.log
cat /tmp/ejabberd/var/log/ejabberd/error.log
+1
View File
@@ -5,6 +5,7 @@
\#*#
.#*
.edts
.tool-versions
*.dump
/Makefile
/doc
+295 -21
View File
@@ -1,4 +1,278 @@
# Version 23.01
## Version 24.02
Core:
- Added Matrix gateway in `mod_matrix_gw`
- Support SASL2 and Bind2
- Support tls-server-end-point channel binding and sasl2 codec
- 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
- mod_carboncopy: Teach how to interact with bind2 inline requests
Other:
- ejabberdctl: Fix startup problem when having set `EJABBERD_OPTS` and logger options
- ejabberdctl: Set EJABBERD_OPTS back to `""`, and use previous flags as example
- eldap: Change logic for `eldap tls_verify=soft` and `false`
- eldap: Don't set `fail_if_no_peer_cert` for eldap ssl client connections
- Ignore hints when checking for chat states
- mod_mam: Support XEP-0424 Message Retraction
- mod_mam: Fix XEP-0425: Message Moderation with SQL storage
- mod_ping: Support XEP-0198 pings when stream management is enabled
- mod_pubsub: Normalize pubsub `max_items` node options on read
- mod_pubsub: PEP nodetree: Fix reversed logic in node fixup function
- mod_pubsub: Only care about PEP bookmarks options when creating node from scratch
SQL:
- MySQL: Support `sha256_password` auth plugin
- ejabberd_sql_schema: Use the first unique index as a primary key
- Update SQL schema files for MAM's XEP-0424
- New option [`sql_flags`](https://docs.ejabberd.im/admin/configuration/toplevel/#sql-flags): right now only useful to enable `mysql_alternative_upsert`
Installers and Container:
- Container: Add ability to ignore failures in execution of `CTL_ON_*` commands
- Container: Update to Erlang/OTP 26.2, Elixir 1.16.1 and Alpine 3.19
- Container: Update this custom ejabberdctl to match the main one
- make-binaries: Bump OpenSSL 3.2.1, Erlang/OTP 26.2.2, Elixir 1.16.1
- make-binaries: Bump many dependency versions
Commands API:
- `print_sql_schema`: New command available in ejabberdctl command-line script
- ejabberdctl: Rework temporary node name generation
- ejabberdctl: Print argument description, examples and note in help
- 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: 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
- 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
- mod_http_api: When no specific API version is requested, use the latest
Compilation with Rebar3/Elixir/Mix:
- Fix compilation with Erlang/OTP 27: don't use the reserved word 'maybe'
- configure: Fix explanation of `--enable-group` option ([#4135](https://github.com/processone/ejabberd/issues/4135))
- Add observer and runtime_tools in releases when `--enable-tools`
- Update "make translations" to reduce build requirements
- Use Luerl 1.0 for Erlang 20, 1.1.1 for 21-26, and temporary fork for 27
- Makefile: Add `install-rel` and `uninstall-rel`
- Makefile: Rename `make rel` to `make prod`
- Makefile: Update `make edoc` to use ExDoc, requires mix
- Makefile: No need to use `escript` to run rebar|rebar3|mix
- configure: If `--with-rebar=rebar3` but rebar3 not system-installed, use local one
- configure: Use Mix or Rebar3 by default instead of Rebar2 to compile ejabberd
- ejabberdctl: Detect problem running iex or etop and show explanation
- Rebar3: Include Elixir files when making a release
- Rebar3: Workaround to fix protocol consolidation
- Rebar3: Add support to compile Elixir dependencies
- Rebar3: Compile explicitly our Elixir files when `--enable-elixir`
- Rebar3: Provide proper path to `iex`
- Rebar/Rebar3: Update binaries to work with Erlang/OTP 24-27
- Rebar/Rebar3: Remove Elixir as a rebar dependency
- Rebar3/Mix: If `dev` profile/environment, enable tools automatically
- Elixir: Fix compiling ejabberd as a dependency ([#4128](https://github.com/processone/ejabberd/issues/4128))
- Elixir: Fix ejabberdctl start/live when installed
- Elixir: Fix: `FORMATTER ERROR: bad return value` ([#4087](https://github.com/processone/ejabberd/issues/4087))
- Elixir: Fix: Couldn't find file `Elixir Hex API`
- Mix: Enable stun by default when `vars.config` not found
- Mix: New option `vars_config_path` to set path to `vars.config` ([#4128](https://github.com/processone/ejabberd/issues/4128))
- Mix: Fix ejabberdctl iexlive problem locating iex in an OTP release
## Version 23.10
Compilation:
- Erlang/OTP: Raise the requirement to Erlang/OTP 20.0 as a minimum
- CI: Update tests to Erlang/OTP 26 and recent Elixir
- Move Xref and Dialyzer options from workflows to `rebar.config`
- Add sections to `rebar.config` to organize its content
- Dialyzer dirty workarounds because `re:mp()` is not an exported type
- When installing module already configured, keep config as example
- Elixir 1.15 removed support for `--app`
- Elixir: Improve support to stop external modules written in Elixir
- Elixir: Update syntax of function calls as recommended by Elixir compiler
- Elixir: When building OTP release with mix, keep `ERLANG_NODE=ejabberd@localhost`
- `ejabberdctl`: Pass `ERLANG_OPTS` when calling `erl` to parse the `INET_DIST_INTERFACE` ([#4066](https://github.com/processone/ejabberd/issues/#4066)
Commands:
- `create_room_with_opts`: Fix typo and move examples to `args_example` ([#4080](https://github.com/processone/ejabberd/issues/#4080))
- `etop`: Let `ejabberdctl etop` work in a release (if `observer` application is available)
- `get_roster`: Command now returns groups in a list instead of newlines ([#4088](https://github.com/processone/ejabberd/issues/#4088))
- `halt`: New command to halt ejabberd abruptly with an error status code
- `ejabberdctl`: Fix calling ejabberdctl command with wrong number of arguments with Erlang 26
- `ejabberdctl`: Improve printing lists in results
- `ejabberdctl`: Support `policy=user` in the help and return proper arguments
- `ejabberdctl`: Document how to stop a debug shell: control+g
Container:
- Dockerfile: Add missing dependency for mssql databases
- Dockerfile: Reorder stages and steps for consistency
- Dockerfile: Use Alpine as base for `METHOD=package`
- Dockerfile: Rename packages to improve compatibility
- Dockerfile: Provide specific OTP and elixir vsn for direct compilation
- Halt ejabberd if a command in `CTL_ON_` fails during ejabberd startup
Core:
- `auth_external_user_exists_check`: New option ([#3377](https://github.com/processone/ejabberd/issues/#3377))
- `gen_mod`: Extend `gen_mod` API to simplify hooks and IQ handlers registration
- `gen_mod`: Add shorter forms for `gen_mod` hook/`iq_handler` API
- `gen_mod`: Update modules to the new `gen_mod` API
- `install_contrib_modules`: New option to define contrib modules to install automatically
- `unix_socket`: New listener option, useful when setting unix socket files ([#4059](https://github.com/processone/ejabberd/issues/#4059))
- `ejabberd_systemd`: Add a few debug messages
- `ejabberd_systemd`: Avoid using `gen_server` timeout ([#4054](https://github.com/processone/ejabberd/issues/#4054))([#4058](https://github.com/processone/ejabberd/issues/#4058))
- `ejabberd_listener`: Increase default listen queue backlog value to 128, which is the default value on both Linux and FreeBSD ([#4025](https://github.com/processone/ejabberd/issues/#4025))
- OAuth: Handle `badpass` error message
- When sending message on behalf of user, trigger `user_send_packet` ([#3990](https://github.com/processone/ejabberd/issues/#3990))
- Web Admin: In roster page move the `AddJID` textbox to top ([#4067](https://github.com/processone/ejabberd/issues/#4067))
- Web Admin: Show a warning when visiting webadmin with non-privileged account ([#4089](https://github.com/processone/ejabberd/issues/#4089))
Docs:
- Example configuration: clarify 5223 tls options; specify s2s shaper
- Make sure that `policy=user` commands have `host` instead of `server` arg in docs
- Improve syntax of many command descriptions for the Docs site
- Move example Perl extauth script from ejabberd git to Docs site
- Remove obsolete example files, and add link in Docs to the archived copies
Installers (`make-binaries`):
- Bump Erlang/OTP version to 26.1.1, and other dependencies
- Remove outdated workaround
- Don't build Linux-PAM examples
- Fix check for current Expat version
- Apply minor simplifications
- Don't duplicate config entries
- Don't hard-code musl version
- Omit unnecessary glibc setting
- Set kernel version for all builds
- Let curl fail on HTTP errors
Modules:
- `mod_muc_log`: Add trailing backslash to URLs shown in disco info
- `mod_muc_occupantid`: New module with support for XEP-0421 Occupant Id ([#3397](https://github.com/processone/ejabberd/issues/#3397))
- `mod_muc_rtbl`: Better error handling in ([#4050](https://github.com/processone/ejabberd/issues/#4050))
- `mod_private`: Add support for XEP-0402 PEP Native Bookmarks
- `mod_privilege`: Don't fail to edit roster ([#3942](https://github.com/processone/ejabberd/issues/#3942))
- `mod_pubsub`: Fix usage of `plugins` option, which produced `default_node_config` ignore ([#4070](https://github.com/processone/ejabberd/issues/#4070))
- `mod_pubsub`: Add `pubsub_delete_item` hook
- `mod_pubsub`: Report support of `config-node-max` in pep
- `mod_pubsub`: Relay pubsub iq queries to muc members without using bare jid ([#4093](https://github.com/processone/ejabberd/issues/#4093))
- `mod_pubsub`: Allow pubsub node owner to overwrite items published by other persons
- `mod_push_keepalive`: Delay `wake_on_start`
- `mod_push_keepalive`: Don't let hook crash
- `mod_push`: Add `notify_on` option
- `mod_push`: Set `last-message-sender` to bare JID
- `mod_register_web`: Make redirect to page that end with `/` ([#3177](https://github.com/processone/ejabberd/issues/#3177))
- `mod_shared_roster_ldap`: Don't crash in `get_member_jid` on empty output ([#3614](https://github.com/processone/ejabberd/issues/#3614))
MUC:
- Add support to register nick in a room ([#3455](https://github.com/processone/ejabberd/issues/#3455))
- Convert `allow_private_message` MUC room option to `allowpm` ([#3736](https://github.com/processone/ejabberd/issues/#3736))
- Update xmpp version to send `roomconfig_changesubject` in disco#info ([#4085](https://github.com/processone/ejabberd/issues/#4085))
- Fix crash when loading room from DB older than ffa07c6, 23.04
- Fix support to retract a MUC room message
- Don't always store messages passed through `muc_filter_message` ([#4083](https://github.com/processone/ejabberd/issues/#4083))
- Pass also MUC room retract messages over the `muc_filter_message` ([#3397](https://github.com/processone/ejabberd/issues/#3397))
- Pass MUC room private messages over the `muc_filter_message` too ([#3397](https://github.com/processone/ejabberd/issues/#3397))
- Store the subject author JID, and run `muc_filter_message` when sending subject ([#3397](https://github.com/processone/ejabberd/issues/#3397))
- Remove existing role information for users that are kicked from room ([#4035](https://github.com/processone/ejabberd/issues/#4035))
- Expand rule "mucsub subscribers are members in members only rooms" to more places
SQL:
- Add ability to force alternative upsert implementation in mysql
- Properly parse mysql version even if it doesn't have type tag
- Use prepared statement with mysql
- Add alternate version of mysql upsert
- `ejabberd_auth_sql`: Reset scram fields when setting plain password
- `mod_privacy_sql`: Fix return values from `calculate_diff`
- `mod_privacy_sql`: Optimize `set_list`
- `mod_privacy_sql`: Use more efficient way to calculate changes in `set_privacy_list`
## Version 23.04
General:
- New `s2s_out_bounce_packet` hook
- Re-allow anonymous connection for connection without client certificates ([#3985](https://github.com/processone/ejabberd/issues/3985))
- Stop `ejabberd_system_monitor` before stopping node
- `captcha_url` option now accepts `auto` value, and it's the default
- `mod_mam`: Add support for XEP-0425: Message Moderation
- `mod_mam_sql`: Fix problem with results of mam queries using rsm with max and before
- `mod_muc_rtbl`: New module for Real-Time Block List for MUC rooms ([#4017](https://github.com/processone/ejabberd/issues/4017))
- `mod_roster`: Set roster name from XEP-0172, or the stored one ([#1611](https://github.com/processone/ejabberd/issues/1611))
- `mod_roster`: Preliminary support to store extra elements in subscription request ([#840](https://github.com/processone/ejabberd/issues/840))
- `mod_pubsub`: Pubsub xdata fields `max_item/item_expira/children_max` use `max` not `infinity`
- `mod_vcard_xupdate`: Invalidate `vcard_xupdate` cache on all nodes when vcard is updated
Admin:
- `ext_mod`: Improve support for loading `*.so` files from `ext_mod` dependencies
- Improve output in `gen_html_doc_for_commands` command
- Fix ejabberdctl output formatting ([#3979](https://github.com/processone/ejabberd/issues/3979))
- Log HTTP handler exceptions
MUC:
- New command `get_room_history`
- Persist `none` role for outcasts
- Try to populate room history from mam when unhibernating
- Make `mod_muc_room:set_opts` process persistent flag first
- Allow passing affiliations and subscribers to `create_room_with_opts` command
- Store state in db in `mod_muc:create_room()`
- Make subscribers members by default
SQL schemas:
- Fix a long standing bug in new schema migration
- `update_sql` command: Many improvements in new schema migration
- `update_sql` command: Add support to migrate MySQL too
- Change PostgreSQL SERIAL to BIGSERIAL columns
- Fix minor SQL schema inconsistencies
- Remove unnecessary indexes
- New SQL schema migrate fix
MS SQL:
- MS SQL schema fixes
- Add `new` schema for MS SQL
- Add MS SQL support for new schema migration
- Minor MS SQL improvements
- Fix MS SQL error caused by `ORDER BY` in subquery
SQL Tests:
- Add support for running tests on MS SQL
- Add ability to run tests on upgraded DB
- Un-deprecate `ejabberd_config:set_option/2`
- Use python3 to run `extauth.py` for tests
- Correct README for creating test docker MS SQL DB
- Fix TSQLlint warnings in MSSQL test script
Testing:
- Fix Shellcheck warnings in shell scripts
- Fix Remark-lint warnings
- Fix Prospector and Pylint warnings in test `extauth.py`
- Stop testing ejabberd with Erlang/OTP 19.3, as Github Actions no longer supports ubuntu-18.04
- Test only with oldest OTP supported (20.0), newest stable (25.3) and bleeding edge (26.0-rc2)
- Upload Common Test logs as artifact in case of failure
`ecs` container image:
- Update Alpine to 3.17 to get Erlang/OTP 25 and Elixir 1.14
- Add `tini` as runtime init
- Set `ERLANG_NODE` fixed to `ejabberd@localhost`
- Upload images as artifacts to Github Actions
- Publish tag images automatically to ghcr.io
`ejabberd` container image:
- Update Alpine to 3.17 to get Erlang/OTP 25 and Elixir 1.14
- Add `METHOD` to build container using packages ([#3983](https://github.com/processone/ejabberd/issues/3983))
- Add `tini` as runtime init
- Detect runtime dependencies automatically
- Remove unused Mix stuff: ejabberd script and static COOKIE
- Copy captcha scripts to `/opt/ejabberd-*/lib` like the installers
- Expose only `HOME` volume, it contains all the required subdirs
- ejabberdctl: Don't use `.../releases/COOKIE`, it's no longer included
Installers:
- make-binaries: Bump versions, e.g. erlang/otp to 25.3
- make-binaries: Fix building with erlang/otp v25.x
- make-packages: Fix for installers workflow, which didn't find lynx
## Version 23.01
General:
- Add `misc:uri_parse/2` to allow declaring default ports for protocols
@@ -52,7 +326,7 @@ VSCode:
- Add Erlang LS default configuration
- Add Elvis default configuration
# Version 22.10
## Version 22.10
Core:
- Add `log_burst_limit_*` options ([#3865](https://github.com/processone/ejabberd/issues/3865))
@@ -92,7 +366,7 @@ MUC:
- Don't persist `none` role ([#3330](https://github.com/processone/ejabberd/issues/3330))
- Allow MUC service admins to bypass max_user_conferences limitation
- Show allow_query_users room option in disco info ([#3830](https://github.com/processone/ejabberd/issues/3830))
- Don't set affiliation to `none` if it's already `none` in `mod_muc_room:process_item_change/3`
- mod_muc_room: Don't set affiliation to `none` if it's already `none` in `process_item_change/3`
- Fix mucsub unsubscribe notification payload to have muc_unsubcribe in it
- Allow muc_{un}subscribe hooks to modify sent packets
- Pass room state to muc_{un}subscribed hook
@@ -162,7 +436,7 @@ Workflows Actions:
- CI: Remove syntax_tools from applications, as fast_xml fails Dialyzer
- Runtime: Add Xref options to be as strict as CI
# Version 22.05
## Version 22.05
Core
- C2S: Don't expect that socket will be available in `c2s_terminated` hook
@@ -267,7 +541,7 @@ Workflows
- Installers: New workflow to build binary packages
- Runtime: New workflow to test compilation, rel, starting and ejabberdctl
# Version 21.12
## Version 21.12
Commands
- `create_room_with_opts`: Fixed when using SQL storage
@@ -314,7 +588,7 @@ Other
- Update export/import of scram password to XEP-0227 1.1
- Update Jose to 1.11.1 (the last in hex.pm correctly versioned)
# Version 21.07
## Version 21.07
Compilation
- Add rebar3 3.15.2 binary
@@ -360,7 +634,7 @@ SQL:
- mod_mqtt: Add mqtt_pub table definition for MSSQL
- mod_shared_roster: Add missing indexes to `sr_group` tables in all SQL databases
# Version 21.04
## Version 21.04
API Commands:
- `add_rosteritem/...`: Add argument guards to roster commands
@@ -398,7 +672,7 @@ Modules:
- `mod_pubsub`: Fix `gen_pubsub_node:get_state` return value
- `mod_vcard`: Obtain and provide photo type in vCard LDAP
# Version 21.01
## Version 21.01
Miscellaneous changes:
- `log_rotate_size` option: Fix handling of infinity value
@@ -433,7 +707,7 @@ Translations:
- Moved gettext PO files to a new `ejabberd-po` repository
- Improved several translations: Catalan, Chinese, German, Greek, Indonesian, Norwegian, Portuguese (Brazil), Spanish.
# Version 20.12
## Version 20.12
- Add support for `SCRAM-SHA-{256,512}-{PLUS}` authentication
- Don't use same value in cache for user don't exist and wrong password
@@ -468,7 +742,7 @@ Translations:
- WebAdmin: Mark dangerous buttons with CSS
- WebSocket: Make websocket send put back pressure on c2s process
# Version 20.07
## Version 20.07
* Changes in this version
- Add support for using unix sockets in listeners.
@@ -486,7 +760,7 @@ Translations:
changed to logging disabled
- Increase default shaper limits (this should help with delays for
clients that are using jingle)
- Fix couple compatibility problems which prevented working on
- Fix couple compatibility problems which prevented working on
erlang R19
- Fix sending presence unavailable when session terminates for
clients that only send directed presences (helps with sometimes
@@ -495,13 +769,13 @@ Translations:
they were passed to handler modules
- Make stun module work better with ipv6 addresses
# Version 20.03
## Version 20.03
* Changes in this version
- Add support of ssl connection when connection to mysql
database (configured with `sql_ssl: true` option)
- Experimental support for cockroachdb when configured
with postgres connector
with postgres connector
- Add cache and optimize queries issued by `mod_shared_roster`,
this should greatly improve performance of this module when
used with `sql` backend
@@ -515,7 +789,7 @@ Translations:
- Fix reporting errors in `send_stanza` command when xml
passed to it couldn't be passed correctly
# Version 20.02
## Version 20.02
* Changes in this version
- Fix problems when trying to use string format with unicode
@@ -533,7 +807,7 @@ Translations:
override built-in values
- Fix return value of reload_config and dump_config commands
# Version 20.01
## Version 20.01
* New features
- Implement OAUTH authentication in mqtt
@@ -566,7 +840,7 @@ Translations:
failed
- Fix crash in stream management when timeout was not set
# Version 19.09
## Version 19.09
* Admin
- The minimum required Erlang/OTP version is now 19.3
@@ -619,7 +893,7 @@ Translations:
- Correctly handle unicode in log messages
- Fix unicode processing in ejabberd.yml
# Version 19.08
## Version 19.08
* Administration
- Improve ejabberd halting procedure
@@ -664,7 +938,7 @@ Translations:
- Remove deprecated pubsub plugins
- Expose access_model and publish_model in pubsub#metadata
# Version 19.05
## Version 19.05
* Admin
- The minimum required Erlang/OTP version is now 19.1
@@ -741,7 +1015,7 @@ Translations:
- mod_mqtt: Support other socket modules
- mod_push: Check for payload in encrypted messages
# Version 19.02
## Version 19.02
* Admin
- Fix in configure.ac the Erlang/OTP version: from 17.5 to 19.0
@@ -795,9 +1069,9 @@ Translations:
- Translations: fixed "make translations"
- WebAdmin: Fix support to restart module with new options
# Version 18.12
## Version 18.12
* MAM data store compression
* Proxy protocol support (http://www.haproxy.org/download/1.8/doc/proxy-protocol.txt)
* Proxy protocol support
* MUC Self-Ping optimization (XEP-0410)
* Bookmarks conversion (XEP-0411)
+1 -1
View File
@@ -34,7 +34,7 @@ This Code of Conduct applies both within project spaces and in public spaces whe
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at conduct@process-one.net. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at the email address: conduct AT process-one.net. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+14 -18
View File
@@ -15,20 +15,21 @@ Requirements
To compile ejabberd you need:
- GNU Make
- GCC
- Libexpat ≥ 1.95
- Libyaml ≥ 0.1.4
- Erlang/OTP ≥ 19.3
- OpenSSL ≥ 1.0.0
- GNU Make
- GCC
- Libexpat ≥ 1.95
- Libyaml ≥ 0.1.4
- Erlang/OTP ≥ 20.0
- OpenSSL ≥ 1.0.0
Other optional libraries are:
- Zlib ≥ 1.2.3, for Stream Compression support (XEP-0138)
- PAM library, for Pluggable Authentication Modules (PAM)
- ImageMagick's Convert program and Ghostscript fonts, for CAPTCHA
challenges
- Elixir ≥ 1.10.3, to support Elixir, and alternative to rebar/rebar3
- Zlib ≥ 1.2.3, for Stream Compression support (XEP-0138)
- PAM library, for Pluggable Authentication Modules (PAM)
- ImageMagick's Convert program and Ghostscript fonts, for CAPTCHA
challenges
- Elixir ≥ 1.10.3, for Elixir support. It is recommended Elixir 1.13.4 or higher
and Erlang/OTP 23.0 or higher.
If your system splits packages in libraries and development headers,
install the development packages too.
@@ -89,13 +90,8 @@ Build an OTP Release
Instead of installing ejabberd in the system, you can build an OTP release
that includes all necessary to run ejabberd in a subdirectory:
./configure --with-rebar=rebar3
make rel
Or, if you have Elixir available and plan to develop Elixir code:
./configure --with-rebar=mix
make dev
./configure
make prod
Check the full list of targets:
+83 -54
View File
@@ -1,11 +1,10 @@
[![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=container&sort=semver)](https://github.com/processone/ejabberd/pkgs/container/ejabberd)
[![Docker Image Version (latest semver)](https://img.shields.io/docker/v/ejabberd/ecs?label=docker)](https://hub.docker.com/r/ejabberd/ecs/)
[![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
==================
`ejabberd` Container Image
==========================
[ejabberd][home] is an open-source,
robust, scalable and extensible realtime platform built using [Erlang/OTP][erlang],
@@ -17,26 +16,26 @@ that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service.
[mqtt]: https://mqtt.org/
[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol
This document explains how to use the
[ejabberd container images](https://github.com/processone/ejabberd/pkgs/container/ejabberd)
available in the GitHub Container Registry,
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.
Alternatively, there are also
[ejabberd-ecs Docker images](https://hub.docker.com/r/ejabberd/ecs/)
available in Docker Hub,
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).
If you are using a Windows operating system, check the tutorials mentioned in
[ejabberd Docs > Docker Image](https://docs.ejabberd.im/admin/installation/#docker-image).
Start ejabberd
==============
--------------
## With default configuration
### With default configuration
Start ejabberd in a new container:
@@ -60,7 +59,7 @@ docker restart ejabberd
```
## Start with Erlang console attached
### Start with Erlang console attached
Start ejabberd with an Erlang console attached using the `live` command:
@@ -71,7 +70,7 @@ docker run --name ejabberd -it -p 5222:5222 ghcr.io/processone/ejabberd live
That uses the default configuration file and XMPP domain "localhost".
## Start with your configuration and database
### Start with your configuration and database
Pass a configuration file as a volume
and share the local directory to store database:
@@ -93,9 +92,9 @@ and the volumes you mount must grant proper rights to that account.
Next steps
==========
----------
## Register the administrator account
### Register the administrator account
The default ejabberd configuration does not grant admin privileges
to any account,
@@ -112,7 +111,7 @@ Then edit conf/ejabberd.yml and add the ACL as explained in
[ejabberd Docs: Administration Account](https://docs.ejabberd.im/admin/installation/#administration-account)
## Check ejabberd log files
### Check ejabberd log files
Check the content of the log files inside the container,
even if you do not put it on a shared persistent drive:
@@ -122,7 +121,7 @@ docker exec -it ejabberd tail -f logs/ejabberd.log
```
## Inspect the container files
### Inspect the container files
The container uses Alpine Linux. Start a shell inside the container:
@@ -131,7 +130,7 @@ docker exec -it ejabberd sh
```
## Open ejabberd debug console
### Open ejabberd debug console
Open an interactive debug Erlang console attached to a running ejabberd in a running container:
@@ -140,7 +139,7 @@ docker exec -it ejabberd ejabberdctl debug
```
## CAPTCHA
### CAPTCHA
ejabberd includes two example CAPTCHA scripts.
If you want to use any of them, first install some additional required libraries:
@@ -154,10 +153,9 @@ Now update your ejabberd configuration file, for example:
docker exec -it ejabberd vi conf/ejabberd.yml
```
and add the required options:
```
captcha_cmd: /opt/ejabberd-22.04/lib/ejabberd-22.04/priv/bin/captcha.sh
captcha_url: https://localhost:5443/captcha
and add this option:
```yaml
captcha_cmd: /opt/ejabberd-22.04/lib/captcha.sh
```
Finally, reload the configuration file or restart the container:
@@ -165,11 +163,23 @@ Finally, reload the configuration file or restart the container:
docker exec ejabberd ejabberdctl reload_config
```
If the CAPTCHA image is not visible, there may be a problem generating it
(the ejabberd log file may show some error message);
or the image URL may not be correctly detected by ejabberd,
in that case you can set the correct URL manually, for example:
```yaml
captcha_url: https://localhost:5443/captcha
```
For more details about CAPTCHA options, please check the
[CAPTCHA](https://docs.ejabberd.im/admin/configuration/basic/#captcha)
documentation section.
Advanced Container Configuration
================================
--------------------------------
## Ports
### Ports
This container image exposes the ports:
@@ -182,7 +192,7 @@ This container image exposes the ports:
- `5210`: Erlang connectivity when `ERL_DIST_PORT` is set, alternative to EPMD
## Volumes
### Volumes
ejabberd produces two types of data: log files and database spool files (Mnesia).
This is the kind of data you probably want to store on a persistent or local drive (at least the database).
@@ -203,25 +213,28 @@ It's possible to install additional ejabberd modules using volumes,
explains how to install an additional module using docker-compose.
## Commands on start
### Commands on start
The ejabberdctl script reads the `CTL_ON_CREATE` environment variable
the first time the docker container is started,
the first time the container is started,
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 `!`
Example usage (or check 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 ;
status
```
## Clustering
### Clustering
When setting several containers to form a
[cluster of ejabberd nodes](https://docs.ejabberd.im/admin/guide/clustering/),
@@ -259,11 +272,10 @@ Example using environment variables (see full example [docker-compose.yml](https
```
Generating a Container Image
============================
Build a Container Image
-----------------------
This container image includes ejabberd as a standalone OTP release built using Elixir.
That OTP release is configured with:
- `mix.exs`: Customize ejabberd release
@@ -271,27 +283,18 @@ That OTP release is configured with:
- `config/runtime.exs`: Customize ejabberd paths
- `ejabberd.yml.template`: ejabberd default config file
Build ejabberd Community Server base image from ejabberd master on GitHub:
### Direct build
Build ejabberd Community Server container image from ejabberd master git repository:
```bash
docker build \
docker buildx build \
-t personal/ejabberd \
-f .github/container/Dockerfile \
.
```
Build ejabberd Community Server base image for a given ejabberd version,
both for amd64 and arm64 architectures:
```bash
VERSION=22.05
git checkout $VERSION
docker buildx build \
--platform=linux/amd64,linux/arm64
-t personal/ejabberd:$VERSION \
-f .github/container/Dockerfile \
.
```
### Podman build
It's also possible to use podman instead of docker, just notice:
- `EXPOSE 4369-4399` port range is not supported, remove that in Dockerfile
@@ -312,11 +315,35 @@ podman exec -it eja1 sh
podman stop eja1
```
### Package build for `arm64`
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.
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.
In this case, to build the ejabberd container image for arm64 architecture:
```bash
docker buildx build \
--build-arg METHOD=package \
--platform linux/arm64 \
-t personal/ejabberd:$VERSION \
-f .github/container/Dockerfile \
.
```
Composer Examples
=================
-----------------
## Minimal Example
### Minimal Example
This is the barely minimal file to get a usable ejabberd.
Store it as `docker-compose.yml`:
@@ -338,7 +365,7 @@ Create and start the container with the command:
docker-compose up
```
## Customized Example
### Customized Example
This example shows the usage of several customizations:
it uses a local configuration file,
@@ -381,13 +408,15 @@ services:
- ./database:/opt/ejabberd/database
```
## Clustering Example
### Clustering Example
In this example, the main container is created first.
Once it is fully started and healthy, a second container is created,
and once ejabberd is started in it, it joins the first one.
An account is registered in the first node when created,
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),
and it should exist in the second node after join.
Notice that in this example the main container does not have access
@@ -404,7 +433,7 @@ services:
environment:
- ERLANG_NODE_ARG=ejabberd@main
- ERLANG_COOKIE=dummycookie123
- CTL_ON_CREATE=register admin localhost asd
- CTL_ON_CREATE=\! register admin localhost asd
replica:
image: ghcr.io/processone/ejabberd
+17 -18
View File
@@ -3,21 +3,21 @@
We'd love for you to contribute to our source code and to make ejabberd even better than it is
today! Here are the guidelines we'd like you to follow:
* [Code of Conduct](#coc)
* [Questions and Problems](#question)
* [Issues and Bugs](#issue)
* [Feature Requests](#feature)
* [Issue Submission Guidelines](#submit)
* [Pull Request Submission Guidelines](#submit-pr)
* [Signing the CLA](#cla)
* [Code of Conduct](#code-of-conduct)
* [Questions and Problems](#questions-bugs-features)
* [Issues and Bugs](#found-an-issue-or-bug)
* [Feature Requests](#missing-a-feature)
* [Issue Submission Guidelines](#issue-submission-guidelines)
* [Pull Request Submission Guidelines](#pull-request-submission-guidelines)
* [Signing the CLA](#signing-the-contributor-license-agreement-cla)
## <a name="coc"></a> Code of Conduct
## Code of Conduct
Help us keep ejabberd community open-minded and inclusive. Please read and follow our [Code of Conduct][coc].
## <a name="requests"></a> Questions, Bugs, Features
## Questions, Bugs, Features
### <a name="question"></a> Got a Question or Problem?
### Got a Question or Problem?
Do not open issues for general support questions as we want to keep GitHub issues for bug reports
and feature requests. You've got much better chances of getting your question answered on dedicated
@@ -34,16 +34,16 @@ To save your and our time, we will systematically close all issues that are requ
support and redirect people to the section you are reading right now.
Other channels for support are:
- [ejabberd Mailing List][list]
- [ejabberd XMPP room][muc]: ejabberd@conference.process-one.net
- ejabberd XMPP room: [ejabberd@conference.process-one.net][muc]
- [ejabberd XMPP room logs][logs]
- [ejabberd Mailing List][list]
### <a name="issue"></a> Found an Issue or Bug?
### Found an Issue or Bug?
If you find a bug in the source code, you can help us by submitting an issue to our
[GitHub Repository][github]. Even better, you can submit a Pull Request with a fix.
### <a name="feature"></a> Missing a Feature?
### Missing a Feature?
You can request a new feature by submitting an issue to our [GitHub Repository][github-issues].
@@ -54,7 +54,7 @@ If you would like to implement a new feature then consider what kind of change i
* **Small Changes** can directly be crafted and submitted to the [GitHub Repository][github]
as a Pull Request. See the section about [Pull Request Submission Guidelines](#submit-pr).
## <a name="submit"></a> Issue Submission Guidelines
## Issue Submission Guidelines
Before you submit your issue search the archive, maybe your question was already answered.
@@ -64,7 +64,7 @@ the effort we can spend fixing issues and adding new features, by not reporting
The "[new issue][github-new-issue]" form contains a number of prompts that you should fill out to
make it easier to understand and categorize the issue.
## <a name="submit-pr"></a> Pull Request Submission Guidelines
## Pull Request Submission Guidelines
By submitting a pull request for a code or doc contribution, you need to have the right
to grant your contribution's copyright license to ProcessOne. Please check [ProcessOne CLA][cla]
@@ -123,7 +123,7 @@ restarted.
That's it! Thank you for your contribution!
## <a name="cla"></a> Signing the Contributor License Agreement (CLA)
## Signing the Contributor License Agreement (CLA)
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
@@ -147,4 +147,3 @@ gives us the option to relicense the code with a more permissive license in the
[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
[license]: https://github.com/processone/ejabberd/blob/master/COPYING
+202 -44
View File
@@ -1,8 +1,22 @@
REBAR = @ESCRIPT@ @rebar@
#.
#' definitions
#
ESCRIPT = @ESCRIPT@
REBAR = @rebar@
MIX = @rebar@
AWK = @AWK@
INSTALL = @INSTALL@
MKDIR_P = @MKDIR_P@
SED = @SED@
ERL = @ERL@
EPMD = @EPMD@
IEX = @IEX@
INSTALLUSER=@INSTALLUSER@
INSTALLGROUP=@INSTALLGROUP@
REBAR_ENABLE_ELIXIR = @elixir@
prefix = @prefix@
exec_prefix = @exec_prefix@
@@ -71,7 +85,10 @@ SPOOLDIR = @localstatedir@/lib/ejabberd
# /var/log/ejabberd/
LOGDIR = @localstatedir@/log/ejabberd
INSTALLUSER=@INSTALLUSER@
#.
#' install user
#
# if no user was enabled, don't set privileges or ownership
ifeq ($(INSTALLUSER),)
O_USER=
@@ -86,18 +103,22 @@ else
CHOWN_OUTPUT=&1
INIT_USER=$(INSTALLUSER)
endif
# if no group was enabled, don't set privileges or ownership
INSTALLGROUP=@INSTALLGROUP@
ifneq ($(INSTALLGROUP),)
G_USER=-g $(INSTALLGROUP)
endif
ifeq "$(MIX)" "mix"
#.
#' rebar / rebar3 / mix
#
ifeq "$(notdir $(MIX))" "mix"
REBAR_VER:=6
REBAR_VER_318:=0
else
REBAR_VER:=$(shell $(REBAR) --version | awk -F '[ .]' '/rebar / {print $$2}')
REBAR_VER_318:=$(shell $(REBAR) --version | awk -F '[ .]' '/rebar / {print ($$2 == 3 && $$3 >= 18 ? 1 : 0)}')
REBAR_VER:=$(shell $(REBAR) --version | $(AWK) -F '[ .]' '/rebar / {print $$2}')
REBAR_VER_318:=$(shell $(REBAR) --version | $(AWK) -F '[ .]' '/rebar / {print ($$2 == 3 && $$3 >= 18 ? 1 : 0)}')
endif
ifeq "$(REBAR_VER)" "6"
@@ -112,11 +133,25 @@ ifeq "$(REBAR_VER)" "6"
CONFIGURE_DEPS=(cd deps/eimp; ./configure)
EBINDIR=$(DEPSDIR)/ejabberd/ebin
XREFOPTIONS=graph
EDOCPRE=MIX_ENV=edoc
EDOCTASK=docs --proglang erlang
CLEANARG=--deps
ELIXIR_LIBDIR_RAW=$(shell elixir -e "IO.puts(:filename.dirname(:code.lib_dir(:elixir)))" -e ":erlang.halt")
ELIXIR_LIBDIR=":$(ELIXIR_LIBDIR_RAW)"
REBARREL=MIX_ENV=prod $(REBAR) release --overwrite
REBARDEV=MIX_ENV=dev $(REBAR) release --overwrite
RELIVECMD=escript rel/relive.escript && MIX_ENV=dev RELIVE=true iex --name ejabberd@localhost -S mix run
RELIVECMD=$(ESCRIPT) rel/relive.escript && MIX_ENV=dev RELIVE=true $(IEX) --name ejabberd@localhost -S mix run
REL_LIB_DIR = _build/dev/rel/ejabberd/lib
COPY_REL_TARGET = dev
GET_DEPS_TRANSLATIONS=MIX_ENV=translations $(REBAR) $(GET_DEPS)
DEPSDIR_TRANSLATIONS=deps
else
ifeq ($(REBAR_ENABLE_ELIXIR),true)
ELIXIR_LIBDIR_RAW=$(shell elixir -e "IO.puts(:filename.dirname(:code.lib_dir(:elixir)))" -e ":erlang.halt")
ELIXIR_LIBDIR=":$(ELIXIR_LIBDIR_RAW)"
EXPLICIT_ELIXIR_COMPILE=MIX_ENV=default mix compile.elixir
PREPARE_ELIXIR_SCRIPTS=$(MKDIR_P) rel/overlays; cp $(ELIXIR_LIBDIR_RAW)/../bin/iex rel/overlays/; cp $(ELIXIR_LIBDIR_RAW)/../bin/elixir rel/overlays/; sed -i 's|ERTS_BIN=$$|ERTS_BIN=$$SCRIPT_PATH/../../erts-{{erts_vsn}}/bin/|' rel/overlays/elixir
endif
ifeq "$(REBAR_VER)" "3"
SKIPDEPS=
LISTDEPS=tree
@@ -134,8 +169,12 @@ endif
XREFOPTIONS=
CLEANARG=--all
REBARREL=$(REBAR) as prod tar
REBARDEV=REBAR_PROFILE=dev $(REBAR) release
REBARDEV=$(REBAR) as dev release
RELIVECMD=$(REBAR) relive
REL_LIB_DIR = _build/dev/rel/ejabberd/lib
COPY_REL_TARGET = dev
GET_DEPS_TRANSLATIONS=$(REBAR) as translations $(GET_DEPS)
DEPSDIR_TRANSLATIONS=_build/translations/lib
else
SKIPDEPS=skip_deps=true
LISTDEPS=-q list-deps
@@ -151,10 +190,16 @@ else
REBARREL=$(REBAR) generate
REBARDEV=
RELIVECMD=@echo "Rebar2 detected... relive not supported.\
\nTry: ./configure --with-rebar=./rebar3 ; make relive"
\nTry: ./configure --with-rebar=rebar3 ; make relive"
REL_LIB_DIR = rel/ejabberd/lib
COPY_REL_TARGET = rel
endif
endif
#.
#' main targets
#
all: scripts deps src
deps: $(DEPSDIR)/.got
@@ -162,7 +207,7 @@ deps: $(DEPSDIR)/.got
$(DEPSDIR)/.got:
rm -rf $(DEPSDIR)/.got
rm -rf $(DEPSDIR)/.built
mkdir -p $(DEPSDIR)
$(MKDIR_P) $(DEPSDIR)
$(REBAR) $(GET_DEPS) && :> $(DEPSDIR)/.got
$(CONFIGURE_DEPS)
@@ -171,6 +216,7 @@ $(DEPSDIR)/.built: $(DEPSDIR)/.got
src: $(DEPSDIR)/.built
$(REBAR) $(SKIPDEPS) compile
$(EXPLICIT_ELIXIR_COMPILE)
update:
rm -rf $(DEPSDIR)/.got
@@ -188,14 +234,35 @@ options: all
tools/opt_types.sh ejabberd_option $(EBINDIR)
translations:
tools/prepare-tr.sh $(DEPSDIR)
$(GET_DEPS_TRANSLATIONS)
tools/prepare-tr.sh $(DEPSDIR_TRANSLATIONS)
doap:
tools/generate-doap.sh
edoc:
$(ERL) -noinput +B -eval \
'case edoc:application(ejabberd, ".", []) of ok -> halt(0); error -> halt(1) end.'
#.
#' edoc
#
edoc: edoc_files edoc_compile
$(EDOCPRE) $(REBAR) $(EDOCTASK)
edoc_compile: deps
$(EDOCPRE) $(REBAR) compile
edoc_files: _build/edoc/docs.md _build/edoc/logo.png
_build/edoc/docs.md: edoc_compile
echo "For much more detailed and complete ejabberd documentation, " \
"go to the [ejabberd Docs](https://docs.ejabberd.im/) site." \
> _build/edoc/docs.md
_build/edoc/logo.png: edoc_compile
wget https://docs.ejabberd.im/static/shared/images/footer_logo_e.png -O _build/edoc/logo.png
#.
#' copy-files
#
JOIN_PATHS=$(if $(wordlist 2,1000,$(1)),$(firstword $(1))/$(call JOIN_PATHS,$(wordlist 2,1000,$(1))),$(1))
@@ -282,26 +349,56 @@ copy-files:
copy-files-sub: copy-files-sub2
#.
#' copy-files-rel
#
copy-files-rel: $(COPY_REL_TARGET)
#
# Libraries
(cd $(REL_LIB_DIR) && find . -follow -type f ! -executable -exec $(INSTALL) -vDm 640 $(G_USER) {} $(DESTDIR)$(LIBDIR)/{} \;)
#
# *.so:
(cd $(REL_LIB_DIR) && find . -follow -type f -executable -name *.so -exec $(INSTALL) -vDm 640 $(G_USER) {} $(DESTDIR)$(LIBDIR)/{} \;)
#
# Executable files
(cd $(REL_LIB_DIR) && find . -follow -type f -executable ! -name *.so -exec $(INSTALL) -vDm 550 $(G_USER) {} $(DESTDIR)$(LIBDIR)/{} \;)
#.
#' uninstall-librel
#
uninstall-librel:
(cd $(REL_LIB_DIR) && find . -follow -type f -exec rm -fv -v $(DESTDIR)$(LIBDIR)/{} \;)
(cd $(REL_LIB_DIR) && find . -follow -depth -type d -exec rm -dv -v $(DESTDIR)$(LIBDIR)/{} \;)
#.
#' relive
#
relive:
$(RELIVECMD)
relivelibdir=$(shell pwd)/$(DEPSDIR)
relivedir=$(shell pwd)/_build/relive
iexpath=$(shell which iex)
CONFIG_DIR = ${relivedir}/conf
SPOOL_DIR = ${relivedir}/database
LOGS_DIR = ${relivedir}/logs
#.
#' scripts
#
ejabberdctl.relive:
$(SED) -e "s*{{installuser}}*@INSTALLUSER@*g" \
$(SED) -e "s*{{installuser}}*${INSTALLUSER}*g" \
-e "s*{{config_dir}}*${CONFIG_DIR}*g" \
-e "s*{{logs_dir}}*${LOGS_DIR}*g" \
-e "s*{{spool_dir}}*${SPOOL_DIR}*g" \
-e "s*{{bindir}}/iex*$(iexpath)*g" \
-e "s*{{bindir}}*@bindir@*g" \
-e "s*{{libdir}}*${relivelibdir}*g" \
-e "s*{{erl}}*@ERL@*g" \
-e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
-e "s*{{bindir}}*${BINDIR}*g" \
-e "s*{{libdir}}*${relivelibdir}${ELIXIR_LIBDIR}*g" \
-e "s*{{iexpath}}*${IEX}*g" \
-e "s*{{erl}}*${ERL}*g" \
-e "s*{{epmd}}*${EPMD}*g" ejabberdctl.template \
> ejabberdctl.relive
ejabberd.init:
@@ -317,19 +414,28 @@ ejabberd.service:
chmod 644 ejabberd.service
ejabberdctl.example: vars.config
$(SED) -e "s*{{installuser}}*@INSTALLUSER@*g" \
$(SED) -e "s*{{installuser}}*${INSTALLUSER}*g" \
-e "s*{{config_dir}}*${ETCDIR}*g" \
-e "s*{{logs_dir}}*${LOGDIR}*g" \
-e "s*{{spool_dir}}*${SPOOLDIR}*g" \
-e "s*{{bindir}}*@bindir@*g" \
-e "s*{{libdir}}*@libdir@*g" \
-e "s*{{erl}}*@ERL@*g" \
-e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
-e "s*{{bindir}}*${BINDIR}*g" \
-e "s*{{libdir}}*${LIBDIR}${ELIXIR_LIBDIR}*g" \
-e "s*{{iexpath}}*${IEX}*g" \
-e "s*{{erl}}*${ERL}*g" \
-e "s*{{epmd}}*${EPMD}*g" ejabberdctl.template \
> ejabberdctl.example
scripts: ejabberd.init ejabberd.service ejabberdctl.example
install: copy-files
#.
#' install
#
install: copy-files install-main
install-rel: copy-files-rel install-main
install-main:
#
# Configuration files
$(INSTALL) -d -m 750 $(G_USER) $(DESTDIR)$(ETCDIR)
@@ -352,12 +458,12 @@ install: copy-files
#
# Spool directory
$(INSTALL) -d -m 750 $(O_USER) $(DESTDIR)$(SPOOLDIR)
$(CHOWN_COMMAND) -R @INSTALLUSER@ $(DESTDIR)$(SPOOLDIR) >$(CHOWN_OUTPUT)
$(CHOWN_COMMAND) -R $(INSTALLUSER) $(DESTDIR)$(SPOOLDIR) >$(CHOWN_OUTPUT)
chmod -R 750 $(DESTDIR)$(SPOOLDIR)
#
# Log directory
$(INSTALL) -d -m 750 $(O_USER) $(DESTDIR)$(LOGDIR)
$(CHOWN_COMMAND) -R @INSTALLUSER@ $(DESTDIR)$(LOGDIR) >$(CHOWN_OUTPUT)
$(CHOWN_COMMAND) -R $(INSTALLUSER) $(DESTDIR)$(LOGDIR) >$(CHOWN_OUTPUT)
chmod -R 750 $(DESTDIR)$(LOGDIR)
#
# Documentation
@@ -368,8 +474,14 @@ install: copy-files
|| echo "Man page not included in sources"
$(INSTALL) -m 644 COPYING $(DESTDIR)$(DOCDIR)
#.
#' uninstall
#
uninstall: uninstall-binary
uninstall-rel: uninstall-binary uninstall-librel
uninstall-binary:
rm -f $(DESTDIR)$(SBINDIR)/ejabberdctl
rm -f $(DESTDIR)$(BINDIR)/iex
@@ -398,6 +510,7 @@ uninstall-binary:
rm -fr $(DESTDIR)$(LUADIR)
rm -fr $(DESTDIR)$(PRIVDIR)
rm -fr $(DESTDIR)$(EJABBERDDIR)
rm -f $(DESTDIR)$(MANDIR)/ejabberd.yml.5
uninstall-all: uninstall-binary
rm -rf $(DESTDIR)$(ETCDIR)
@@ -405,6 +518,10 @@ uninstall-all: uninstall-binary
rm -rf $(DESTDIR)$(SPOOLDIR)
rm -rf $(DESTDIR)$(LOGDIR)
#.
#' clean
#
clean:
rm -rf $(DEPSDIR)/.got
rm -rf $(DEPSDIR)/.built
@@ -427,27 +544,49 @@ distclean: clean clean-rel
rm -f Makefile
rm -f vars.config
rel:
#.
#' releases
#
rel: prod
prod:
$(PREPARE_ELIXIR_SCRIPTS)
$(REBARREL)
DEV_CONFIG = _build/dev/rel/ejabberd/conf/ejabberd.yml
dev $(DEV_CONFIG):
$(PREPARE_ELIXIR_SCRIPTS)
$(REBARDEV)
#.
#' tags
#
TAGS:
etags *.erl
etags src/*.erl
#.
#' makefile
#
Makefile: Makefile.in
#.
#' dialyzer
#
ifeq "$(REBAR_VER)" "3"
dialyzer:
find src/*_opt.erl -type f \! -regex ".*git.*" -exec sed -i 's/re:mp/ tuple/g' {} \;
$(REBAR) dialyzer
find src/*_opt.erl -type f \! -regex ".*git.*" -exec sed -i 's/ tuple/re:mp/g' {} \;
else
deps := $(wildcard $(DEPSDIR)/*/ebin)
dialyzer/erlang.plt:
@mkdir -p dialyzer
@$(MKDIR_P) dialyzer
@dialyzer --build_plt --output_plt dialyzer/erlang.plt \
-o dialyzer/erlang.log --apps kernel stdlib sasl crypto \
public_key ssl mnesia inets odbc compiler erts \
@@ -455,13 +594,13 @@ dialyzer/erlang.plt:
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
dialyzer/deps.plt:
@mkdir -p dialyzer
@$(MKDIR_P) dialyzer
@dialyzer --build_plt --output_plt dialyzer/deps.plt \
-o dialyzer/deps.log $(deps); \
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
dialyzer/ejabberd.plt:
@mkdir -p dialyzer
@$(MKDIR_P) dialyzer
@dialyzer --build_plt --output_plt dialyzer/ejabberd.plt \
-o dialyzer/ejabberd.log ebin; \
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
@@ -484,6 +623,10 @@ dialyzer: erlang_plt deps_plt ejabberd_plt
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
endif
#.
#' test
#
test:
@echo "************************** NOTICE ***************************************"
@cat test/README
@@ -491,9 +634,18 @@ test:
@cd priv && ln -sf ../sql
$(REBAR) $(SKIPDEPS) ct
.PHONY: src edoc dialyzer Makefile TAGS clean clean-rel distclean rel \
#.
#' phony
#
.PHONY: src edoc dialyzer Makefile TAGS clean clean-rel distclean prod rel \
install uninstall uninstall-binary uninstall-all translations deps test \
quicktest erlang_plt deps_plt ejabberd_plt xref hooks options
all dev doap help install-rel relive scripts uninstall-rel update \
erlang_plt deps_plt ejabberd_plt xref hooks options
#.
#' help
#
help:
@echo ""
@@ -501,25 +653,31 @@ help:
@echo " scripts Prepare ejabberd start scripts"
@echo " deps Get and configure dependencies"
@echo " src Compile dependencies and ejabberd"
@echo " update Update dependencies' source code"
@echo " update Update dependencies source code"
@echo " clean Clean binary files"
@echo " distclean Clean completely the development files"
@echo ""
@echo " install Install ejabberd to /usr/local"
@echo " install-rel Install ejabberd to /usr/local (using release)"
@echo " uninstall Uninstall ejabberd (buggy)"
@echo " uninstall-rel Uninstall ejabberd (using release)"
@echo " uninstall-all Uninstall also configuration, logs, mnesia... (buggy)"
@echo ""
@echo " rel Build a production release"
@echo " prod Build a production release"
@echo " dev Build a development release"
@echo " relive Start a live ejabberd in _build/relive/"
@echo ""
@echo " doap Generate DOAP file"
@echo " edoc Generate edoc documentation (unused)"
@echo " edoc Generate EDoc documentation [mix]"
@echo " options Generate ejabberd_option.erl"
@echo " translations Extract translation files (requires --enable-tools)"
@echo " tags Generate tags file for text editors"
@echo " translations Extract translation files"
@echo " TAGS Generate tags file for text editors"
@echo ""
@echo " dialyzer Run Dialyzer static analyzer"
@echo " dialyzer Run Dialyzer static analyzer [rebar3]"
@echo " hooks Run hooks validator"
@echo " test Run Common Tests suite"
@echo " xref Run cross reference analysis"
@echo " test Run Common Tests suite [rebar3]"
@echo " xref Run cross reference analysis [rebar3]"
#.
#'
# vim: foldmarker=#',#. foldmethod=marker:
+17 -15
View File
@@ -1,19 +1,18 @@
<p align="center">
<img src="https://www.process-one.net/wp-content/uploads/2022/05/ejabberd-logo-rounded-index.png"
height="216">
<img src="https://www.process-one.net/wp-content/uploads/2022/05/ejabberd-logo-rounded-index.png">
</p>
<p align="center">
<a href="https://github.com/processone/ejabberd/tags" alt="GitHub tag (latest SemVer)">
<img src="https://img.shields.io/github/v/tag/processone/ejabberd?sort=semver&logo=embarcadero&label=&color=3fb0d2&logoWidth=20" /></a>
<a href="https://hex.pm/packages/ejabberd" alt="Hex version">
<img src="https://img.shields.io/hexpm/v/ejabberd.svg" /></a>
<a href="https://github.com/processone/ejabberd/pkgs/container/ejabberd" alt="GitHub Container">
<img src="https://img.shields.io/github/v/tag/processone/ejabberd?label=container&sort=semver" /></a>
<a href="https://hub.docker.com/r/ejabberd/ecs/" alt="Docker Image Version (latest semver)">
<img src="https://img.shields.io/docker/v/ejabberd/ecs?label=docker" /></a>
<a href="https://formulae.brew.sh/formula/ejabberd" alt="homebrew version">
<img src="https://img.shields.io/homebrew/v/ejabberd" /></a>
<a href="https://hub.docker.com/r/ejabberd/ecs/" alt="Docker Image Version (latest semver)">
<img src="https://img.shields.io/docker/v/ejabberd/ecs?label=ecs&logo=docker" /></a>
<a href="https://github.com/processone/ejabberd/pkgs/container/ejabberd" alt="GitHub Container">
<img src="https://img.shields.io/github/v/tag/processone/ejabberd?label=ejabberd&sort=semver&logo=docker" /></a>
<br />
<a href="https://github.com/processone/ejabberd/actions/workflows/ci.yml" alt="CI">
<img src="https://github.com/processone/ejabberd/actions/workflows/ci.yml/badge.svg" /></a>
@@ -38,9 +37,9 @@ Installation
There are several ways to install ejabberd:
- Source code: compile yourself, see [COMPILE](COMPILE.md)
- Installers from [ProcessOne Download][p1download] or [ejabberd GitHub Releases][releases] (run/deb/rpm for x64 and arm64)
- Container image from [ejabberd Docker Hub][hubecs], see [ecs README][docker-ecs-readme] (for x64)
- Container image from [ejabberd Github Packages][packages], see [CONTAINER](CONTAINER.md) (for x64 and arm64)
- 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)
- Using your [Operating System package][osp]
- Using the [Homebrew][homebrew] package manager
@@ -72,8 +71,12 @@ 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]
Security reports or concerns should preferably be reported privately,
please send an email to the address: contact [at] process-one [dot] net
please send an email to the address: contact at process-one dot net
or some other method from [ProcessOne Contact][p1contact].
For commercial offering and support, including [ejabberd Business Edition][p1home]
@@ -85,8 +88,7 @@ Community
There are several places to get in touch with other ejabberd developers and administrators:
- [ejabberd XMPP chatroom][muc]: ejabberd@conference.process-one.net
- [Mailing list][list]
- ejabberd XMPP chatroom: [ejabberd@conference.process-one.net][muc]
- [GitHub Discussions][discussions]
- [Stack Overflow][stackoverflow]
@@ -94,7 +96,7 @@ There are several places to get in touch with other ejabberd developers and admi
License
-------
ejabberd is released under the GNU General Public License v2 (see [COPYING](COPYING.md)),
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.
@@ -105,12 +107,10 @@ and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MI
[erlang]: https://www.erlang.org/
[features]: https://docs.ejabberd.im/admin/introduction/
[fluux]: https://fluux.io/
[github]: https://github.com/processone/ejabberd
[homebrew]: https://docs.ejabberd.im/admin/installation/#homebrew
[hubecs]: https://hub.docker.com/r/ejabberd/ecs/
[im]: https://ejabberd.im/
[issues]: https://github.com/processone/ejabberd/issues
[list]: https://lists.jabber.ru/mailman/listinfo/ejabberd
[localization]: https://docs.ejabberd.im/developer/extending-ejabberd/localization/
[mqtt]: https://mqtt.org/
[muc]: xmpp:ejabberd@conference.process-one.net
@@ -119,6 +119,7 @@ and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MI
[p1download]: https://www.process-one.net/en/ejabberd/downloads/
[p1home]: https://www.process-one.net/en/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
@@ -126,3 +127,4 @@ and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MI
[xeps]: https://www.process-one.net/en/ejabberd/protocols/
[xmpp]: https://xmpp.org/
[xmppej]: https://xmpp.org/software/servers/ejabberd/
+2 -2
View File
@@ -8,6 +8,6 @@ end
rootpath = System.get_env("RELEASE_ROOT", rootdefault)
config :ejabberd,
file: Path.join(rootpath, "conf/ejabberd.yml"),
log_path: Path.join(rootpath, 'logs/ejabberd.log')
log_path: Path.join(rootpath, "logs/ejabberd.log")
config :mnesia,
dir: Path.join(rootpath, 'database/')
dir: Path.join(rootpath, "database/")
+37 -9
View File
@@ -2,15 +2,17 @@
# 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 23.01` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
REQUIRE_ERLANG_MIN="8.3 (Erlang/OTP 19.3)"
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 24.02` | 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)"
AC_CONFIG_MACRO_DIR([m4])
# Checks for programs.
AC_PROG_MAKE_SET
AC_PROG_AWK
AC_PROG_INSTALL
AC_PROG_MKDIR_P
AC_PROG_SED
if test "x$GCC" = "xyes"; then
@@ -28,18 +30,42 @@ fi
])
AC_ARG_WITH(rebar,
AS_HELP_STRING([--with-rebar=bin],[use the rebar/rebar3/mix binary specified]),
AS_HELP_STRING([--with-rebar=bin],[use as build tool the rebar/rebar3/mix binary specified]),
[if test "$withval" = "yes" -o "$withval" = "no" -o "X$with_rebar" = "X"; then
rebar="rebar"
rebar="rebar3"
else
rebar="$with_rebar"
fi
], [rebar="rebar"])
], [rebar="unconfigured"])
AC_PATH_TOOL(ERL, erl, , [${extra_erl_path}$PATH])
AC_PATH_TOOL(ERLC, erlc, , [${extra_erl_path}$PATH])
AC_PATH_TOOL(EPMD, epmd, , [${extra_erl_path}$PATH])
AC_PATH_TOOL(REBAR, rebar, , [${extra_erl_path}$PATH])
AC_PATH_TOOL(REBAR3, rebar3, , [${extra_erl_path}$PATH])
AC_PATH_TOOL(ELIXIR, elixir, , [${extra_erl_path}$PATH])
AC_PATH_TOOL(IEX, iex, , [${extra_erl_path}$PATH])
AC_PATH_TOOL(MIX, mix, , [${extra_erl_path}$PATH])
if test "$rebar" = unconfigured; then
if test "x$ELIXIR" = "x" -o "x$IEX" = "x" -o "x$MIX" = "x"; then
if test "x$REBAR3" = "x"; then
rebar="rebar3"
else
rebar=$REBAR3
fi
else
rebar=$MIX
fi
fi
if test "x$rebar" = "xrebar" -a "x$REBAR" = "x" ; then
rebar="./rebar"
fi
if test "x$rebar" = "xrebar3" -a "x$REBAR3" = "x" ; then
rebar="./rebar3"
fi
AC_ERLANG_NEED_ERL
AC_ERLANG_NEED_ERLC
@@ -84,7 +110,7 @@ AC_ARG_ENABLE(debug,
esac],[if test "x$debug" = "x"; then debug=true; fi])
AC_ARG_ENABLE(elixir,
[AS_HELP_STRING([--enable-elixir],[enable Elixir support (default: no)])],
[AS_HELP_STRING([--enable-elixir],[enable Elixir support in Rebar3 (default: no)])],
[case "${enableval}" in
yes) elixir=true ;;
no) elixir=false ;;
@@ -112,7 +138,7 @@ esac],[full_xml=false])
ENABLEGROUP=""
AC_ARG_ENABLE(group,
[AS_HELP_STRING([--enable-group[[[[=GROUP]]]]], [allow this system group to start ejabberd (default: no)])],
[AS_HELP_STRING([--enable-group[[=GROUP]]], [specify the group of the account defined in --enable-user (default: no)])],
[case "${enableval}" in
yes) ENABLEGROUP=`groups |head -n 1` ;;
no) ENABLEGROUP="" ;;
@@ -237,7 +263,7 @@ AC_ARG_ENABLE(system_deps,
esac],[if test "x$system_deps" = "x"; then system_deps=false; fi])
AC_ARG_ENABLE(tools,
[AS_HELP_STRING([--enable-tools],[build development tools (default: no)])],
[AS_HELP_STRING([--enable-tools],[include debugging/development tools (default: no)])],
[case "${enableval}" in
yes) tools=true ;;
no) tools=false ;;
@@ -246,7 +272,7 @@ esac],[if test "x$tools" = "x"; then tools=false; fi])
ENABLEUSER=""
AC_ARG_ENABLE(user,
[AS_HELP_STRING([--enable-user[[[[=USER]]]]], [allow this system user to start ejabberd (default: no)])],
[AS_HELP_STRING([--enable-user[[=USER]]], [allow this system user to start ejabberd (default: no)])],
[case "${enableval}" in
yes) ENABLEUSER=`whoami` ;;
no) ENABLEUSER="" ;;
@@ -280,6 +306,8 @@ case "`uname`" in
;;
esac
AC_MSG_RESULT([build tool to use (change using --with-rebar): $rebar])
AC_SUBST(roster_gateway_workaround)
AC_SUBST(new_sql_schema)
AC_SUBST(full_xml)
+76 -4
View File
@@ -631,11 +631,38 @@
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0398.html"/>
<xmpp:version>0.2.00.2.0</xmpp:version>
<xmpp:since>17.09</xmpp:since>
<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:note>mod_avatar, mod_vcard_xupdate</xmpp:note>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<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:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<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:note>mod_avatar</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<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:note>mod_private</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
@@ -665,6 +692,42 @@
<xmpp:note>mod_private</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<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: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:since>24.02</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-0425.html"/>
<xmpp:version>0.2.1</xmpp:version>
<xmpp:since>23.04</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:note>mod_mam</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<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:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0441.html"/>
@@ -674,5 +737,14 @@
<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:since>24.02</xmpp:since>
<xmpp:status></xmpp:status>
<xmpp:note></xmpp:note>
</xmpp:SupportedXep>
</implements>
</Project>
</rdf:RDF>
+2 -2
View File
@@ -36,17 +36,17 @@ listen:
-
port: 5223
ip: "::"
tls: true
module: ejabberd_c2s
max_stanza_size: 262144
shaper: c2s_shaper
access: c2s
starttls_required: true
tls: true
-
port: 5269
ip: "::"
module: ejabberd_s2s_in
max_stanza_size: 524288
shaper: s2s_shaper
-
port: 5443
ip: "::"
+19 -4
View File
@@ -108,10 +108,11 @@
#.
#' ERL_OPTIONS: Additional Erlang options
#
# The next variable allows to specify additional options passed to erlang while
# starting ejabberd. Some useful options are -noshell, -detached, -heart. When
# ejabberd is started from an init.d script options -noshell and -detached are
# added implicitly. See erl(1) for more info.
# The next variable allows to specify additional options passed to
# all commands using erlang interpreter. This applies to starting
# ejabberd server itself but also auxiliary commands like for example
# starting debug shell. See erl(1) for list of commands that can be
# used here.
#
# It might be useful to add "-pa /usr/local/lib/ejabberd/ebin" if you
# want to add local modules in this path.
@@ -120,6 +121,20 @@
#
#ERL_OPTIONS=""
#.
#' EJABBERD_OPTS: Additional Erlang options to start ejabberd
#
# The next variable allows to specify additional options passed to erlang while
# starting ejabberd. Some useful options are -noshell, -detached, -heart. When
# ejabberd is started from an init.d script options -noshell and -detached are
# added implicitly. See erl(1) for more info.
#
# For example you can use value "-heart -env HEART_BEAT_TIMEOUT 120 -env ERL_CRASH_DUMP_SECONDS 60"
#
# Default: ""
#
#EJABBERD_OPTS=""
#.
#' ERLANG_NODE: Erlang node name
#
+87 -28
View File
@@ -15,8 +15,8 @@ SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)"
# shellcheck disable=SC2034
ERTS_VSN="{{erts_vsn}}"
ERL="{{erl}}"
IEX="{{bindir}}/iex"
EPMD="{{epmd}}"
IEX="{{iexpath}}"
INSTALLUSER="{{installuser}}"
# check the proper system user is used
@@ -76,7 +76,7 @@ if [ -n "$FIREWALL_WINDOW" ] ; then
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
fi
if [ -n "$INET_DIST_INTERFACE" ] ; then
INET_DIST_INTERFACE2=$("$ERL" -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
INET_DIST_INTERFACE2=$("$ERL" $ERLANG_OPTS -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
if [ -n "$INET_DIST_INTERFACE2" ] ; then
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
fi
@@ -89,11 +89,12 @@ ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
ERL_INETRC="$CONFIG_DIR"/inetrc
# define ejabberd parameters
EJABBERD_OPTS="$EJABBERD_OPTS\
$(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]\{1,\}\).*/ \1/;s/:[ \t]*\(infinity\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_burst_limit_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_burst_limit_window_time/!d;s/:[ \t]*\([0-9]*[a-z]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")"
EJABBERD_OPTS="\
$(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]\{1,\}\).*/ \1/;s/:[ \t]*\(infinity\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_burst_limit_count/!d;s/:[ \t]*\([0-9]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_burst_limit_window_time/!d;s/:[ \t]*\([0-9]*[a-z]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$EJABBERD_OPTS"
[ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS"
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
@@ -121,7 +122,7 @@ set_dist_client()
exec_cmd()
{
case $EXEC_CMD in
as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;;
as_install_user) su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@" ;;
as_current_user) "$@" ;;
esac
}
@@ -149,9 +150,11 @@ debugwarning()
echo "Please be extremely cautious with your actions,"
echo "and exit immediately if you are not completely sure."
echo ""
echo "To detach this shell from ejabberd, press:"
echo " control+c, control+c"
echo "To exit and detach this shell from ejabberd, press:"
echo " control+g and then q"
echo ""
#vt100 echo "Please do NOT use control+c in this debug shell !"
#vt100 echo ""
echo "--------------------------------------------------------------------"
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
echo " EJABBERD_BYPASS_WARNINGS=true"
@@ -172,8 +175,8 @@ livewarning()
echo "Please be extremely cautious with your actions,"
echo "and exit immediately if you are not completely sure."
echo ""
echo "To exit this LIVE mode and stop ejabberd, press:"
echo " q(). and press the Enter key"
echo "To exit and detach this shell from ejabberd, press:"
echo " control+g and then q"
echo ""
echo "--------------------------------------------------------------------"
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
@@ -184,6 +187,39 @@ livewarning()
fi
}
check_etop_result()
{
result=$?
if [ $result -eq 1 ] ; then
echo ""
echo "It seems there was some problem running 'ejabberdctl etop'."
echo "Is the error message something like this?"
echo " Failed to load module 'etop' because it cannot be found..."
echo "Then probably ejabberd was compiled with development tools disabled."
echo "To use 'etop', recompile ejabberd with: ./configure --enable-tools"
echo ""
exit $result
fi
}
check_iex_result()
{
result=$?
if [ $result -eq 127 ] ; then
echo ""
echo "It seems there was some problem finding 'iex' binary from Elixir."
echo "Probably ejabberd was compiled with Rebar3 and Elixir disabled, like:"
echo " ./configure"
echo "which is equivalent to:"
echo " ./configure --with-rebar=rebar3 --disable-elixir"
echo "To use 'iex', recompile ejabberd enabling Elixir or using Mix:"
echo " ./configure --enable-elixir"
echo " ./configure --with-rebar=mix"
echo ""
exit $result
fi
}
help()
{
echo ""
@@ -212,16 +248,30 @@ help()
}
# dynamic node name helper
uid()
{
uuid=$(uuidgen 2>/dev/null)
random=$(awk 'BEGIN { srand(); print int(rand()*32768) }' /dev/null)
[ -z "$uuid" ] && [ -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid)
[ -z "$uuid" ] && uuid=$(printf "%X" "${random:-$$}$(date +%M%S)")
uuid=$(printf '%s' $uuid | sed 's/^\(...\).*$/\1/')
[ $# -eq 0 ] && echo "${uuid}-${ERLANG_NODE}"
[ $# -eq 1 ] && echo "${uuid}-${1}-${ERLANG_NODE}"
[ $# -eq 2 ] && echo "${uuid}-${1}@${2}"
uid() {
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
PF=$(( $$ % 97 ))
while
case $# in
0) NN="${PF}-${N}-${ERLANG_NODE}"
;;
1) NN="${PF}-${N}-${1}-${ERLANG_NODE}"
;;
2) NN="${PF}-${N}-${1}@${2}"
;;
esac
N=$(( N + 1 + ( $$ % 5 ) ))
"$EPMD" -names 2>/dev/null | grep -q " ${NN%@*} "
do :; done
echo $NN
else
# Erlang/OTP 23 or higher: use native dynamic node code
# https://www.erlang.org/patches/otp-23.0#OTP-13812
echo undefined
fi
}
# stop epmd if there is no other running node
@@ -264,7 +314,9 @@ wait_status()
if [ $timeout -eq 0 ] ; then
status="$1"
else
exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
exec_erl "$(uid ctl)" -hidden -noinput \
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
-s ejabberd_ctl \
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
status="$?"
fi
@@ -305,24 +357,29 @@ case $1 in
;;
etop)
set_dist_client
exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \
-s erlang halt -output text
exec_erl "$(uid top)" -hidden -remsh "$ERLANG_NODE" -s etop \
-output text
check_etop_result
;;
iexdebug)
debugwarning
set_dist_client
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
check_iex_result
;;
iexlive)
livewarning
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS" --app ejabberd
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS"
check_iex_result
;;
ping)
PEER=${2:-$ERLANG_NODE}
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
set_dist_client
exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \
-noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
-noinput -hidden \
-eval 'net_kernel:connect_node('"'$PEER'"')' \
-eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
-s erlang halt -output text
;;
started)
@@ -335,7 +392,9 @@ case $1 in
;;
*)
set_dist_client
exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
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
-66
View File
@@ -1,66 +0,0 @@
#!/usr/bin/perl
use Unix::Syslog qw(:macros :subs);
my $domain = $ARGV[0] || "example.com";
while(1)
{
# my $rin = '',$rout;
# vec($rin,fileno(STDIN),1) = 1;
# $ein = $rin;
# my $nfound = select($rout=$rin,undef,undef,undef);
my $buf = "";
syslog LOG_INFO,"waiting for packet";
my $nread = sysread STDIN,$buf,2;
do { syslog LOG_INFO,"port closed"; exit; } unless $nread == 2;
my $len = unpack "n",$buf;
my $nread = sysread STDIN,$buf,$len;
my ($op,$user,$host,$password) = split /:/,$buf;
#$user =~ s/\./\//og;
my $jid = "$user\@$domain";
my $result;
syslog(LOG_INFO,"request (%s)", $op);
SWITCH:
{
$op eq 'auth' and do
{
$result = 1;
},last SWITCH;
$op eq 'setpass' and do
{
$result = 1;
},last SWITCH;
$op eq 'isuser' and do
{
# password is null. Return 1 if the user $user\@$domain exitst.
$result = 1;
},last SWITCH;
$op eq 'tryregister' and do
{
$result = 1;
},last SWITCH;
$op eq 'removeuser' and do
{
# password is null. Return 1 if the user $user\@$domain exitst.
$result = 1;
},last SWITCH;
$op eq 'removeuser3' and do
{
$result = 1;
},last SWITCH;
};
my $out = pack "nn",2,$result ? 1 : 0;
syswrite STDOUT,$out;
}
closelog;
-75
View File
@@ -1,75 +0,0 @@
#!/bin/sh
#
# PROVIDE: ejabberd
# REQUIRE: DAEMON
# KEYWORD: shutdown
#
HOME=/usr/pkg/jabber D=/usr/pkg/jabber/ejabberd export HOME
name="ejabberd"
rcvar=$name
if [ -r /etc/rc.conf ]
then
. /etc/rc.conf
else
eval ${rcvar}=YES
fi
# $flags from environment overrides ${rcvar}_flags
if [ -n "${flags}" ]
then
eval ${rcvar}_flags="${flags}"
fi
checkyesno()
{
eval _value=\$${1}
case $_value in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) return 0 ;;
[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) return 1 ;;
*)
echo "\$${1} is not set properly."
return 1
;;
esac
}
cmd=${1:-start}
case ${cmd} in
force*)
cmd=${cmd#force}
eval ${rcvar}=YES
;;
esac
if checkyesno ${rcvar}
then
else
exit 0
fi
case ${cmd} in
start)
if [ -x $D/src ]; then
echo "Starting ${name}."
cd $D/src
ERL_MAX_PORTS=32000 export ERL_MAX_PORTS
ulimit -n $ERL_MAX_PORTS
su jabber -c "/usr/pkg/bin/erl -sname ejabberd -s ejabberd -heart -detached -sasl sasl_error_logger '{file, \"ejabberd-sasl.log\"}' &" \
1>/dev/null 2>&1
fi
;;
stop)
echo "rpc:call('ejabberd@`hostname -s`', init, stop, [])." | \
su jabber -c "/usr/pkg/bin/erl -sname ejabberdstop"
;;
restart)
echo "rpc:call('ejabberd@`hostname -s`', init, restart, [])." | \
su jabber -c "/usr/pkg/bin/erl -sname ejabberdrestart"
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
-81
View File
@@ -1,81 +0,0 @@
#!/bin/sh
echo '1. fetch, compile, and install erlang'
if [ ! pkg_info erlang 1>/dev/null 2>&1 ]; then
cd /usr/pkgsrc/lang/erlang
make fetch-list|sh
make
make install
fi
if pkg_info erlang | grep -q erlang-9.1nb1; then
else
echo "erlang-9.1nb1 not installed" 1>&2
exit 1
fi
echo '2. install crypt_drv.so'
if [ ! -d /usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib ] ; then
mkdir -p /usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib
fi
if [ ! -f /usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib/crypto_drv.so ]; then
cp work/otp*/lib/crypto/priv/*/*/crypto_drv.so \
/usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib
fi
echo '3. compile and install elibcrypto.so'
if [ ! -f /usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib/elibcrypto.so ]; then
cd /usr/pkgsrc/lang/erlang/work/otp_src_R9B-1/lib/crypto/c_src
ld -r -u CRYPTO_set_mem_functions -u MD5 -u MD5_Init -u MD5_Update \
-u MD5_Final -u SHA1 -u SHA1_Init -u SHA1_Update -u SHA1_Final \
-u des_set_key -u des_ncbc_encrypt -u des_ede3_cbc_encrypt \
-L/usr/lib -lcrypto -o ../priv/obj/i386--netbsdelf/elibcrypto.o
cc -shared \
-L/usr/pkgsrc/lang/erlang/work/otp_src_R9B-1/lib/erl_interface/obj/i386--netbsdelf \
-o ../priv/obj/i386--netbsdelf/elibcrypto.so \
../priv/obj/i386--netbsdelf/elibcrypto.o -L/usr/lib -lcrypto
cp ../priv/obj/i386--netbsdelf/elibcrypto.so \
/usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib
fi
echo '4. compile and install ssl_esock'
if [ ! -f /usr/pkg/lib/erlang/lib/ssl-2.3.5/priv/bin/ssl_esock ]; then
cd /usr/pkg/lib/erlang/lib/ssl-2.3.5/priv/obj/
make
fi
echo '5. initial ejabberd configuration'
cd /usr/pkg/jabber/ejabberd/src
./configure
echo '6. edit ejabberd Makefiles'
for M in Makefile mod_*/Makefile; do
if [ ! -f $M.orig ]; then
mv $M $M.orig
sed -e s%/usr/local%/usr/pkg%g < $M.orig > $M
fi
done
echo '7. compile ejabberd'
gmake
for A in mod_muc mod_pubsub; do
(cd $A; gmake)
done
echo ''
echo 'now edit ejabberd.cfg'
echo ''
echo 'to start ejabberd: erl -sname ejabberd -s ejabberd'
-65
View File
@@ -1,65 +0,0 @@
% jabber.dbc.mtview.ca.us
override_acls.
{acl, admin, {user, "mrose", "jabber.dbc.mtview.ca.us"}}.
{access, announce, [{allow, admin},
{deny, all}]}.
{access, c2s, [{deny, blocked},
{allow, all}]}.
{access, c2s_shaper, [{none, admin},
{normal, all}]}.
{access, configure, [{allow, admin},
{deny, all}]}.
{access, disco_admin, [{allow, admin},
{deny, all}]}.
{access, muc_admin, [{allow, admin},
{deny, all}]}.
{access, register, [{deny, all}]}.
{access, s2s_shaper, [{fast, all}]}.
{auth_method, internal}.
{host, "jabber.dbc.mtview.ca.us"}.
{outgoing_s2s_port, 5269}.
{shaper, normal, {maxrate, 1000}}.
{shaper, fast, {maxrate, 50000}}.
{welcome_message, none}.
{listen, [{5222, ejabberd_c2s,
[{access, c2s},
{shaper, c2s_shaper}]},
{5223, ejabberd_c2s,
[{access, c2s},
{shaper, c2s_shaper},
{ssl, [{certfile, "/etc/openssl/certs/ejabberd.pem"}]}]},
{5269, ejabberd_s2s_in,
[{shaper, s2s_shaper}]}]}.
{modules, [
{mod_register, []},
{mod_roster, []},
{mod_privacy, []},
{mod_configure, []},
{mod_disco, []},
{mod_stats, []},
{mod_vcard, []},
{mod_offline, []},
{mod_echo, [{host, "echo.jabber.dbc.mtview.ca.us"}]},
{mod_private, []},
{mod_muc, []},
{mod_pubsub, []},
{mod_time, []},
{mod_last, []},
{mod_version, []}
]}.
% Local Variables:
% mode: erlang
% End:
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+21 -39
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -67,42 +67,24 @@
args_example = none :: none | [any()] | '_',
result_example = none :: any()}).
%% TODO Fix me: Type is not up to date
-type ejabberd_commands() :: #ejabberd_commands{name :: atom(),
tags :: [atom()],
desc :: string(),
longdesc :: string(),
version :: integer(),
module :: atom(),
function :: atom(),
args :: [aterm()],
policy :: open | restricted | admin | user,
access :: [{atom(),atom(),atom()}|atom()],
result :: rterm()}.
-type ejabberd_commands() :: #ejabberd_commands{name :: atom(),
tags :: [atom()],
desc :: string(),
longdesc :: string(),
version :: integer(),
note :: string(),
weight :: integer(),
module :: atom(),
function :: atom(),
args :: [aterm()],
policy :: open | restricted | admin | user,
access :: [{atom(),atom(),atom()}|atom()],
definer :: atom(),
result :: rterm(),
args_rename :: [{atom(),atom()}],
args_desc :: none | [string()] | '_',
result_desc :: none | string() | '_',
args_example :: none | [any()] | '_',
result_example :: any()
}.
%% @type ejabberd_commands() = #ejabberd_commands{
%% name = atom(),
%% tags = [atom()],
%% desc = string(),
%% longdesc = string(),
%% module = atom(),
%% function = atom(),
%% args = [aterm()],
%% result = rterm()
%% }.
%% desc: Description of the command
%% args: Describe the accepted arguments.
%% This way the function that calls the command can format the
%% arguments before calling.
%% @type atype() = integer | string | {tuple, [aterm()]} | {list, aterm()}.
%% Allowed types for arguments are integer, string, tuple and list.
%% @type rtype() = integer | string | atom | {tuple, [rterm()]} | {list, rterm()} | rescode | restuple.
%% A rtype is either an atom or a tuple with two elements.
%% @type aterm() = {Name::atom(), Type::atype()}.
%% An argument term is a tuple with the term name and the term type.
%% @type rterm() = {Name::atom(), Type::rtype()}.
%% A result term is a tuple with the term name and the term type.
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -34,12 +34,14 @@
format_query :: fun(),
format_res :: fun(),
args :: fun(),
flags :: non_neg_integer(),
loc :: {module(), pos_integer()}}).
-else.
-record(sql_query, {hash :: binary(),
format_query :: fun(),
format_res :: fun(),
args :: fun(),
flags :: non_neg_integer(),
loc :: {module(), {pos_integer(), pos_integer()}}}).
-endif.
@@ -48,3 +50,26 @@
boolean :: fun((boolean()) -> binary()),
in_array_string :: fun((binary()) -> binary()),
like_escape :: fun(() -> binary())}).
-record(sql_index, {columns,
unique = false :: boolean(),
meta = #{}}).
-record(sql_column, {name :: binary(),
type,
default = false,
opts = []}).
-record(sql_table, {name :: binary(),
columns :: [#sql_column{}],
indices = [] :: [#sql_index{}],
post_create}).
-record(sql_schema, {version :: integer(),
tables :: [#sql_table{}],
update = []}).
-record(sql_references, {table :: binary(),
column :: binary()}).
-record(sql_schema_info,
{db_type :: pgsql | mysql | sqlite,
db_version :: any(),
new_schema = true :: boolean()}).
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+3 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -62,5 +62,7 @@
_ -> 'Elixir.Logger':bare_log(error, io_lib:format(Format, Args), [?MODULE])
end).
-type re_mp() :: {re_pattern, _, _, _, _}. % Copied from re.erl
%% Uncomment if you want to debug p1_fsm/gen_fsm
%%-define(DBGFSM, true).
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+3 -2
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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,7 +26,8 @@
bare_peer = {<<"">>, <<"">>, <<"">>} :: ljid(),
packet = #xmlel{} :: xmlel() | message(),
nick = <<"">> :: binary(),
type = chat :: chat | groupchat}).
type = chat :: chat | groupchat,
origin_id = <<"">> :: binary()}).
-record(archive_prefs,
{us = {<<"">>, <<"">>} :: {binary(), binary()},
+28
View File
@@ -0,0 +1,28 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License along
%%% with this program; if not, write to the Free Software Foundation, Inc.,
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
%%%
%%%----------------------------------------------------------------------
-record(room_version,
{id :: binary(),
%% use the same field names as in Synapse
knock_restricted_join_rule :: boolean(),
enforce_int_power_levels :: boolean(),
implicit_room_creator :: boolean(),
updated_redaction_rules :: boolean()
}).
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+3 -3
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -38,7 +38,7 @@
description = <<"">> :: binary(),
allow_change_subj = true :: boolean(),
allow_query_users = true :: boolean(),
allow_private_messages = true :: boolean(),
allowpm = anyone :: anyone | participants | moderators | none,
allow_private_messages_from_visitors = anyone :: anyone | moderators | nobody ,
allow_visitor_status = true :: boolean(),
allow_visitor_nickchange = true :: boolean(),
@@ -125,7 +125,7 @@
roles = #{} :: roles(),
history = #lqueue{} :: lqueue(),
subject = [] :: [text()],
subject_author = <<"">> :: binary(),
subject_author = {<<"">>, #jid{}} :: {binary(), jid()},
hats_users = #{} :: map(), % FIXME on OTP 21+: #{ljid() => #{binary() => binary()}},
just_created = erlang:system_time(microsecond) :: true | integer(),
activity = treap:empty() :: treap:treap(),
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2017-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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-2023 ProcessOne, SARL. All Rights Reserved.
%%% @copyright (C) 2002-2024 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-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
Regular → Executable
View File
+2 -2
View File
@@ -36,8 +36,8 @@ defmodule Ejabberd.Config do
case force do
true ->
Ejabberd.Config.Store.stop
Ejabberd.Config.Store.start_link
Ejabberd.Config.Store.stop()
Ejabberd.Config.Store.start_link()
do_init(file_path)
false ->
if not init_already_executed, do: do_init(file_path)
+1 -1
View File
@@ -60,7 +60,7 @@ defmodule Ejabberd.Config.EjabberdModule do
defp fetch_and_store_repo_source_if_not_exists(path, repo) do
unless File.exists?(path) do
IO.puts "[info] Fetching: #{repo}"
:os.cmd('git clone #{repo} #{path}')
:os.cmd(~c"git clone #{repo} #{path}")
end
end
+3 -3
View File
@@ -14,15 +14,15 @@ defmodule Mix.Tasks.Ejabberd.Deps.Tree do
def run(_argv) do
# First we need to start manually the store to be available
# during the compilation of the config file.
Ejabberd.Config.Store.start_link
Ejabberd.Config.Store.start_link()
Ejabberd.Config.init(:ejabberd_config.path())
Mix.shell.info "ejabberd modules"
Mix.shell().info "ejabberd modules"
Ejabberd.Config.Store.get(:modules)
|> Enum.reverse # Because of how mods are stored inside the store
|> format_mods
|> Mix.shell.info
|> Mix.shell().info
end
defp format_mods(mods) when is_list(mods) do
+4 -4
View File
@@ -2,19 +2,19 @@ defmodule ModPresenceDemo do
use Ejabberd.Module
def start(host, _opts) do
info('Starting ejabberd module Presence Demo')
info("Starting ejabberd module Presence Demo")
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 Presence Demo")
Ejabberd.Hooks.delete(:set_presence_hook, host, __MODULE__, :on_presence, 50)
:ok
end
def on_presence(user, _server, _resource, _packet) do
info('Receive presence for #{user}')
info("Receive presence for #{user}")
:none
end
@@ -27,7 +27,7 @@ defmodule ModPresenceDemo do
end
def mod_doc() do
%{:desc => 'This is just a demonstration.'}
%{:desc => "This is just a demonstration."}
end
end
+275 -51
View File
@@ -2,12 +2,12 @@
.\" Title: ejabberd.yml
.\" Author: [see the "AUTHOR" section]
.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
.\" Date: 01/16/2023
.\" Date: 02/24/2024
.\" Manual: \ \&
.\" Source: \ \&
.\" Language: English
.\"
.TH "EJABBERD\&.YML" "5" "01/16/2023" "\ \&" "\ \&"
.TH "EJABBERD\&.YML" "5" "02/24/2024" "\ \&" "\ \&"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -82,7 +82,7 @@ All options can be changed in runtime by running \fIejabberdctl reload\-config\f
.sp
Some options can be specified for particular virtual host(s) only using \fIhost_config\fR or \fIappend_host_config\fR options\&. Such options are called \fIlocal\fR\&. Examples are \fImodules\fR, \fIauth_method\fR and \fIdefault_db\fR\&. The options that cannot be defined per virtual host are called \fIglobal\fR\&. Examples are \fIloglevel\fR, \fIcertfiles\fR and \fIlisten\fR\&. It is a configuration mistake to put \fIglobal\fR options under \fIhost_config\fR or \fIappend_host_config\fR section \- ejabberd will refuse to load such configuration\&.
.sp
It is not recommended to write ejabberd\&.yml from scratch\&. Instead it is better to start from "default" configuration file available at https://github\&.com/processone/ejabberd/blob/23\&.01/ejabberd\&.yml\&.example\&. Once you get ejabberd running you can start changing configuration options to meet your requirements\&.
It is not recommended to write ejabberd\&.yml from scratch\&. Instead it is better to start from "default" configuration file available at https://github\&.com/processone/ejabberd/blob/24\&.02/ejabberd\&.yml\&.example\&. Once you get ejabberd running you can start changing configuration options to meet your requirements\&.
.sp
Note that this document is intended to provide comprehensive description of all configuration options that can be consulted to understand the meaning of a particular option, its format and possible values\&. It will be quite hard to understand how to configure ejabberd by reading this document only \- for this purpose the reader is recommended to read online Configuration Guide available at https://docs\&.ejabberd\&.im/admin/configuration\&.
.SH "TOP LEVEL OPTIONS"
@@ -303,7 +303,9 @@ acme:
.PP
\fBallow_contrib_modules\fR: \fItrue | false\fR
.RS 4
Whether to allow installation of third\-party modules or not\&. The default value is
Whether to allow installation of third\-party modules or not\&. See
ejabberd\-contrib
documentation section\&. The default value is
\fItrue\fR\&.
.RE
.PP
@@ -396,6 +398,18 @@ Same as
\fIcache_size\fR
will be used\&.
.RE
.sp
\fINote\fR about the next option: added in 23\&.10:
.PP
\fBauth_external_user_exists_check\fR: \fItrue | false\fR
.RS 4
Supplement check for user existence based on
\fImod_last\fR
data, for authentication methods that don\(cqt have a way to reliably tell if a user exists (like is the case for
\fIjwt\fR
and certificate based authentication)\&. This helps with processing offline message for those users\&. The default value is
\fItrue\fR\&.
.RE
.PP
\fBauth_method\fR: \fI[mnesia | sql | anonymous | external | jwt | ldap | pam, \&.\&.\&.]\fR
.RS 4
@@ -416,7 +430,9 @@ Git repository\&. Please refer to that module\(cqs README file for details\&.
.PP
\fBauth_password_format\fR: \fIplain | scram\fR
.RS 4
The option defines in what format the users passwords are stored:
The option defines in what format the users passwords are stored, plain text or in
SCRAM
format:
.sp
.RS 4
.ie n \{\
@@ -426,7 +442,7 @@ The option defines in what format the users passwords are stored:
.sp -1
.IP \(bu 2.3
.\}
\fIplain\fR: The password is stored as plain text in the database\&. This is risky because the passwords can be read if your database gets compromised\&. This is the default value\&. This format allows clients to authenticate using: the old Jabber Non\-SASL (XEP\-0078), SASL PLAIN, SASL DIGEST\-MD5, and SASL SCRAM\-SHA\-1\&.
\fIplain\fR: The password is stored as plain text in the database\&. This is risky because the passwords can be read if your database gets compromised\&. This is the default value\&. This format allows clients to authenticate using: the old Jabber Non\-SASL (XEP\-0078), SASL PLAIN, SASL DIGEST\-MD5, and SASL SCRAM\-SHA\-1/256/512(\-PLUS)\&.
.RE
.sp
.RS 4
@@ -437,14 +453,19 @@ The option defines in what format the users passwords are stored:
.sp -1
.IP \(bu 2.3
.\}
\fIscram\fR: The password is not stored, only some information that allows to verify the hash provided by the client\&. It is impossible to obtain the original plain password from the stored information; for this reason, when this value is configured it cannot be changed to plain anymore\&. This format allows clients to authenticate using: SASL PLAIN and SASL SCRAM\-SHA\-1\&. The default value is
\fIplain\fR\&.
\fIscram\fR: The password is not stored, only some information required to verify the hash provided by the client\&. It is impossible to obtain the original plain password from the stored information; for this reason, when this value is configured it cannot be changed to plain anymore\&. This format allows clients to authenticate using: SASL PLAIN and SASL SCRAM\-SHA\-1/256/512(\-PLUS)\&. The SCRAM variant depends on the
\fIauth_scram_hash\fR
option\&.
.RE
.RE
.sp
The default value is \fIplain\fR\&.
.PP
\fBauth_scram_hash\fR: \fIsha | sha256 | sha512\fR
.RS 4
Hash algorithm that should be used to store password in SCRAM format\&. You shouldn\(cqt change this if you already have passwords generated with a different algorithm \- users that have such passwords will not be able to authenticate\&. The default value is
Hash algorithm that should be used to store password in
SCRAM
format\&. You shouldn\(cqt change this if you already have passwords generated with a different algorithm \- users that have such passwords will not be able to authenticate\&. The default value is
\fIsha\fR\&.
.RE
.PP
@@ -566,7 +587,13 @@ A maximum number of items (not memory!) in cache\&. The rule of thumb, for all t
.RS 4
Full path to a script that generates
CAPTCHA
images\&. @VERSION@ is replaced with ejabberd version number in XX\&.YY format\&. @SEMVER@ is replaced with ejabberd version number in semver format when compiled with Elixir\(cqs mix, or XX\&.YY format otherwise\&. Alternatively, it can be the name of a module that implements ejabberd CAPTCHA support\&. There is no default value: when this option is not set, CAPTCHA functionality is completely disabled\&.
images\&.
\fI@VERSION@\fR
is replaced with ejabberd version number in
\fIXX\&.YY\fR
format\&.
\fI@SEMVER@\fR
is replaced with ejabberd version number in semver format when compiled with Elixir\(cqs mix, or XX\&.YY format otherwise\&. Alternatively, it can be the name of a module that implements ejabberd CAPTCHA support\&. There is no default value: when this option is not set, CAPTCHA functionality is completely disabled\&.
.sp
When using the ejabberd installers or container image, the example captcha scripts can be used like this:
.sp
@@ -595,8 +622,10 @@ CAPTCHA
generated images per minute for any given JID\&. The option is intended to protect the server from CAPTCHA DoS\&. The default value is
\fIinfinity\fR\&.
.RE
.sp
\fINote\fR about the next option: improved in 23\&.04:
.PP
\fBcaptcha_url\fR: \fIURL\fR
\fBcaptcha_url\fR: \fIURL | auto | undefined\fR
.RS 4
An URL where
CAPTCHA
@@ -604,7 +633,14 @@ requests should be sent\&. NOTE: you need to configure
\fIrequest_handlers\fR
for
\fIejabberd_http\fR
listener as well\&. There is no default value\&.
listener as well\&. If set to
\fIauto\fR, it builds the URL using a
\fIrequest_handler\fR
already enabled, with encryption if available\&. If set to
\fIundefined\fR, it builds the URL using the deprecated
\fIcaptcha_host\fR
+ /captcha\&. The default value is
\fIauto\fR\&.
.RE
.PP
\fBcertfiles\fR: \fI[Path, \&.\&.\&.]\fR
@@ -696,6 +732,14 @@ or
is case\-insensitive\&. The default value is an empty list, i\&.e\&. no mechanisms are disabled by default\&.
.RE
.PP
\fBdisable_sasl_scram_downgrade_protection\fR: \fItrue | false\fR
.RS 4
Allows to disable sending data required by
\fIXEP\-0474: SASL SCRAM Downgrade Protection\fR\&. There are known buggy clients (like those that use strophejs 1\&.6\&.2) which will not be able to authenticatate when servers sends data from that specification\&. This options allows server to disable it to allow even buggy clients connects, but in exchange decrease MITM protection\&. The default value of this option is
\fIfalse\fR
which enables this extension\&.
.RE
.PP
\fBdomain_balancing\fR: \fI{Domain: Options}\fR
.RS 4
An algorithm to load balance the components that are plugged on an ejabberd cluster\&. It means that you can plug one or several instances of the same component on each ejabberd node and that the traffic will be automatically distributed\&. The algorithm to deliver messages to the component(s) can be specified by this option\&. For any component connected as
@@ -722,7 +766,7 @@ attribute;
\fIfrom\fR
attribute;
\fIbare_destination\fR
\- by the the bare JID (without resource) of the packet\(cqs
\- by the bare JID (without resource) of the packet\(cqs
\fIto\fR
attribute;
\fIbare_source\fR
@@ -866,6 +910,16 @@ Disallows the usage of those options in the included file
\fIFilename\fR\&. The options that match this criteria are not accepted\&. The default value is an empty list\&.
.RE
.RE
.sp
\fINote\fR about the next option: added in 23\&.10:
.PP
\fBinstall_contrib_modules\fR: \fI[Module, \&.\&.\&.]\fR
.RS 4
Modules to install from
ejabberd\-contrib
at start time\&. The default value is an empty list of modules:
\fI[]\fR\&.
.RE
.PP
\fBjwt_auth_only_rule\fR: \fIAccessName\fR
.RS 4
@@ -877,7 +931,7 @@ This ACL rule defines accounts that can use only this auth method, even if other
.RS 4
By default, the JID is defined in the
\fI"jid"\fR
JWT field\&. This option allows to specify other JWT field name where the JID is defined\&.
JWT field\&. In this option you can specify other JWT field name where the JID is defined\&.
.RE
.PP
\fBjwt_key\fR: \fIFilePath\fR
@@ -1084,7 +1138,7 @@ section for details\&.
\fBnegotiation_timeout\fR: \fItimeout()\fR
.RS 4
Time to wait for an XMPP stream negotiation to complete\&. When timeout occurs, the corresponding XMPP stream is closed\&. The default value is
\fI30\fR
\fI120\fR
seconds\&.
.RE
.PP
@@ -1100,9 +1154,9 @@ This option can be used to tune tick time parameter of
Whether to use
\fInew\fR
SQL schema\&. All schemas are located at
https://github\&.com/processone/ejabberd/tree/23\&.01/sql\&. There are two schemas available\&. The default legacy schema allows to store one XMPP domain into one ejabberd database\&. The
https://github\&.com/processone/ejabberd/tree/24\&.02/sql\&. There are two schemas available\&. The default legacy schema stores one XMPP domain into one ejabberd database\&. The
\fInew\fR
schema allows to handle several XMPP domains in a single ejabberd database\&. Using this
schema can handle several XMPP domains in a single ejabberd database\&. Using this
\fInew\fR
schema is best when serving several XMPP domains and/or changing domains from time to time\&. This avoid need to manage several databases and handle complex configuration changes\&. The default depends on configuration flag
\fI\-\-enable\-new\-sql\-schema\fR
@@ -1216,7 +1270,7 @@ percents\&.
.RS 4
Specify which address families to try, in what order\&. The default is
\fI[ipv6, ipv4]\fR
which means it first tries connecting with IPv6, if that fails it tries using IPv4\&.This option is obsolete and irrelevant when using ejabberd 23\&.01 and Erlang/OTP 22, or newer versions of them\&.
which means it first tries connecting with IPv6, if that fails it tries using IPv4\&. This option is obsolete and irrelevant when using ejabberd 23\&.01 and Erlang/OTP 22, or newer versions of them\&.
.RE
.sp
\fINote\fR about the next option: added in 20\&.12:
@@ -1650,6 +1704,15 @@ seconds\&.
An SQL database name\&. For SQLite this must be a full path to a database file\&. The default value is
\fIejabberd\fR\&.
.RE
.sp
\fINote\fR about the next option: added in 24\&.02:
.PP
\fBsql_flags\fR: \fI[mysql_alternative_upsert]\fR
.RS 4
This option accepts a list of SQL flags, and is empty by default\&.
\fImysql_alternative_upsert\fR
forces the alternative upsert implementation in MySQL\&.
.RE
.PP
\fBsql_keepalive_interval\fR: \fItimeout()\fR
.RS 4
@@ -1660,10 +1723,13 @@ An interval to make a dummy SQL request to keep alive the connections to the dat
.PP
\fBsql_odbc_driver\fR: \fIPath\fR
.RS 4
Path to the ODBC driver to use to connect to a Microsoft SQL Server database\&. This option is only valid if the
Path to the ODBC driver to use to connect to a Microsoft SQL Server database\&. This option only applies if the
\fIsql_type\fR
option is set to
\fImssql\fR\&. The default value is:
\fImssql\fR
and
\fIsql_server\fR
is not an ODBC connection string\&. The default value is:
\fIlibtdsodbc\&.so\fR
.RE
.PP
@@ -1696,7 +1762,7 @@ for MS SQL\&. The option has no effect for SQLite\&.
.RS 4
This option is
\fItrue\fR
by default, and is useful to disable prepared statements\&. The option is valid for PostgreSQL\&.
by default, and is useful to disable prepared statements\&. The option is valid for PostgreSQL and MySQL\&.
.RE
.PP
\fBsql_query_timeout\fR: \fItimeout()\fR
@@ -1719,7 +1785,12 @@ if the latter is not set\&.
.PP
\fBsql_server\fR: \fIHost\fR
.RS 4
A hostname or an IP address of the SQL server\&. The default value is
The hostname or IP address of the SQL server\&. For
\fIsql_type\fR
\fImssql\fR
or
\fIodbc\fR
this can also be an ODBC connection string\&. The default value is
\fIlocalhost\fR\&.
.RE
.sp
@@ -1727,7 +1798,7 @@ A hostname or an IP address of the SQL server\&. The default value is
.PP
\fBsql_ssl\fR: \fItrue | false\fR
.RS 4
Whether to use SSL encrypted connections to the SQL server\&. The option is only available for MySQL and PostgreSQL\&. The default value is
Whether to use SSL encrypted connections to the SQL server\&. The option is only available for MySQL, MS SQL and PostgreSQL\&. The default value is
\fIfalse\fR\&.
.RE
.PP
@@ -1738,7 +1809,7 @@ A path to a file with CA root certificates that will be used to verify SQL conne
and
\fIsql_ssl_verify\fR
options are set to
\fItrue\fR\&. There is no default which means certificate verification is disabled\&.
\fItrue\fR\&. There is no default which means certificate verification is disabled\&. This option has no effect for MS SQL\&.
.RE
.PP
\fBsql_ssl_certfile\fR: \fIPath\fR
@@ -1746,7 +1817,7 @@ options are set to
A path to a certificate file that will be used for SSL connections to the SQL server\&. Implies
\fIsql_ssl\fR
option is set to
\fItrue\fR\&. There is no default which means ejabberd won\(cqt provide a client certificate to the SQL server\&.
\fItrue\fR\&. There is no default which means ejabberd won\(cqt provide a client certificate to the SQL server\&. This option has no effect for MS SQL\&.
.RE
.PP
\fBsql_ssl_verify\fR: \fItrue | false\fR
@@ -1756,7 +1827,7 @@ Whether to verify SSL connection to the SQL server against CA root certificates
option\&. Implies
\fIsql_ssl\fR
option is set to
\fItrue\fR\&. The default value is
\fItrue\fR\&. This option has no effect for MS SQL\&. The default value is
\fIfalse\fR\&.
.RE
.PP
@@ -1784,12 +1855,18 @@ A user name for SQL authentication\&. The default value is
Specify what proxies are trusted when an HTTP request contains the header
\fIX\-Forwarded\-For\fR\&. You can specify
\fIall\fR
to allow all proxies, or specify a list of IPs, possibly with masks\&. The default value is an empty list\&. This allows, if enabled, to be able to know the real IP of the request, for admin purpose, or security configuration (for example using
to allow all proxies, or specify a list of IPs, possibly with masks\&. The default value is an empty list\&. Using this option you can know the real IP of the request, for admin purpose, or security configuration (for example using
\fImod_fail2ban\fR)\&. IMPORTANT: The proxy MUST be configured to set the
\fIX\-Forwarded\-For\fR
header if you enable this option as, otherwise, the client can set it itself and as a result the IP value cannot be trusted for security rules in ejabberd\&.
.RE
.PP
\fBupdate_sql_schema\fR: \fItrue | false\fR
.RS 4
Allow ejabberd to update SQL schema\&. The default value is
\fItrue\fR\&.
.RE
.PP
\fBuse_cache\fR: \fItrue | false\fR
.RS 4
Enable or disable cache\&. The default is
@@ -1971,7 +2048,7 @@ ejabberdctl srg\-create g1 example\&.org "\*(AqGroup number 1\*(Aq" this_is_g1 g
.RE
.SS "mod_admin_update_sql"
.sp
This module can be used to update existing SQL database from the default to the new schema\&. Check the section Default and New Schemas for details\&. Please note that only PostgreSQL is supported\&. When the module is loaded use \fIupdate_sql\fR API\&.
This module can be used to update existing SQL database from the default to the new schema\&. Check the section Default and New Schemas for details\&. Please note that only MS SQL, MySQL, and PostgreSQL are supported\&. When the module is loaded use \fIupdate_sql\fR API\&.
.sp
The module has no options\&.
.SS "mod_announce"
@@ -2139,7 +2216,7 @@ Limit any given JID by the number of avatars it is able to convert per minute\&.
.RE
.SS "mod_block_strangers"
.sp
This module allows to block/log messages coming from an unknown entity\&. If a writing entity is not in your roster, you can let this module drop and/or log the message\&. By default you\(cqll just not receive message from that entity\&. Enable this module if you want to drop SPAM messages\&.
This module blocks and logs any messages coming from an unknown entity\&. If a writing entity is not in your roster, you can let this module drop and/or log the message\&. By default you\(cqll just not receive message from that entity\&. Enable this module if you want to drop SPAM messages\&.
.sp
.it 1 an-trap
.nr an-no-space-flag 1
@@ -2993,7 +3070,7 @@ List of accounts that are allowed to use this service\&. Default value:
\fBExamples:\fR
.RS 4
.sp
This example configuration will serve the files from the local directory \fI/var/www\fR in the address \fIhttp://example\&.org:5280/pub/archive/\fR\&. In this example a new content type \fIogg\fR is defined, \fIpng\fR is redefined, and \fIjpg\fR definition is deleted:
This example configuration will serve the files from the local directory \fI/var/www\fR in the address \fIhttp://example\&.org:5280/pub/content/\fR\&. In this example a new content type \fIogg\fR is defined, \fIpng\fR is redefined, and \fIjpg\fR definition is deleted:
.sp
.if n \{\
.RS 4
@@ -3006,7 +3083,7 @@ listen:
module: ejabberd_http
request_handlers:
\&.\&.\&.
/pub/archive: mod_http_fileserver
/pub/content: mod_http_fileserver
\&.\&.\&.
\&.\&.\&.
@@ -3498,6 +3575,96 @@ When this option is disabled, for each individual subscriber a separa mucsub mes
\fIfalse\fR\&.
.RE
.RE
.SS "mod_matrix_gw"
.sp
Matrix gateway\&.
.sp
This module is available since ejabberd 24\&.02\&.
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fBAvailable options:\fR
.RS 4
.PP
\fBhost\fR: \fIHost\fR
.RS 4
This option defines the Jabber IDs of the service\&. If the
\fIhost\fR
option is not specified, the Jabber ID will be the hostname of the virtual host with the prefix
\fI"matrix\&."\fR\&. The keyword
\fI@HOST@\fR
is replaced with the real virtual host name\&.
.RE
.PP
\fBkey\fR: \fIstring()\fR
.RS 4
Value of the matrix signing key, in base64\&.
.RE
.PP
\fBkey_name\fR: \fIstring()\fR
.RS 4
Name of the matrix signing key\&.
.RE
.PP
\fBmatrix_domain\fR: \fIDomain\fR
.RS 4
Specify a domain in the Matrix federation\&. The keyword
\fI@HOST@\fR
is replaced with the hostname\&. The default value is
\fI@HOST@\fR\&.
.RE
.PP
\fBmatrix_id_as_jid\fR: \fItrue | false\fR
.RS 4
If set to
\fIfalse\fR, all packets failing to be delivered via an XMPP server\-to\-server connection will then be routed to the Matrix gateway by translating a Jabber ID
\fIuser@matrixdomain\&.tld\fR
to a Matrix user identifier
\fI@user:matrixdomain\&.tld\fR\&. When set to
\fItrue\fR, messages must be explicitly sent to the matrix gateway service Jabber ID to be routed to a remote Matrix server\&. In this case, to send a message to Matrix user
\fI@user:matrixdomain\&.tld\fR, the client must send a message to the JID
\fIuser%\fR\fImatrixdomain\&.tld@matrix\&.myxmppdomain\fR\fI\&.tld\fR, where
\fImatrix\&.myxmppdomain\&.tld\fR
is the JID of the gateway service as set by the
\fIhost\fR
option\&. The default is
\fIfalse\fR\&.
.RE
.RE
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fBExample:\fR
.RS 4
.sp
.if n \{\
.RS 4
.\}
.nf
listen:
\-
port: 8448
module: ejabberd_http
tls: true
request_handlers:
"/_matrix": mod_matrix_gw
modules:
mod_matrix_gw:
key_name: "key1"
key: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
matrix_id_as_jid: true
.fi
.if n \{\
.RE
.\}
.RE
.SS "mod_metrics"
.sp
This module sends events to external backend (by now only grapherl is supported)\&. Supported events are:
@@ -3866,7 +4033,7 @@ or
\fIsubscribe\fR
or both, and
\fIauthentication\fR
section with username/password field or certfile pointing to client certifcate\&. Accepted urls can use schema mqtt, mqtts (mqtt with tls), mqtt5, mqtt5s (both to trigger v5 protocol), ws, wss, ws5, wss5\&. Certifcate authentication can be only used with mqtts, mqtt5s, wss, wss5\&.
section with username/password field or certfile pointing to client certificate\&. Accepted urls can use schema mqtt, mqtts (mqtt with tls), mqtt5, mqtt5s (both to trigger v5 protocol), ws, wss, ws5, wss5\&. Certificate authentication can be only used with mqtts, mqtt5s, wss, wss5\&.
.RE
.RE
.sp
@@ -3907,6 +4074,8 @@ This module provides support for XEP\-0045: Multi\-User Chat\&. Users can discov
.sp
The MUC service allows any Jabber ID to register a nickname, so nobody else can use that nickname in any room in the MUC service\&. To register a nickname, open the Service Discovery in your XMPP client and register in the MUC service\&.
.sp
It is also possible to register a nickname in a room, so nobody else can use that nickname in that room\&. If a nick is registered in the MUC service, that nick cannot be registered in any room, and vice versa: a nick that is registered in a room cannot be registered at the MUC service\&.
.sp
This module supports clustering and load balancing\&. One module can be started per cluster node\&. Rooms are distributed at creation time on all available MUC module instances\&. The multi\-user chat module is clustered but the rooms themselves are not clustered nor fault\-tolerant: if the node managing a set of rooms goes down, the rooms disappear and they will be recreated on an available node on first connection attempt\&.
.sp
.it 1 an-trap
@@ -3949,12 +4118,14 @@ To configure who is allowed to modify the
room option\&. The default value is
\fIall\fR, which means everyone is allowed to modify that option\&.
.RE
.sp
\fINote\fR about the next option: improved in 23\&.10:
.PP
\fBaccess_register\fR: \fIAccessName\fR
.RS 4
This option specifies who is allowed to register nickname within the Multi\-User Chat service\&. The default is
This option specifies who is allowed to register nickname within the Multi\-User Chat service and rooms\&. The default is
\fIall\fR
for backward compatibility, which means that any user is allowed to register any free nick\&.
for backward compatibility, which means that any user is allowed to register any free nick in the MUC service and in the rooms\&.
.RE
.sp
\fINote\fR about the next option: added in 22\&.05:
@@ -3976,7 +4147,7 @@ option, but applied to this module only\&.
.PP
\fBdefault_room_options\fR: \fIOptions\fR
.RS 4
This option allows to define the desired default room options\&. Note that the creator of a room can modify the options of his room at any time using an XMPP client with MUC capability\&. The
Define the default room options\&. Note that the creator of a room can modify the options of his room at any time using an XMPP client with MUC capability\&. The
\fIOptions\fR
are:
.PP
@@ -3986,12 +4157,6 @@ Allow occupants to change the subject\&. The default value is
\fItrue\fR\&.
.RE
.PP
\fBallow_private_messages\fR: \fItrue | false\fR
.RS 4
Occupants can send private messages to other occupants\&. The default value is
\fItrue\fR\&.
.RE
.PP
\fBallow_private_messages_from_visitors\fR: \fIanyone | moderators | nobody\fR
.RS 4
Visitors can send private messages to other occupants\&. The default value is
@@ -4036,6 +4201,12 @@ Allow visitors in a moderated room to request voice\&. The default value is
\fItrue\fR\&.
.RE
.PP
\fBallowpm\fR: \fIanyone | participants | moderators | none\fR
.RS 4
Who can send private messages\&. The default value is
\fIanyone\fR\&.
.RE
.PP
\fBanonymous\fR: \fItrue | false\fR
.RS 4
The room is anonymous: occupants don\(cqt see the real JIDs of other occupants\&. Note that the room moderators can always see the real JIDs of the occupants\&. The default value is
@@ -4558,7 +4729,7 @@ to a remote file\&. By default a predefined CSS will be embedded into the HTML p
.PP
\fBdirname\fR: \fIroom_jid | room_name\fR
.RS 4
Allows to configure the name of the room directory\&. If set to
Configure the name of the room directory\&. If set to
\fIroom_jid\fR, the room directory name will be the full room JID\&. Otherwise, the room directory name will be only the room name, not including the MUC service name\&. The default value is
\fIroom_jid\fR\&.
.RE
@@ -4652,6 +4823,43 @@ or a conference JID is appended to the
otherwise\&. There is no default value\&.
.RE
.RE
.SS "mod_muc_occupantid"
.sp
This module implements XEP\-0421: Anonymous unique occupant identifiers for MUCs\&.
.sp
When the module is enabled, the feature is enabled in all semi\-anonymous rooms\&.
.sp
This module is available since ejabberd 23\&.10\&.
.sp
The module has no options\&.
.SS "mod_muc_rtbl"
.sp
This module implement Real\-time blocklists for MUC rooms\&.
.sp
It works by observing remote pubsub node conforming with specification described in https://xmppbl\&.org/\&.
.sp
This module is available since ejabberd 23\&.04\&.
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
.ps +1
\fBAvailable options:\fR
.RS 4
.PP
\fBrtbl_node\fR: \fIPubsubNodeName\fR
.RS 4
Name of pubsub node that should be used to track blocked users\&. The default value is
\fImuc_bans_sha256\fR\&.
.RE
.PP
\fBrtbl_server\fR: \fIDomain\fR
.RS 4
Domain of xmpp server that serves block list\&. The default value is
\fIxmppbl\&.org\fR
.RE
.RE
.SS "mod_multicast"
.sp
This module implements a service for XEP\-0033: Extended Stanza Addressing\&.
@@ -4962,7 +5170,11 @@ This module implements support for XEP\-0199: XMPP Ping and periodic keepalives\
.PP
\fBping_ack_timeout\fR: \fItimeout()\fR
.RS 4
How long to wait before deeming that a client has not answered a given server ping request\&. The default value is
How long to wait before deeming that a client has not answered a given server ping request\&. NOTE: when
\fImod_stream_mgmt\fR
is loaded and stream management is enabled by a client, this value is ignored, and the
ack_timeout
applies instead\&. The default value is
\fIundefined\fR\&.
.RE
.PP
@@ -5146,6 +5358,8 @@ This module adds support for XEP\-0049: Private XML Storage\&.
.sp
Using this method, XMPP entities can store private data on the server, retrieve it whenever necessary and share it between multiple connected clients of the same user\&. The data stored might be anything, as long as it is a valid XML\&. One typical usage is storing a bookmark of all user\(cqs conferences (XEP\-0048: Bookmarks)\&.
.sp
It also implements the bookmark conversion described in XEP\-0402: PEP Native Bookmarks, see the command bookmarks_to_pep\&.
.sp
.it 1 an-trap
.nr an-no-space-flag 1
.nr an-break-flag 1
@@ -5599,7 +5813,7 @@ or
To specify whether or not pubsub should cache last items\&. Value is
\fItrue\fR
or
\fIfalse\fR\&. If not defined, pubsub does not cache last items\&. On systems with not so many nodes, caching last items speeds up pubsub and allows to raise user connection rate\&. The cost is memory usage, as every item is stored in memory\&.
\fIfalse\fR\&. If not defined, pubsub does not cache last items\&. On systems with not so many nodes, caching last items speeds up pubsub and allows you to raise the user connection rate\&. The cost is memory usage, as every item is stored in memory\&.
.RE
.sp
\fINote\fR about the next option: added in 21\&.12:
@@ -5680,7 +5894,7 @@ nodetree before\&.
.PP
\fBpep_mapping\fR: \fIList of Key:Value\fR
.RS 4
This allows to define a list of key\-value to choose defined node plugins on given PEP namespace\&. The following example will use
In this option you can provide a list of key\-value to choose defined node plugins on given PEP namespace\&. The following example will use
\fInode_tune\fR
instead of
\fInode_pep\fR
@@ -5733,7 +5947,7 @@ plugin handles the default behaviour and follows standard XEP\-0060 implementati
.IP \(bu 2.3
.\}
\fIpep\fR
plugin adds extension to handle Personal Eventing Protocol (XEP\-0163) to the PubSub engine\&. Adding pep allows to handle PEP automatically\&.
plugin adds extension to handle Personal Eventing Protocol (XEP\-0163) to the PubSub engine\&. When enabled, PEP is handled automatically\&.
.RE
.RE
.PP
@@ -5887,6 +6101,16 @@ If this option is set to
\fItrue\fR, the sender\(cqs JID is included with push notifications generated for incoming messages with a body\&. The default value is
\fIfalse\fR\&.
.RE
.sp
\fINote\fR about the next option: added in 23\&.10:
.PP
\fBnotify_on\fR: \fImessages | all\fR
.RS 4
If this option is set to
\fImessages\fR, notifications are generated only for actual chat messages with a body text (or some encrypted payload)\&. If it\(cqs set to
\fIall\fR, any kind of XMPP stanza will trigger a notification\&. If unsure, it\(cqs strongly recommended to stick to
\fIall\fR, which is the default value\&.
.RE
.PP
\fBuse_cache\fR: \fItrue | false\fR
.RS 4
@@ -5994,7 +6218,7 @@ on the requested username, registration of that user name is denied\&. There are
.RS 4
By default,
\fIejabberd\fR
doesn\(cqt allow to register new accounts from s2s or existing c2s sessions\&. You can change it by defining access rule in this option\&. Use with care: allowing registration from s2s leads to uncontrolled massive accounts creation by rogue users\&.
doesn\(cqt allow the client to register new accounts from s2s or existing c2s sessions\&. You can change it by defining access rule in this option\&. Use with care: allowing registration from s2s leads to uncontrolled massive accounts creation by rogue users\&.
.RE
.PP
\fBaccess_remove\fR: \fIAccessName\fR
@@ -6854,7 +7078,7 @@ It is not enough to just load this module\&. You should also configure listeners
.PP
\fBalways_record_route\fR: \fItrue | false\fR
.RS 4
Always insert "Record\-Route" header into SIP messages\&. This approach allows to bypass NATs/firewalls a bit more easily\&. The default value is
Always insert "Record\-Route" header into SIP messages\&. With this approach it is possible to bypass NATs/firewalls a bit more easily\&. The default value is
\fItrue\fR\&.
.RE
.PP
@@ -7697,13 +7921,13 @@ TODO
ProcessOne\&.
.SH "VERSION"
.sp
This document describes the configuration file of ejabberd 23\&.01\&. Configuration options of other ejabberd versions may differ significantly\&.
This document describes the configuration file of ejabberd 24\&.02\&. Configuration options of other ejabberd versions may differ significantly\&.
.SH "REPORTING BUGS"
.sp
Report bugs to https://github\&.com/processone/ejabberd/issues
.SH "SEE ALSO"
.sp
Default configuration file: https://github\&.com/processone/ejabberd/blob/23\&.01/ejabberd\&.yml\&.example
Default configuration file: https://github\&.com/processone/ejabberd/blob/24\&.02/ejabberd\&.yml\&.example
.sp
Main site: https://ejabberd\&.im
.sp
@@ -7714,4 +7938,4 @@ Configuration Guide: https://docs\&.ejabberd\&.im/admin/configuration
Source code: https://github\&.com/processone/ejabberd
.SH "COPYING"
.sp
Copyright (c) 2002\-2023 ProcessOne\&.
Copyright (c) 2002\-2024 ProcessOne\&.
+91 -40
View File
@@ -3,12 +3,13 @@ defmodule Ejabberd.MixProject do
def project do
[app: :ejabberd,
source_url: "https://github.com/processone/ejabberd",
version: version(),
description: description(),
elixir: elixir_required_version(),
elixirc_paths: ["lib"],
compile_path: ".",
compilers: [:asn1] ++ Mix.compilers,
compilers: [:asn1, :yecc] ++ Mix.compilers(),
erlc_options: erlc_options(),
erlc_paths: ["asn1", "src"],
# Elixir tests are starting the part of ejabberd they need
@@ -17,17 +18,18 @@ defmodule Ejabberd.MixProject do
language: :erlang,
releases: releases(),
package: package(),
docs: docs(),
deps: deps()]
end
def version do
case config(:vsn) do
:false -> "0.0.0" # ./configure wasn't run: vars.config not created
'0.0' -> "0.0.0" # the full git repository wasn't downloaded
'latest.0' -> "0.0.0" # running 'docker-ejabberd/ecs/build.sh latest'
~c"0.0" -> "0.0.0" # the full git repository wasn't downloaded
~c"latest.0" -> "0.0.0" # running 'docker-ejabberd/ecs/build.sh latest'
[_, _, ?., _, _] = x ->
head = String.replace(:erlang.list_to_binary(x), ~r/\.0+([0-9])/, ".\\1")
<<head::binary, ".0">>
"#{head}.0"
vsn -> String.replace(:erlang.list_to_binary(vsn), ~r/\.0+([0-9])/, ".\\1")
end
end
@@ -40,14 +42,14 @@ defmodule Ejabberd.MixProject do
def application do
[mod: {:ejabberd_app, []},
extra_applications: [:mix],
applications: [:idna, :inets, :kernel, :sasl, :ssl, :stdlib,
applications: [:idna, :inets, :kernel, :sasl, :ssl, :stdlib, :mix,
:base64url, :fast_tls, :fast_xml, :fast_yaml, :jiffy, :jose,
:p1_utils, :stringprep, :syntax_tools, :yconf],
:p1_utils, :stringprep, :syntax_tools, :yconf]
++ cond_apps(),
included_applications: [:mnesia, :os_mon,
:cache_tab, :eimp, :mqtree, :p1_acme,
:p1_oauth2, :pkix, :xmpp]
++ cond_apps()]
++ cond_included_apps()]
end
defp if_version_above(ver, okResult) do
@@ -68,20 +70,22 @@ defmodule Ejabberd.MixProject do
defp erlc_options do
# Use our own includes + includes from all dependencies
includes = ["include"] ++ deps_include(["fast_xml", "xmpp", "p1_utils"])
includes = ["include", deps_include()]
result = [{:d, :ELIXIR_ENABLED}] ++
cond_options() ++
Enum.map(includes, fn (path) -> {:i, path} end) ++
if_version_above('20', [{:d, :DEPRECATED_GET_STACKTRACE}]) ++
if_version_above('20', [{:d, :HAVE_URI_STRING}]) ++
if_version_above('20', [{:d, :HAVE_ERL_ERROR}]) ++
if_version_below('21', [{:d, :USE_OLD_HTTP_URI}]) ++
if_version_below('22', [{:d, :LAGER}]) ++
if_version_below('21', [{:d, :NO_CUSTOMIZE_HOSTNAME_CHECK}]) ++
if_version_below('23', [{:d, :USE_OLD_CRYPTO_HMAC}]) ++
if_version_below('23', [{:d, :USE_OLD_PG2}]) ++
if_version_below('24', [{:d, :COMPILER_REPORTS_ONLY_LINES}]) ++
if_version_below('24', [{:d, :SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL}])
if_version_above(~c"20", [{:d, :DEPRECATED_GET_STACKTRACE}]) ++
if_version_above(~c"20", [{:d, :HAVE_URI_STRING}]) ++
if_version_above(~c"20", [{:d, :HAVE_ERL_ERROR}]) ++
if_version_below(~c"21", [{:d, :USE_OLD_HTTP_URI}]) ++
if_version_below(~c"22", [{:d, :LAGER}]) ++
if_version_below(~c"21", [{:d, :NO_CUSTOMIZE_HOSTNAME_CHECK}]) ++
if_version_below(~c"23", [{:d, :USE_OLD_CRYPTO_HMAC}]) ++
if_version_below(~c"23", [{:d, :USE_OLD_PG2}]) ++
if_version_below(~c"24", [{:d, :COMPILER_REPORTS_ONLY_LINES}]) ++
if_version_below(~c"24", [{:d, :SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL}]) ++
if_version_below(~c"24", [{:d, :OTP_BELOW_24}]) ++
if_version_below(~c"25", [{:d, :OTP_BELOW_25}])
defines = for {:d, value} <- result, do: {:d, value}
result ++ [{:d, :ALL_DEFS, defines}]
end
@@ -101,9 +105,9 @@ defmodule Ejabberd.MixProject do
[{:base64url, "~> 1.0"},
{:cache_tab, "~> 1.0"},
{:eimp, "~> 1.0"},
{:ex_doc, ">= 0.0.0", only: :dev},
{:fast_tls, "~> 1.1"},
{:fast_xml, "~> 1.1"},
{:ex_doc, "~> 0.31", only: [:dev, :edoc], runtime: false},
{:fast_tls, ">= 1.1.18"},
{:fast_xml, ">= 1.1.51"},
{:fast_yaml, "~> 1.0"},
{:idna, "~> 6.0"},
{:jiffy, "~> 1.1.1"},
@@ -114,13 +118,13 @@ defmodule Ejabberd.MixProject do
{:p1_utils, "~> 1.0"},
{:pkix, "~> 1.0"},
{:stringprep, ">= 1.0.26"},
{:xmpp, ">= 1.6.0"},
{:xmpp, ">= 1.8.0"},
{:yconf, "~> 1.0"}]
++ cond_deps()
end
defp deps_include(deps) do
base = if Mix.Project.umbrella?() do
defp deps_include() do
if Mix.Project.umbrella?() do
"../../deps"
else
case Mix.Project.deps_paths()[:ejabberd] do
@@ -128,17 +132,21 @@ defmodule Ejabberd.MixProject do
_ -> ".."
end
end
Enum.map(deps, fn dep -> base<>"/#{dep}/include" end)
end
defp cond_deps do
for {:true, dep} <- [{config(:pam), {:epam, "~> 1.0"}},
{Mix.env() == :translations,
{:ejabberd_po, git: "https://github.com/processone/ejabberd-po.git"}},
{config(:redis), {:eredis, "~> 1.2.0"}},
{config(:sip), {:esip, "~> 1.0"}},
{config(:zlib), {:ezlib, "~> 1.0"}},
{if_version_below('22', true), {:lager, "~> 3.9.1"}},
{config(:lua), {:luerl, "~> 1.0"}},
{config(:mysql), {:p1_mysql, "~> 1.0.20"}},
{if_version_below(~c"22", true), {:lager, "~> 3.9.1"}},
{config(:lua) and if_version_below(~c"27", true),
{:luerl, "~> 1.1.1"}},
{config(:lua) and if_version_above(~c"26", true),
{:luerl, git: "https://github.com/processone/luerl", branch: "otp27"}},
{config(:mysql), {:p1_mysql, ">= 1.0.23" }},
{config(:pgsql), {:p1_pgsql, "~> 1.1"}},
{config(:sqlite), {:sqlite3, "~> 1.1"}},
{config(:stun), {:stun, "~> 1.0"}}], do:
@@ -146,10 +154,17 @@ defmodule Ejabberd.MixProject do
end
defp cond_apps do
for {:true, app} <- [{config(:stun), :stun},
{config(:tools), :observer}], do:
app
end
defp cond_included_apps do
for {:true, app} <- [{config(:pam), :epam},
{config(:lua), :luerl},
{config(:redis), :eredis},
{if_version_below('22', true), :lager},
{Mix.env() == :edoc, :ex_doc},
{if_version_below(~c"22", true), :lager},
{config(:mysql), :p1_mysql},
{config(:sip), :esip},
{config(:odbc), :odbc},
@@ -172,9 +187,19 @@ defmodule Ejabberd.MixProject do
end
defp vars do
case :file.consult("vars.config") do
filepath = case Application.fetch_env(:ejabberd, :vars_config_path) do
:error ->
"vars.config"
{:ok, path} ->
path
end
config2 = case :file.consult(filepath) do
{:ok,config} -> config
_ -> [zlib: true]
_ -> [stun: true, zlib: true]
end
case Mix.env() do
:dev -> List.keystore(config2, :tools, 0, {:tools, true})
_ -> config2
end
end
@@ -203,7 +228,7 @@ defmodule Ejabberd.MixProject do
_ -> :ok
end
case Version.match?(System.version(), "< 1.11.4")
and :erlang.system_info(:otp_release) > '23' do
and :erlang.system_info(:otp_release) > ~c"23" do
true ->
IO.puts("ERROR: To build releases with Elixir lower than 1.11.4, Erlang/OTP lower than 24 is required.")
_ -> :ok
@@ -239,6 +264,8 @@ defmodule Ejabberd.MixProject do
config_dir: config(:config_dir),
logs_dir: config(:logs_dir),
spool_dir: config(:spool_dir),
vsn: config(:vsn),
iexpath: config(:iexpath),
erl: config(:erl),
epmd: config(:epmd),
bindir: Path.join([config(:release_dir), "releases", version()]),
@@ -253,14 +280,14 @@ defmodule Ejabberd.MixProject do
execute = fn(command) ->
case function_exported?(System, :shell, 1) do
true ->
System.shell(command)
System.shell(command, into: IO.stream())
false ->
:os.cmd(to_charlist(command))
end
end
# Mix/Elixir lower than 1.11.0 use config/releases.exs instead of runtime.exs
case Version.match?(System.version, "~> 1.11") do
case Version.match?(System.version(), "~> 1.11") do
true ->
:ok
false ->
@@ -271,8 +298,7 @@ defmodule Ejabberd.MixProject do
Mix.Generator.copy_template("ejabberdctl.example1", "ejabberdctl.example2", assigns)
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2> ejabberdctl.example2a")
Mix.Generator.copy_template("ejabberdctl.example2a", "ejabberdctl.example2b", assigns)
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2b > ejabberdctl.example3")
execute.("sed -e 's|^ERLANG_NODE=ejabberd@localhost|ERLANG_NODE=ejabberd|g' ejabberdctl.example3 > ejabberdctl.example4")
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2b > ejabberdctl.example4")
execute.("sed -e 's|^ERLANG_OPTS=\"|ERLANG_OPTS=\"-boot ../releases/#{release.version}/start_clean -boot_var RELEASE_LIB ../lib |' ejabberdctl.example4 > ejabberdctl.example5")
execute.("sed -e 's|^INSTALLUSER=|ERL_OPTIONS=\"-setcookie \\$\\(cat \"\\${SCRIPT_DIR%/*}/releases/COOKIE\")\"\\nINSTALLUSER=|g' ejabberdctl.example5 > ejabberdctl.example6")
Mix.Generator.copy_template("ejabberdctl.example6", "#{ro}/bin/ejabberdctl", assigns)
@@ -320,13 +346,38 @@ defmodule Ejabberd.MixProject do
end
case Mix.env() do
:dev -> execute.("REL_DIR_TEMP=$PWD/rel/overlays/ rel/setup-dev.sh")
:dev -> execute.("REL_DIR_TEMP=$PWD/rel/overlays/ rel/setup-dev.sh mix")
_ -> :ok
end
release
end
defp docs do
[
main: "readme",
logo: "_build/edoc/logo.png",
source_ref: "master",
extra_section: "", # No need for Pages section name, it's the only one
api_reference: false, # API section has just Elixir, hide it
filter_modules: "aaaaa", # Module section has just Elixir modules, hide them
extras: [
"README.md": [title: "Readme"],
"COMPILE.md": [title: "Compile and Install"],
"CONTAINER.md": [title: "Container Image"],
"CONTRIBUTING.md": [title: "Contributing"],
"CONTRIBUTORS.md": [title: "Contributors"],
"CODE_OF_CONDUCT.md": [title: "Code of Conduct"],
"CHANGELOG.md": [title: "ChangeLog"],
"COPYING": [title: "Copying License"],
"_build/edoc/docs.md": [title: "&xrArr; ejabberd Docs"]
],
groups_for_extras: [
"": Path.wildcard("*.md") ++ ["COPYING"],
"For more documentation": "_build/edoc/docs.md"
]
]
end
end
defmodule Mix.Tasks.Compile.Asn1 do
@@ -339,7 +390,7 @@ defmodule Mix.Tasks.Compile.Asn1 do
def run(args) do
{opts, _, _} = OptionParser.parse(args, switches: [force: :boolean])
project = Mix.Project.config
project = Mix.Project.config()
source_paths = project[:asn1_paths] || ["asn1"]
dest_paths = project[:asn1_target] || ["src"]
mappings = Enum.zip(source_paths, dest_paths)
@@ -361,7 +412,7 @@ defmodule Mix.Tasks.Compile.Asn1 do
end
def manifests, do: [manifest()]
defp manifest, do: Path.join(Mix.Project.manifest_path, @manifest)
defp manifest, do: Path.join(Mix.Project.manifest_path(), @manifest)
def clean, do: Erlang.clean(manifest())
end
+17 -17
View File
@@ -1,35 +1,35 @@
%{
"base64url": {:hex, :base64url, "1.0.1", "f8c7f2da04ca9a5d0f5f50258f055e1d699f0e8bf4cfdb30b750865368403cf6", [:rebar3], [], "hexpm", "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c"},
"cache_tab": {:hex, :cache_tab, "1.0.30", "6d35eecfb65fbe5fc85988503a27338d32de01243f3fc8ea3ee7161af08725a4", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "6d8a5e00d8f84c42627706a6dbedb02e34d58495f3ed61935c8475ca0531cda0"},
"earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"},
"earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"},
"eimp": {:hex, :eimp, "1.0.22", "fa9b376ef0b50e8455db15c7c11dea4522c6902e04412288aab436d26335f6eb", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "b3b9ffb1d9a5f4a2ba88ac418a819164932d9a9d3a2fc3d32ca338ce855c4392"},
"epam": {:hex, :epam, "1.0.12", "2a5625d4133bca4b3943791a3f723ba764455a461ae9b6ba5debb262efcf4b40", [:rebar3], [], "hexpm", "54c166c4459cef72f2990a3d89a8f0be27180fe0ab0f24b28ddcc3b815f49f7f"},
"epam": {:hex, :epam, "1.0.14", "aa0b85d27f4ef3a756ae995179df952a0721237e83c6b79d644347b75016681a", [:rebar3], [], "hexpm", "2f3449e72885a72a6c2a843f561add0fc2f70d7a21f61456930a547473d4d989"},
"eredis": {:hex, :eredis, "1.2.0", "0b8e9cfc2c00fa1374cd107ea63b49be08d933df2cf175e6a89b73dd9c380de4", [:rebar3], [], "hexpm", "d9b5abef2c2c8aba8f32aa018203e0b3dc8b1157773b254ab1d4c2002317f1e1"},
"esip": {:hex, :esip, "1.0.49", "7949c288d1e094cb44bff5499231939e34c2ace06de8bef950a341edb1743357", [:rebar3], [{:fast_tls, "1.1.16", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.7", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "a1379ced50c3a2a8f82a77b3184e94c3b87782e90e5ddc0d2baf5b654ecfaa11"},
"ex_doc": {:hex, :ex_doc, "0.29.1", "b1c652fa5f92ee9cf15c75271168027f92039b3877094290a75abcaac82a9f77", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "b7745fa6374a36daf484e2a2012274950e084815b936b1319aeebcf7809574f6"},
"esip": {:hex, :esip, "1.0.52", "a2840287c493a4280e6fba57a257706843b025c315875e38b03fd07190e22dba", [:rebar3], [{:fast_tls, "1.1.19", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.12", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "6f00165395900500aa262ce0297162d93931c78c1464d89fd0edc6e3d6bc011f"},
"ex_doc": {:hex, :ex_doc, "0.31.1", "8a2355ac42b1cc7b2379da9e40243f2670143721dd50748bf6c3b1184dae2089", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3178c3a407c557d8343479e1ff117a96fd31bafe52a039079593fb0524ef61b0"},
"ezlib": {:hex, :ezlib, "1.0.12", "ffe906ba10d03aaee7977e1e0e81d9ffc3bb8b47fb9cd8e2e453507a2e56221f", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "30e94355fb42260aab6e12582cb0c56bf233515e655c8aeaf48760e7561e4ebb"},
"fast_tls": {:hex, :fast_tls, "1.1.16", "85fa7f3112ea4ff5ccb4f3abadc130a8c855ad74eb00869487399cb0c322d208", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "aa08cca89b4044e74f1f12e399817d8beaeae3ee006c98a893c0bfb1d81fba51"},
"fast_xml": {:hex, :fast_xml, "1.1.49", "67d9bfcadd04efd930e0ee1412b5ea09d3e791f1fdbd4d3e9a8c8f29f8bfed8c", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "01da064d2f740818956961036637fee2475c17bf8aab9442217f90dc77883593"},
"fast_tls": {:hex, :fast_tls, "1.1.19", "f52731a4b35259fa06cf23e2a0732920ad9efce7c3d68377f129a474998747bb", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "db34322c8782d4c5139ccb80709d8ec8c38089b44262edd0c2f660ac495bd389"},
"fast_xml": {:hex, :fast_xml, "1.1.51", "a7f8c6942591632309099386d5c339c89997ac2bbdd1216f6c196dee6d7828a9", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "7fce41b7d1a4ba438a2d7a088dabe74a3ca0739f1af2abcb77e62daf43e0409a"},
"fast_yaml": {:hex, :fast_yaml, "1.0.36", "65413a34a570fd4e205a460ba602e4ee7a682f35c22d2e1c839025dbf515105c", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "1abe8f758fc2a86b08edff80bbc687cfd41ebc1412cfec0ef4a0acfcd032052f"},
"idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"},
"jiffy": {:hex, :jiffy, "1.1.1", "aca10f47aa91697bf24ab9582c74e00e8e95474c7ef9f76d4f1a338d0f5de21b", [:rebar3], [], "hexpm", "62e1f0581c3c19c33a725c781dfa88410d8bff1bbafc3885a2552286b4785c4c"},
"jose": {:hex, :jose, "1.11.5", "3bc2d75ffa5e2c941ca93e5696b54978323191988eb8d225c2e663ddfefd515e", [:mix, :rebar3], [], "hexpm", "dcd3b215bafe02ea7c5b23dafd3eb8062a5cd8f2d904fd9caa323d37034ab384"},
"luerl": {:hex, :luerl, "1.0.0", "1b68c30649323590d5339b967b419260500ffe520cd3abc1987482a82d3b5a6c", [:rebar3], [], "hexpm", "c17bc45cb4b0845ec975387f9a5d8c81ab60456698527a29c96f78992af86bd1"},
"makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"},
"makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"},
"makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
"mqtree": {:hex, :mqtree, "1.0.15", "bc54d8b88698fdaebc1e27a9ac43688b927e3dbc05bd5cee4057e69a89a8cf17", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "294ac43c9b3d372e24eeea56c259e19c655522dcff64a55c401a639663b9d829"},
"nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"},
"luerl": {:hex, :luerl, "1.1.1", "083518e437586f6631150d39c4bff242ed2ec80cb14a3299a0c2628f07a2ff7f", [:rebar3], [], "hexpm", "e17ef246a7ff876ec90e68792a39708979416004d4eacfe8a7643206b9470773"},
"makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"},
"makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [: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", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"},
"makeup_erlang": {:hex, :makeup_erlang, "0.1.4", "29563475afa9b8a2add1b7a9c8fb68d06ca7737648f28398e04461f008b69521", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f4ed47ecda66de70dd817698a703f8816daa91272e7e45812469498614ae8b29"},
"mqtree": {:hex, :mqtree, "1.0.16", "f8f8b4971e4ca94313ba9bcaaa1aa1077daaba5e3fd3468ffb491420a4cc3593", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "c87d1c95575db65af29b795c9daa3bed43f5c1bf84072a74469659bcf53594eb"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
"p1_acme": {:hex, :p1_acme, "1.0.22", "b40a8031ef0f4592e97e6a8e08e53dbd31a2198cb8377b249f0caea4f8025a1d", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.5", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.15", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "c2b25a7b295a435dac4f278a73d8417ff2b0020c45e1683504e8692ef03e2057"},
"p1_mysql": {:hex, :p1_mysql, "1.0.21", "5972add935e7b1b03d981fa88a0d01e96de357443eaf96ca2fb62e465a717f47", [:rebar3], [], "hexpm", "16f197adb99dab034139c429b256d65948a4057d3e4d553adbe5ce3236c4aabf"},
"p1_oauth2": {:hex, :p1_oauth2, "0.6.11", "96b4e85c08355720523c2f892011a81a07994d15c179ce4dd82d704fecad15b2", [:rebar3], [], "hexpm", "9c3c6ae59382b9525473bb02a32949889808f33f95f6db10594fd92acd1f63db"},
"p1_pgsql": {:hex, :p1_pgsql, "1.1.20", "0231de1a427a561afbea89212a61d2409f1a42696eeca16d0085305aee07717a", [:rebar3], [{:xmpp, "1.6.1", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "240b40fb3fd7e330fdf1d0beff2db0cb090ae5a6eef08a0a157ebb7251ff361c"},
"p1_mysql": {:hex, :p1_mysql, "1.0.23", "9b4e98f1f01e2cc4a759f611f0f015365e65c5f61ea453aa4bdfe950d20a5f11", [:rebar3], [], "hexpm", "9cef98265fb287374e7b64bf4022c4df5ec66196ca31cf4bed73c67c45bf824e"},
"p1_oauth2": {:hex, :p1_oauth2, "0.6.14", "1c5f82535574de87e2059695ac4b91f8f9aebacbc1c80287dae6f02552d47aea", [:rebar3], [], "hexpm", "1fd3ac474e43722d9d5a87c6df8d36f698ed87af7bb81cbbb66361451d99ae8f"},
"p1_pgsql": {:hex, :p1_pgsql, "1.1.25", "f59b7faa457fadf0c2713ac335202f41ca1b06b7c4926925b3cb0bc6f0578601", [:rebar3], [{:xmpp, "1.8.1", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "b654c1e07d3e775b626b407e7696cacfd88d17be83e7168b9d89c3832d913de7"},
"p1_utils": {:hex, :p1_utils, "1.0.25", "2d39b5015a567bbd2cc7033eeb93a7c60d8c84efe1ef69a3473faa07fa268187", [:rebar3], [], "hexpm", "9219214428f2c6e5d3187ff8eb9a8783695c2427420be9a259840e07ada32847"},
"pkix": {:hex, :pkix, "1.0.9", "eb20b2715d71a23b4fe7e754dae9281a964b51113d0bba8adf9da72bf9d65ac2", [:rebar3], [], "hexpm", "daab2c09cdd4eda05c9b45a5c00e994a1a5f27634929e1377e2e59b707103e3a"},
"sqlite3": {:hex, :sqlite3, "1.1.14", "f9ea0cff8540865fdfdb7e24eef34dc46677364b1c070896e99b5bf08c8a7fd7", [:rebar3], [], "hexpm", "85054b6ca297343c159ed6794a473ff2c8eeabd854b6fe02f711c0bfd373ce86"},
"stringprep": {:hex, :stringprep, "1.0.29", "02f23e8c3a219a3dfe40a22e908bece3a2f68af0ff599ea8a7b714ecb21e62ee", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "928eba304c3006eb1512110ebd7b87db163b00859a09375a1e4466152c6c462a"},
"stun": {:hex, :stun, "1.2.7", "d6bdcf0aa72c927fbe8b779fc4ef1f3916c5450b2ff136c800a7a0361fb1ddff", [:rebar3], [{:fast_tls, "1.1.16", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "3fb1f07aaa630b2276e83d267557d1ceb3d2ce52d1145de71864160210655852"},
"stun": {:hex, :stun, "1.2.12", "a65df67a8aaaecb6a94d687977b2e9f161820819910cb97bbe26a3525356525b", [:rebar3], [{:fast_tls, "1.1.19", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "a2055032b6d338d0454142004bcb12fafb0c64ab1f273f1d0c6923ebbc8ede40"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"},
"xmpp": {:hex, :xmpp, "1.6.1", "4075de3c1bb63c7838dc6c8d06167ffba2e39fd285e2a295287f26c1d8f64707", [:rebar3], [{:ezlib, "1.0.12", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.16", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.49", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "6.0.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", "87fee84f805a151f4d85c1c11c16a738716dfaae353cb88898c0254f05df81c0"},
"xmpp": {:hex, :xmpp, "1.8.1", "134a350dbc6e2e99512fb38669191c1d1c134b3b6836f4c6740801882afa650a", [: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.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", "32d4a308a6613e4e4155fa4e82eccdc8833096d0fa8d99c8d428c800611e59d3"},
"yconf": {:hex, :yconf, "1.0.15", "e22998b3d7728270bdd06162a9515bd142b14fae8927cbdbd3ef639c32aa6f7a", [:rebar3], [{:fast_yaml, "1.0.36", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "7ff2ab24d3c9833842716b9aaaa01a8f96641a7695cbb701b03445c4def01117"},
}
+669
View File
@@ -0,0 +1,669 @@
%% 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 Jabber ID","Добави Jabber ID"}.
{"Add New","Добави нов"}.
{"Add User","Добави потребител"}.
{"Administration of ","Администриране на "}.
{"Administration","Администриране"}.
{"Administrator privileges required","Изискватт се администраторски права"}.
{"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 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 отличително име според специфично за изпълнението/внедряването определение на група."}.
{"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","Всеки може да асоциира \"leaf\" нодове с колекцията"}.
{"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","Всеки"}.
{"Apparently your account has no administration rights in this server. Please check how to grant admin rights in: https://docs.ejabberd.im/admin/installation/#administration-account","Очевидно Вашият акаунт няма административни права за този сървър. Моля, проверете как да предоставите администраторски права на: https://docs.ejabberd.im/admin/installation/#administration-account"}.
{"April","Април"}.
{"Attribute 'channel' is required for this request","Атрибутът 'канал' е задължителен за тази заявка"}.
{"Attribute 'id' is mandatory for MIX messages","Атрибутът 'id' е задължителен за MIX съобщения"}.
{"Attribute 'jid' is not allowed here","Атрибутът 'jid' не е разрешен тук"}.
{"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","Bytestream вече е активиран"}.
{"Cannot remove active list","Активният списък не може да бъде премахнат"}.
{"Cannot remove default list","Не можете да премахнете списъка по подразбиране"}.
{"CAPTCHA web page","CAPTCHA уеб страница"}.
{"Challenge ID","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","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","Конфигурация"}.
{"Connected Resources:","Свързани ресурси:"}.
{"Contact Addresses (normally, room owner or owners)","Адреси за контакт (обикновено собственик или собственици на стая)"}.
{"Contrib Modules","Сътруднически модули"}.
{"Country","Държава"}.
{"CPU Time:","Процесорно време:"}.
{"Current Discussion Topic","Текуща тема на дискусита"}.
{"Database failure","Грешка в базата данни"}.
{"Database Tables at ~p","Таблици на базата данни при ~p"}.
{"Database Tables Configuration at ","Конфигурация на таблиците в базата данни при "}.
{"Database","База данни"}.
{"December","Декември"}.
{"Default users as participants","Потребители по подразбиране като участници"}.
{"Delete content","Изтрий съдържанието"}.
{"Delete message of the day on all hosts","Изтрий съобщението на деня от всички нодове"}.
{"Delete message of the day","Изтрий съобщението на деня"}.
{"Delete Selected","Изтрий избраните"}.
{"Delete table","Изтрий таблицата"}.
{"Delete User","Изтрий потребителя"}.
{"Deliver event notifications","Достави известията за събития"}.
{"Deliver payloads with event notifications","Достави прикачените обекти с известията за събития"}.
{"Description:","Описание:"}.
{"Disc only copy","Копие само на диска"}.
{"'Displayed groups' not added (they do not exist!): ","'Показаните групи' не са добавени (не съществуват!): "}.
{"Displayed:","Показва се:"}.
{"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","Динамично задаване на отговор към публикувалия елемента"}.
{"Edit Properties","Редактиране на свойства"}.
{"Either approve or decline the voice request.","Одобрете или отхвърлете заявката за гласова връзка."}.
{"ejabberd vCard module","ejabberd vCard модул"}.
{"ejabberd Web Admin","Уеб администрация на ejabberd"}.
{"ejabberd","ejabberd"}.
{"Elements","Елементи"}.
{"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","Въведете пътя към jabberd14 spool файла"}.
{"Enter path to text file","Въведете пътя към текстовия файл"}.
{"Enter the text you see","Въведете текста, който виждате"}.
{"Erlang XMPP Server","Erlang XMPP сървър"}.
{"Error","Грешка"}.
{"Exclude Jabber IDs from CAPTCHA challenge","Изключи CAPTCHA предизвикателство за следните 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","Неуспешно активиране на 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","Въвеждане на ЧЗВ"}.
{"February","Февруари"}.
{"File larger than ~w bytes","Файлът е по-голям от ~w байта"}.
{"Fill in the form to search for any matching XMPP User","Попълнете формата, за да търсите съвпадащ XMPP потребител"}.
{"Friday","Петък"}.
{"From ~ts","От ~ts"}.
{"From","От"}.
{"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 Password","Покажи паролата на потребителя"}.
{"Get User Statistics","Покажи статистика за потребителя"}.
{"Given Name","Име"}.
{"Grant voice to this person?","Предоставяне на глас за потребителя?"}.
{"Groups that will be displayed to the members","Групи, които ще се показват на членовете"}.
{"Groups","Групи"}.
{"Group","Група"}.
{"Hat title","Заглавие на шапката"}.
{"Hat URI","URI адрес за шапка"}.
{"Hats limit exceeded","Превишен е лимитът за шапка"}.
{"Host unknown","Неизвестен хост"}.
{"Host","Хост"}.
{"HTTP File Upload","Качване на файл по HTTP"}.
{"Idle connection","Неактивна връзка"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Ако не виждате CAPTCHA изображението, посетете уеб страницата."}.
{"Import Directory","Импорт на директория"}.
{"Import File","Импорт на файл"}.
{"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 From jabberd14 Spool Files","Импорт на потребители от jabberd14 Spool файлове"}.
{"Improper domain part of 'from' attribute","Неправилна част за домейн в атрибута 'from'"}.
{"Improper message type","Неправилен тип съобщение"}.
{"Incoming s2s Connections:","Входящи s2s връзки:"}.
{"Incorrect CAPTCHA submit","Неправилно CAPTCHA въвеждане"}.
{"Incorrect data form","Неправилна форма на данните"}.
{"Incorrect password","Грешна парола"}.
{"Incorrect value of 'action' attribute","Неправилна стойност на атрибута 'action'"}.
{"Incorrect value of 'action' in data form","Неправилна стойност на 'action' във формата за данни"}.
{"Incorrect value of 'path' in data form","Неправилна стойност на 'path' във формата за данни"}.
{"Installed Modules:","Инсталирани модули:"}.
{"Install","Инсталирай"}.
{"Insufficient privilege","Недостатъчни права"}.
{"Internal server error","Вътрешна сървърна грешка"}.
{"Invalid 'from' attribute in forwarded message","Невалиден атрибут 'from' в препратеното съобщение"}.
{"Invalid node name","Невалидно име на нода"}.
{"Invalid 'previd' value","Невалидна стойност на 'previd'"}.
{"Invitations are not allowed in this conference","Поканите не са разрешени в тази конференция"}.
{"IP addresses","IP адреси"}.
{"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","Jabber ID"}.
{"January","Януари"}.
{"JID normalization denied by service policy","Политиката на услугата не допуска нормализирането на JID"}.
{"JID normalization failed","Нормализирането на JID е неуспешно"}.
{"Joined MIX channels of ~ts","Свързани MIX канали на ~ts"}.
{"Joined MIX channels:","Свързани MIX канали:"}.
{"July","Юли"}.
{"June","Юни"}.
{"Just created","Току що създаден"}.
{"Label:","Етикет:"}.
{"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 хеш на текст трябва да са равни на шестнайсетичния етикет"}.
{"List of rooms","Списък на стаите"}.
{"List of users with hats","Списък на потребителите с шапки"}.
{"List users with hats","Избройте потребителите с шапки"}.
{"Logging","Регистриране на събития"}.
{"Low level update script","Скрипт за актуализация на ниско ниво"}.
{"Make participants list public","Направи списъка с участниците публичен"}.
{"Make room CAPTCHA protected","Защити стаята с CAPTCHA"}.
{"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` за неспецифичен лимит, различен от наложения от сървъра максимум"}.
{"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","Май"}.
{"Members not added (inexistent vhost!): ","Членовете не са добавени (несъществуващ vhost!): "}.
{"Membership is required to enter this room","Изисква се членство, за вход в тази стая"}.
{"Members:","Членове:"}.
{"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 няма автоматичен начин за възстановяване на паролата в случай, че я забравите."}.
{"Memory","Памет"}.
{"Mere Availability in XMPP (No Show Value)","Наличност в XMPP (Не показвай стойност)"}.
{"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","Модератор"}.
{"Modified modules","Модифицирани модули"}.
{"Module failed to handle the query","Модулът не успя да обработи заявката"}.
{"Monday","Понеделник"}.
{"Multicast","Мултикаст"}.
{"Multiple <item/> elements are not allowed by RFC6121","Повече от един <item/> елемента не се разрешават от RFC6121"}.
{"Multi-User Chat","Групов чат (MUC)"}.
{"Name in the rosters where this group will be displayed","Име в списъците с контакти, където ще се показва тази група"}.
{"Name","Име"}.
{"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","Псевдоним"}.
{"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 <forwarded/> element found","Елементът <forwarded/> не е намерен"}.
{"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 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 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","ID на нода"}.
{"Node index not found","Индексът на нода не е намерен"}.
{"Node not found","Нодът не е намерен"}.
{"Node ~p","Нод ~p"}.
{"Nodeprep has failed","Nodeprep е неуспешен"}.
{"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","Брой секунди, след които автоматично да се изчистят елементите, или `max` за липса на конкретно ограничение, различно от наложения от сървъра максимум"}.
{"Occupants are allowed to invite others","На участниците е позволено да канят други"}.
{"Occupants are allowed to query others","Участниците могат да отправят заявки към други лица"}.
{"Occupants May Change the Subject","Участниците могат да променят темата"}.
{"October","Октомври"}.
{"Offline Messages","Офлайн съобщения"}.
{"Offline Messages:","Офлайн съобщения:"}.
{"OK","ДОБРЕ"}.
{"Old Password:","Стара парола:"}.
{"Online Users","Онлайн потребители"}.
{"Online Users:","Онлайн потребители:"}.
{"Online","Онлайн"}.
{"Only admins can see this","Само администратори могат да видят това"}.
{"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","Само тези от списъка с позволени могат да се абонират и да извличат елементи"}.
{"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","Пакет"}.
{"Participant ID","ID на участник"}.
{"Participant","Участник"}.
{"Password Verification","Проверка на паролата"}.
{"Password Verification:","Проверка на паролата:"}.
{"Password","Парола"}.
{"Password:","Парола:"}.
{"Path to Dir","Път към директория"}.
{"Path to File","Път до файл"}.
{"Payload semantic type information","Информация за семантичен тип полезен товар"}.
{"Pending","В очакване"}.
{"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.","Обърнете внимание, че тези опции ще направят резервно копие само на вградената (Mnesia) база данни. Ако използвате модула ODBC, трябва да направите резервно копие на SQL базата данни отделно."}.
{"Please, wait for a while before sending new voice request","Моля, изчакайте известно време, преди да изпратите нова заявка за гласова връзка"}.
{"Pong","Понг"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Притежаването на атрибут 'ask' не е разрешено от RFC6121"}.
{"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","Времето на предишната сесия изтече"}.
{"Public","Публичен"}.
{"Publish model","Модел за публикуване"}.
{"Publish-Subscribe","Публикуване-Абониране"}.
{"PubSub subscriber request","Заявка от абонат за PubSub"}.
{"Purge all items when the relevant publisher goes offline","Изчисти всички елементи, когато съответният публикуващ премине в режим офлайн"}.
{"Push record not found","Push записът не е намерен"}.
{"Queries to the conference members are not allowed in this room","В тази стая не се допускат запитвания към членовете на конференцията"}.
{"Query to another users is forbidden","Заявка към други потребители е забранена"}.
{"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 of new nodes only","Получаване на известия само за нови нодове"}.
{"Recipient is not in the conference room","Получателят не е в конферентната стая"}.
{"Register an XMPP account","Регистрирай XMPP акаунт"}.
{"Registered Users","Регистрирани потребители"}.
{"Registered Users:","Регистрирани потребители:"}.
{"Register","Регистрирай"}.
{"Remote copy","Отдалечено копие"}.
{"Remove a hat from a user","Премахни шапка от потребител"}.
{"Remove All Offline Messages","Премахни всички офлайн съобщения"}.
{"Remove User","Премахни потребител"}.
{"Remove","Премахни"}.
{"Replaced by new connection","Заменен от нова връзка"}.
{"Request has timed out","Времето за заявка изтече"}.
{"Request is ignored","Заявката е игнорирано"}.
{"Requested role","Заявена роля"}.
{"Resources","Ресурси"}.
{"Restart Service","Рестартирай услугата"}.
{"Restart","Рестартирай"}.
{"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 of ~ts","Списък с контакти на ~ts"}.
{"Roster size","Размер на списъка с контакти"}.
{"Roster:","Списък с контакти:"}.
{"RPC Call Error","Грешка при RPC повикване"}.
{"Running Nodes","Работещи нодове"}.
{"~s invites you to the room ~s","~s ви кани в стая ~s"}.
{"Saturday","Събота"}.
{"Script check","Проверка на скрипт"}.
{"Search from the date","Търси от дата"}.
{"Search Results for ","Резултати от търсенето за "}.
{"Search the text","Търси текста"}.
{"Search until the date","Търси до дата"}.
{"Search users in ","Търси потребители в "}.
{"Select All","Избери всички"}.
{"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","Покажи обикновена таблица"}.
{"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","Невалидно ID на строфата"}.
{"Stanza ID","ID на строфа"}.
{"Statically specify a replyto of the node owner(s)","Статично задаване на replyto на собственика(ците) на нода"}.
{"Statistics of ~p","Статистики на ~p"}.
{"Statistics","Статистики"}.
{"Stopped Nodes","Спрени нодове"}.
{"Stop","Спри"}.
{"Storage Type","Тип хранилище"}.
{"Store binary backup:","Запази бинарен архив:"}.
{"Store plain text backup:","Запази архив като обикновен текст:"}.
{"Stream management is already enabled","Управлението на потока вече е активирано"}.
{"Stream management is not enabled","Управлението на потока не е активирано"}.
{"Subject","Тема"}.
{"Submitted","Изпратено"}.
{"Submit","Изпрати"}.
{"Subscriber Address","Адрес на абоната"}.
{"Subscribers may publish","Абонатите могат да публикуват"}.
{"Subscription requests must be approved and only subscribers may retrieve items","Заявките за абонамент трябва да бъдат одобрени и само абонатите могат да извличат елементи"}.
{"Subscriptions are not allowed","Абонаментите не са разрешени"}.
{"Subscription","Абонамент"}.
{"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","Проверката на CAPTCHA предизвикателството е неуспешна"}.
{"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","Датата и часът, на който абонамент ще приключи или е приключил"}.
{"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 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 трансформацията, която може да се приложи към формата на прикачените данни, за да се генерира валиден резултат от 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: ","Възникна грешка при изтриването на профила: "}.
{"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) ще бъде във формата: username@server. Моля, прочетете внимателно инструкциите, за да попълните правилно полетата."}.
{"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","Времето за изчакване за възобновяване на потока изтече"}.
{"Time","Час"}.
{"To register, visit ~s","За да се регистрирате, посетете ~s"}.
{"To ~ts","До ~ts"}.
{"Token TTL","Токен TTL"}.
{"Too many active bytestreams","Твърде много активни \"bytestreams\" потоци"}.
{"Too many CAPTCHA requests","Твърде много CAPTCHA заявки"}.
{"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). Адресът ще бъде деблокиран в ~s UTC"}.
{"Too many receiver fields were specified","Посочени са твърде много полета за получател"}.
{"Too many unacked stanzas","Твърде много непотвърдени строфи"}.
{"Too many users in this conference","Твърде много потребители в тази конференция"}.
{"Total rooms","Общо стаи"}.
{"To","До"}.
{"Traffic rate limit is exceeded","Лимитът за трафик е надвишен"}.
{"Transactions Aborted:","Прекратени транзакции:"}.
{"Transactions Committed:","Извършени транзакции:"}.
{"Transactions Logged:","Регистрирани транзакции:"}.
{"Transactions Restarted:","Рестартирани транзакции:"}.
{"~ts's Offline Messages Queue","Офлайн съобщения на ~ts"}.
{"Tuesday","Вторник"}.
{"Unable to generate a CAPTCHA","Не може да се генерира CAPTCHA"}.
{"Unable to register route on existing local domain","Не може да се регистрира маршрут в съществуващ локален домейн"}.
{"Unauthorized","Неоторизиран"}.
{"Unexpected action","Неочаквано действие"}.
{"Unexpected error condition: ~p","Неочаквано състояние на грешка: ~p"}.
{"Uninstall","Деинсталирай"}.
{"Unregister an XMPP account","Дерегистрирай XMPP профил"}.
{"Unregister","Дерегистрирай"}.
{"Unselect All","Размаркирай всички"}.
{"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 plan","План за актуализация"}.
{"Update ~p","Актуализирай ~p"}.
{"Update script","Актуализиращ скрипт"}.
{"Update specs to get modules source, then install desired ones.","Актуализирайте спецификациите, за да получите източник на модули, след което инсталирайте желаните."}.
{"Update Specs","Актуализирай спецификациите"}.
{"Update","Актуализирай"}.
{"Upgrade","Обнови"}.
{"Uptime:","Време на работа:"}.
{"URL for Archived Discussion Logs","URL адрес за дневници на архивирани дискусии"}.
{"User already exists","Потребителят вече съществува"}.
{"User (jid)","Потребител (jid)"}.
{"User JID","Потребител JID"}.
{"User Management","Управление на потребители"}.
{"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","Потребител"}.
{"Validate","Валидирай"}.
{"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' не е разрешена"}.
{"View joined MIX channels","Вижте присъединените MIX канали"}.
{"View Queue","Вижте опашката"}.
{"View Roster","Преглед на списъка с контакти"}.
{"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","Дали даден обект желае да получава обобщения за известия или всички известия поотделно"}.
{"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 покажи стойност на Отсъства"}.
{"XMPP Show Value of Chat","XMPP покажи стойност на Чат"}.
{"XMPP Show Value of DND (Do Not Disturb)","XMPP покажи стойност на DND (Не ме безпокой)"}.
{"XMPP Show Value of XA (Extended Away)","XMPP покажи стойност на Продължително отсъствие"}.
{"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 must fill in field \"Nickname\" in the form","Трябва да попълните полето \"Псевдоним\" във формата"}.
{"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 XMPP account was successfully registered.","Вашият XMPP акаунт, беше регистриран успешно."}.
{"Your XMPP account was successfully unregistered.","Вашият XMPP акаунт, беше успешно дерегистриран."}.
{"You're not allowed to create nodes","Нямате право да създавате нодове"}.
+7 -8
View File
@@ -12,11 +12,6 @@
{"A Web Page","Una Pàgina Web"}.
{"Accept","Acceptar"}.
{"Access denied by service policy","Accés denegat per la política del servei"}.
{"Access model of authorize","Model d'Accés de autoritzar"}.
{"Access model of open","Model d'Accés de obert"}.
{"Access model of presence","Model d'Accés de presència"}.
{"Access model of roster","Model d'Accés de contactes"}.
{"Access model of whitelist","Model d'Accés de llista blanca"}.
{"Access model","Model d'Accés"}.
{"Account doesn't exist","El compte no existeix"}.
{"Action on user","Acció en l'usuari"}.
@@ -53,6 +48,7 @@
{"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"}.
{"Apparently your account has no administration rights in this server. Please check how to grant admin rights in: https://docs.ejabberd.im/admin/installation/#administration-account","Aparentment el teu compte no te privilegis d'administrador en este servidor. Per favor consulta com obtindre privilegis d'administrador en: https://docs.ejabberd.im/admin/installation/#administration-account"}.
{"April","Abril"}.
{"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"}.
@@ -230,7 +226,6 @@
{"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","No està permés enviar missatges d'error a la sala. El participant (~s) ha enviat un missatge d'error (~s) i ha sigut expulsat de la sala"}.
{"It is not allowed to send private messages of type \"groupchat\"","No està permés enviar missatges del tipus \"groupchat\""}.
{"It is not allowed to send private messages to the conference","No està permès l'enviament de missatges privats a la sala"}.
{"It is not allowed to send private messages","No està permés enviar missatges privats"}.
{"Jabber ID","ID Jabber"}.
{"January","Gener"}.
{"JID normalization denied by service policy","S'ha denegat la normalització del JID per política del servei"}.
@@ -375,6 +370,7 @@
{"Only members may query archives of this room","Només membres poden consultar l'arxiu de missatges d'aquesta sala"}.
{"Only moderators and participants are allowed to change the subject in this room","Només els moderadors i participants poden canviar el tema d'aquesta sala"}.
{"Only moderators are allowed to change the subject in this room","Només els moderadors poden canviar el tema d'aquesta sala"}.
{"Only moderators are allowed to retract messages","Només els moderadors tenen permís per a retractar missatges"}.
{"Only moderators can approve voice requests","Només els moderadors poden aprovar les peticions de veu"}.
{"Only occupants are allowed to send messages to the conference","Sols els ocupants poden enviar missatges a la sala"}.
{"Only occupants are allowed to send queries to the conference","Sols els ocupants poden enviar sol·licituds a la sala"}.
@@ -398,7 +394,7 @@
{"Password:","Contrasenya:"}.
{"Path to Dir","Ruta al directori"}.
{"Path to File","Ruta al fitxer"}.
{"Payload type","Tipus de payload"}.
{"Payload semantic type information","Informació sobre el tipus semàntic de la carrega útil"}.
{"Pending","Pendent"}.
{"Period: ","Període: "}.
{"Persist items to storage","Persistir elements al guardar"}.
@@ -497,6 +493,7 @@
{"Specify the access model","Especificar el model d'accés"}.
{"Specify the event message type","Especifica el tipus de missatge d'event"}.
{"Specify the publisher model","Especificar el model del publicant"}.
{"Stanza id is not valid","L'identificador del paquet no es vàlid"}.
{"Stanza ID","ID del paquet"}.
{"Statically specify a replyto of the node owner(s)","Especifica estaticament una adreça on respondre al propietari del node"}.
{"Statistics of ~p","Estadístiques de ~p"}.
@@ -561,10 +558,10 @@
{"The query is only allowed from local users","La petició està permesa només d'usuaris locals"}.
{"The query must not contain <item/> elements","La petició no pot contenir elements <item/>"}.
{"The room subject can be modified by participants","El tema de la sala pot modificar-lo els participants"}.
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","La informació semàntica de les dades al node, usualment especificat pel espai de noms de la càrrega util (si n'hi ha)"}.
{"The sender of the last received message","Qui ha enviat l'ultim missatge rebut"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","El paquet DEU contindre només un element <active/>, un element <default/>, o un element <list/>"}.
{"The subscription identifier associated with the subscription request","L'identificador de subscripció associat amb la petició de subscripció"}.
{"The type of node data, usually specified by the namespace of the payload (if any)","El tipus de dades al node, usualment especificat pel namespace del payload (si n'hi ha)"}.
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","La URL de uns transformació XSL que pot ser aplicada als payloads per a generar un element apropiat de contingut de missatge."}.
{"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","La URL de una transformació XSL que pot ser aplicada al format de payload per a generar un resultat valid de Data Forms, que el client puga mostrar usant un métode generic de Data Forms"}.
{"There was an error changing the password: ","Hi ha hagut un error canviant la contrasenya: "}.
@@ -663,6 +660,7 @@
{"Whether to allow subscriptions","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"}.
{"Who may associate leaf nodes with a collection","Qui pot associar nodes fulla amb una col·lecció"}.
{"Wrong parameters in the web formulary","Paràmetres incorrectes en el formulari web"}.
{"Wrong xmlns","El xmlns ès incorrecte"}.
@@ -674,6 +672,7 @@
{"XMPP Show Value of XA (Extended Away)","Valor 'show' de XMPP: XA (Molt Ausent)"}.
{"XMPP URI of Associated Publish-Subscribe Node","URI XMPP del Node Associat Publish-Subscribe"}.
{"You are being removed from the room because of a system shutdown","Has sigut expulsat de la sala perquè el sistema va a apagar-se"}.
{"You are not allowed to send private messages","No tens permés enviar missatges privats"}.
{"You are not joined to the channel","No t'has unit al canal"}.
{"You can later change your password using an XMPP client.","Podràs canviar la teva contrasenya més endavant utilitzant un client XMPP."}.
{"You have been banned from this room","Has sigut bloquejat en aquesta sala"}.
+17 -9
View File
@@ -115,6 +115,7 @@
{"February",". února"}.
{"File larger than ~w bytes","Soubor větší než ~w bytů"}.
{"Friday","Pátek"}.
{"From ~ts","Od ~ts"}.
{"From","Od"}.
{"Full Name","Celé jméno"}.
{"Get Number of Online Users","Získat počet online uživatelů"}.
@@ -151,17 +152,18 @@
{"Incorrect value of 'action' attribute","Nesprávná hodnota atributu 'action'"}.
{"Incorrect value of 'action' in data form","Nesprávná hodnota atributu 'action' v datovém formuláři"}.
{"Incorrect value of 'path' in data form","Nesprávná hodnota atributu 'path' v datovém formuláři"}.
{"Installed Modules:","Instalované moduly:"}.
{"Insufficient privilege","Nedostatečné oprávnění"}.
{"Invalid 'from' attribute in forwarded message","Nesprávný atribut 'from' v přeposlané zprávě"}.
{"Invitations are not allowed in this conference","Pozvánky nejsou povoleny v této místnosti"}.
{"IP addresses","IP adresy"}.
{"is now known as","se přejmenoval(a) na"}.
{"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","Není povoleno posílat chybové zprávy do místnosti. Účastník (~s) odeslal chybovou zprávu (~s) a byl vyhozen z místnosti"}.
{"It is not allowed to send private messages of type \"groupchat\"","Není dovoleno odeslání soukromé zprávy typu \"skupinová zpráva\" "}.
{"It is not allowed to send private messages of type \"groupchat\"","Není dovoleno odeslání soukromých zpráv typu \"skupinová zpráva\""}.
{"It is not allowed to send private messages to the conference","Není povoleno odesílat soukromé zprávy v této místnosti"}.
{"It is not allowed to send private messages","Je zakázáno posílat soukromé zprávy"}.
{"Jabber ID","Jabber ID"}.
{"January",". ledna"}.
{"Joined MIX channels:","Připojené MIX kanály:"}.
{"joins the room","vstoupil(a) do místnosti"}.
{"July",". července"}.
{"June",". června"}.
@@ -182,7 +184,7 @@
{"Malformed username","Chybně formátováné jméno uživatele"}.
{"March",". března"}.
{"Max payload size in bytes","Maximální náklad v bajtech"}.
{"Maximum Number of Occupants","Počet účastníků"}.
{"Maximum Number of Occupants","Maximální počet účastníků"}.
{"May",". května"}.
{"Members:","Členové:"}.
{"Membership is required to enter this room","Pro vstup do místnosti musíte být členem"}.
@@ -201,7 +203,7 @@
{"Name","Jméno"}.
{"Name:","Jméno:"}.
{"Neither 'jid' nor 'nick' attribute found","Nebyl nalezen atribut 'jid' ani 'nick'"}.
{"Neither 'role' nor 'affiliation' attribute found","Nebyl nalezen atribut 'role' ani 'affiliation'"}.
{"Neither 'role' nor 'affiliation' attribute found","Nebyl nalezen atribut 'role' ani 'affiliation'"}.
{"Never","Nikdy"}.
{"New Password:","Nové heslo:"}.
{"Nickname Registration at ","Registrace přezdívky na "}.
@@ -267,6 +269,7 @@
{"Only service administrators are allowed to send service messages","Pouze správci služby smí odesílat servisní zprávy"}.
{"Organization Name","Název firmy"}.
{"Organization Unit","Oddělení"}.
{"Other Modules Available:","Ostatní dostupné moduly:"}.
{"Outgoing s2s Connections","Odchozí s2s spojení"}.
{"Outgoing s2s Connections:","Odchozí s2s spojení:"}.
{"Owner privileges required","Jsou vyžadována práva vlastníka"}.
@@ -320,7 +323,9 @@
{"Room Occupants","Počet účastníků"}.
{"Room title","Název místnosti"}.
{"Roster groups allowed to subscribe","Skupiny kontaktů, které mohou odebírat"}.
{"Roster of ~ts","Seznam kontaktů ~ts"}.
{"Roster size","Velikost seznamu kontaktů"}.
{"Roster:","Seznam kontaktů:"}.
{"RPC Call Error","Chyba RPC volání"}.
{"Running Nodes","Běžící uzly"}.
{"Saturday","Sobota"}.
@@ -334,7 +339,7 @@
{"September",". září"}.
{"Server:","Server:"}.
{"Set message of the day and send to online users","Nastavit zprávu dne a odeslat ji online uživatelům"}.
{"Set message of the day on all hosts and send to online users","Nastavit zprávu dne a odeslat ji online uživatelům"}.
{"Set message of the day on all hosts and send to online users","Nastavit zprávu dne na všech hostitelích a odeslat ji online uživatelům"}.
{"Shared Roster Groups","Skupiny pro sdílený seznam kontaktů"}.
{"Show Integral Table","Zobrazit kompletní tabulku"}.
{"Show Ordinary Table","Zobrazit běžnou tabulku"}.
@@ -358,17 +363,20 @@
{"Sunday","Neděle"}.
{"That nickname is already in use by another occupant","Přezdívka je již používána jiným členem"}.
{"That nickname is registered by another person","Přezdívka je zaregistrována jinou osobou"}.
{"The account was not unregistered","Účet nebyl smazán"}.
{"The CAPTCHA is valid.","CAPTCHA souhlasí."}.
{"The CAPTCHA verification has failed","Ověření CAPTCHA se nezdařilo"}.
{"The collections with which a node is affiliated","Kolekce, se kterými je uzel spřízněn"}.
{"The feature requested is not supported by the conference","Požadovaná vlastnost není podporována touto místností"}.
{"The number of subscribers to the node","Počet odběratelů uzlu"}.
{"The password contains unacceptable characters","Heslo obsahuje nepovolené znaky"}.
{"The password is too weak","Heslo je příliš slabé"}.
{"the password is","heslo je"}.
{"The query is only allowed from local users","Dotaz je povolen pouze pro místní uživatele"}.
{"The query must not contain <item/> elements","Dotaz nesmí obsahovat elementy <item/>"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Stanza MUSÍ obsahovat pouze jeden element <active/>, jeden element <default/> nebo jeden element <list/>"}.
{"There was an error creating the account: ","Při vytváření účtu došlo k chybě:"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Stanza MUSÍ obsahovat pouze jeden element <active/>, jeden element <default/> nebo jeden element <list/>"}.
{"There was an error changing the password: ","Při změně hesla došlo k chybě: "}.
{"There was an error creating the account: ","Při vytváření účtu došlo k chybě: "}.
{"There was an error deleting the account: ","Při mazání účtu došlo k chybě: "}.
{"This room is not anonymous","Tato místnost není anonymní"}.
{"Thursday","Čtvrtek"}.
@@ -417,8 +425,8 @@
{"User","Uživatel"}.
{"Validate","Ověřit"}.
{"Value 'get' of 'type' attribute is not allowed","Hodnota 'get' atrubutu 'type' není povolena"}.
{"Value of '~s' should be boolean","Hodnota '~s' by měla být boolean"}.
{"Value of '~s' should be datetime string","Hodnota '~s' by měla být datetime řetězec"}.
{"Value of '~s' should be boolean","Hodnota '~s' by měla být boolean"}.
{"Value of '~s' should be datetime string","Hodnota '~s' by měla být datetime řetězec"}.
{"Value of '~s' should be integer","Hodnota '~s' by měla být celé číslo"}.
{"Value 'set' of 'type' attribute is not allowed","Hodnota 'set' atrubutu 'type' není povolena"}.
{"vCard User Search","Hledání uživatelů ve vizitkách"}.
+3 -8
View File
@@ -12,11 +12,6 @@
{"A Web Page","Eine Webseite"}.
{"Accept","Akzeptieren"}.
{"Access denied by service policy","Zugriff aufgrund der Dienstrichtlinien verweigert"}.
{"Access model of authorize","Zugriffsmodell von 'authorize'"}.
{"Access model of open","Zugriffsmodell von 'open'"}.
{"Access model of presence","Zugriffsmodell von 'presence'"}.
{"Access model of roster","Zugriffsmodell der Kontaktliste"}.
{"Access model of whitelist","Zugriffsmodell von 'whitelist'"}.
{"Access model","Zugriffsmodell"}.
{"Account doesn't exist","Konto existiert nicht"}.
{"Action on user","Aktion auf Benutzer"}.
@@ -229,11 +224,11 @@
{"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","Es ist nicht erlaubt Fehlermeldungen an den Raum zu senden. Der Teilnehmer (~s) hat eine Fehlermeldung (~s) gesendet und wurde aus dem Raum geworfen"}.
{"It is not allowed to send private messages of type \"groupchat\"","Es ist nicht erlaubt private Nachrichten des Typs \"groupchat\" zu senden"}.
{"It is not allowed to send private messages to the conference","Es ist nicht erlaubt private Nachrichten an die Konferenz zu senden"}.
{"It is not allowed to send private messages","Es ist nicht erlaubt private Nachrichten zu senden"}.
{"Jabber ID","Jabber-ID"}.
{"January","Januar"}.
{"JID normalization denied by service policy","JID-Normalisierung aufgrund der Dienstrichtlinien verweigert"}.
{"JID normalization failed","JID-Normalisierung fehlgeschlagen"}.
{"Joined MIX channels of ~ts","Beigetretene MIX-Channels von ~ts"}.
{"Joined MIX channels:","Beigetretene MIX-Channels:"}.
{"joins the room","betritt den Raum"}.
{"July","Juli"}.
@@ -373,6 +368,7 @@
{"Only members may query archives of this room","Nur Mitglieder dürfen den Verlauf dieses Raumes abrufen"}.
{"Only moderators and participants are allowed to change the subject in this room","Nur Moderatoren und Teilnehmer dürfen das Thema in diesem Raum ändern"}.
{"Only moderators are allowed to change the subject in this room","Nur Moderatoren dürfen das Thema in diesem Raum ändern"}.
{"Only moderators are allowed to retract messages","Nur Moderatoren dürfen Nachrichten zurückziehen"}.
{"Only moderators can approve voice requests","Nur Moderatoren können Sprachrecht-Anforderungen genehmigen"}.
{"Only occupants are allowed to send messages to the conference","Nur Teilnehmer dürfen Nachrichten an die Konferenz senden"}.
{"Only occupants are allowed to send queries to the conference","Nur Teilnehmer dürfen Anfragen an die Konferenz senden"}.
@@ -396,7 +392,6 @@
{"Password:","Passwort:"}.
{"Path to Dir","Pfad zum Verzeichnis"}.
{"Path to File","Pfad zur Datei"}.
{"Payload type","Nutzdatentyp"}.
{"Pending","Ausstehend"}.
{"Period: ","Zeitraum: "}.
{"Persist items to storage","Items dauerhaft speichern"}.
@@ -495,6 +490,7 @@
{"Specify the access model","Geben Sie das Zugangsmodell an"}.
{"Specify the event message type","Geben Sie den Ereignisnachrichtentyp an"}.
{"Specify the publisher model","Geben Sie das Veröffentlichermodell an"}.
{"Stanza id is not valid","Stanza-ID ist ungültig"}.
{"Stanza ID","Stanza-ID"}.
{"Statically specify a replyto of the node owner(s)","Ein 'replyto' des/der Nodebesitzer(s) statisch angeben"}.
{"Statistics of ~p","Statistiken von ~p"}.
@@ -562,7 +558,6 @@
{"The sender of the last received message","Der Absender der letzten erhaltenen Nachricht"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Das Stanza darf nur ein <active/>-Element, ein <default/>-Element oder ein <list/>-Element enthalten"}.
{"The subscription identifier associated with the subscription request","Die mit der Abonnement-Anforderung verknüpfte Abonnement-Bezeichnung"}.
{"The type of node data, usually specified by the namespace of the payload (if any)","Die Art der Knotendaten, üblicherweise vom Namensraum der Nutzdaten angegeben (gegebenenfalls)"}.
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","Die URL einer XSL-Transformation welche auf Nutzdaten angewendet werden kann, um ein geeignetes Nachrichtenkörper-Element zu generieren."}.
{"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","Die URL einer XSL-Transformation welche auf das Nutzdaten-Format angewendet werden kann, um ein gültiges Data Forms-Ergebnis zu generieren das der Client mit Hilfe einer generischen Data Forms-Rendering-Engine anzeigen könnte"}.
{"There was an error changing the password: ","Es trat ein Fehler beim Ändern des Passwortes auf: "}.
-8
View File
@@ -12,11 +12,6 @@
{"A Web Page","Μία ιστοσελίδα"}.
{"Accept","Αποδοχή"}.
{"Access denied by service policy","Άρνηση πρόσβασης, λόγω τακτικής παροχής υπηρεσιών"}.
{"Access model of authorize","Μοντέλο πρόσβασης της πιστοποίησης"}.
{"Access model of open","Μοντέλο πρόσβασης του ανοικτού"}.
{"Access model of presence","Μοντέλο πρόσβασης της παρουσίας"}.
{"Access model of roster","Μοντέλο πρόσβασης της Λίστας Επαφών"}.
{"Access model of whitelist","Μοντέλο πρόσβασης της Λευκής Λίστας"}.
{"Access model","Καθορίστε το μοντέλο πρόσβασης"}.
{"Account doesn't exist","Ο λογαριασμός δεν υπάρχει"}.
{"Action on user","Eνέργεια για το χρήστη"}.
@@ -219,7 +214,6 @@
{"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","Δεν επιτρέπεται να στείλει προσωπικά μηνύματα για τη διάσκεψη"}.
{"It is not allowed to send private messages","Δεν επιτρέπεται η αποστολή προσωπικών μηνυμάτων"}.
{"Jabber ID","Ταυτότητα Jabber"}.
{"January","Ιανουάριος"}.
{"JID normalization denied by service policy","Απετράπη η κανονικοποίηση του JID, λόγω της τακτικής Παροχής Υπηρεσιών"}.
@@ -377,7 +371,6 @@
{"Password:","Κωδικός πρόσβασης:"}.
{"Path to Dir","Τοποθεσία κατάλογου αρχείων"}.
{"Path to File","Τοποθεσία Αρχείου"}.
{"Payload type","Τύπος φόρτου εργασιών"}.
{"Pending","Εκκρεμεί"}.
{"Period: ","Περίοδος: "}.
{"Persist items to storage","Μόνιμη αποθήκευση στοιχείων"}.
@@ -538,7 +531,6 @@
{"The sender of the last received message","Ο αποστολέας του τελευταίου εισερχομένου μηνύματος"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Η stanza ΠΡΕΠΕΙ να περιέχει μόνο ένα στοιχείο <active />, ένα στοιχείο <default /> ή ένα στοιχείο <list />"}.
{"The subscription identifier associated with the subscription request","Το αναγνωριστικό συνδρομής συσχετίστηκε με το αίτημα συνδρομής"}.
{"The type of node data, usually specified by the namespace of the payload (if any)","Ο τύπος των δεδομένων του κόμβου συνήθως προσδιορίζεται από το namespace του φόρτου εργασιών (αν υπάρχουν)"}.
{"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"}.
{"There was an error changing the password: ","Παρουσιάστηκε σφάλμα κατά την αλλαγή του κωδικού πρόσβασης: "}.
-4
View File
@@ -12,9 +12,6 @@
{"A Web Page","Retpaĝo"}.
{"Accept","Akcepti"}.
{"Access denied by service policy","Atingo rifuzita de serv-politiko"}.
{"Access model of open","Atingomodelo de malfermo"}.
{"Access model of presence","Atingomodelo de ĉeesto"}.
{"Access model of whitelist","Atingomodelo de permesolisto"}.
{"Access model","Atingomodelo"}.
{"Account doesn't exist","Konto ne ekzistas"}.
{"Action on user","Ago je uzanto"}.
@@ -163,7 +160,6 @@
{"is now known as","nun nomiĝas"}.
{"It is not allowed to send private messages of type \"groupchat\"","Malpermesas sendi mesaĝojn de tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Nur partoprenantoj rajtas sendi privatajn mesaĝojn al la babilejo"}.
{"It is not allowed to send private messages","Ne estas permesata sendi privatajn mesaĝojn"}.
{"Jabber ID","Jabber ID"}.
{"January","Januaro"}.
{"joins the room","eniras la babilejo"}.
+8 -9
View File
@@ -12,11 +12,6 @@
{"A Web Page","Una página web"}.
{"Accept","Aceptar"}.
{"Access denied by service policy","Acceso denegado por la política del servicio"}.
{"Access model of authorize","Modelo de acceso de Autorizar"}.
{"Access model of open","Modelo de acceso de Abierto"}.
{"Access model of presence","Modelo de acceso de Presencia"}.
{"Access model of roster","Modelo de acceso de Roster"}.
{"Access model of whitelist","Modelo de acceso de Lista Blanca"}.
{"Access model","Modelo de Acceso"}.
{"Account doesn't exist","La cuenta no existe"}.
{"Action on user","Acción en el usuario"}.
@@ -53,6 +48,7 @@
{"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"}.
{"Apparently your account has no administration rights in this server. Please check how to grant admin rights in: https://docs.ejabberd.im/admin/installation/#administration-account","Aparentemente tu cuenta no tiene permisos de administración en este servidor. Por favor consulta cómo concederle privilegios de administrador en: https://docs.ejabberd.im/admin/installation/#administration-account"}.
{"April","Abril"}.
{"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"}.
@@ -230,7 +226,6 @@
{"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","No está permitido enviar mensajes de error a la sala. Este participante (~s) ha enviado un mensaje de error (~s) y fue expulsado de la sala"}.
{"It is not allowed to send private messages of type \"groupchat\"","No está permitido enviar mensajes privados del tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Impedir el envio de mensajes privados a la sala"}.
{"It is not allowed to send private messages","No está permitido enviar mensajes privados"}.
{"Jabber ID","Jabber ID"}.
{"January","Enero"}.
{"JID normalization denied by service policy","Se ha denegado la normalización del JID por política del servicio"}.
@@ -290,7 +285,7 @@
{"Modified modules","Módulos modificados"}.
{"Module failed to handle the query","El módulo falló al gestionar la petición"}.
{"Monday","Lunes"}.
{"Multicast","Multicast"}.
{"Multicast","Multidifusión"}.
{"Multiple <item/> elements are not allowed by RFC6121","No se permiten múltiples elementos <item/> en RFC6121"}.
{"Multi-User Chat","Salas de Charla"}.
{"Name in the rosters where this group will be displayed","Nombre del grupo con que aparecerá en las listas de contactos"}.
@@ -375,6 +370,7 @@
{"Only members may query archives of this room","Solo miembros pueden consultar el archivo de mensajes de la sala"}.
{"Only moderators and participants are allowed to change the subject in this room","Solo los moderadores y participantes pueden cambiar el asunto de esta sala"}.
{"Only moderators are allowed to change the subject in this room","Solo los moderadores pueden cambiar el asunto de esta sala"}.
{"Only moderators are allowed to retract messages","Solo los moderadores pueden retractarse de los mensajes"}.
{"Only moderators can approve voice requests","Solo los moderadores pueden aprobar peticiones de voz"}.
{"Only occupants are allowed to send messages to the conference","Solo los ocupantes pueden enviar mensajes a la sala"}.
{"Only occupants are allowed to send queries to the conference","Solo los ocupantes pueden enviar solicitudes a la sala"}.
@@ -398,7 +394,7 @@
{"Password:","Contraseña:"}.
{"Path to Dir","Ruta al directorio"}.
{"Path to File","Ruta al fichero"}.
{"Payload type","Tipo de payload"}.
{"Payload semantic type information","Información sobre el tipo semántico de la carga útil"}.
{"Pending","Pendiente"}.
{"Period: ","Periodo: "}.
{"Persist items to storage","Persistir elementos al almacenar"}.
@@ -497,6 +493,7 @@
{"Specify the access model","Especifica el modelo de acceso"}.
{"Specify the event message type","Especifica el tipo del mensaje de evento"}.
{"Specify the publisher model","Especificar el modelo del publicante"}.
{"Stanza id is not valid","El identificador de la estrofa no es válido"}.
{"Stanza ID","ID del paquete"}.
{"Statically specify a replyto of the node owner(s)","Especificar de forma estática un 'replyto' de dueño(s) del nodo"}.
{"Statistics of ~p","Estadísticas de ~p"}.
@@ -561,10 +558,10 @@
{"The query is only allowed from local users","La solicitud está permitida solo para usuarios locales"}.
{"The query must not contain <item/> elements","La solicitud no debe contener elementos <item/>"}.
{"The room subject can be modified by participants","El asunto de la sala puede ser modificado por los participantes"}.
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","La información semántica de los datos del nodo, normalmente es especificada por el espacio de los nombres de la carga útil (si existe)"}.
{"The sender of the last received message","El emisor del último mensaje recibido"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","El paquete DEBE contener solo un elemento <active/>, un elemento <default/>, o un elemento <list/>"}.
{"The subscription identifier associated with the subscription request","El identificador de suscripción asociado con la petición de suscripción"}.
{"The type of node data, usually specified by the namespace of the payload (if any)","El tipo de datos del nodo, usualmente especificado por el namespace del payload (en caso de haberlo)"}.
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","La URL de una transformación XSL que puede aplicarse a payloads para generar un elemento de contenido del mensaje apropiado."}.
{"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","La URL de una transformación XSL que puede aplicarse al formato de payload para generar un resultado de Formulario de Datos válido, que el cliente pueda mostrar usando un mecanismo de dibujado genérico de Formulario de Datos"}.
{"There was an error changing the password: ","Hubo uno error al cambiar la contaseña: "}.
@@ -663,6 +660,7 @@
{"Whether to allow subscriptions","Permitir subscripciones"}.
{"Whether to make all subscriptions temporary, based on subscriber presence","Si hacer que todas las suscripciones sean temporales, basado en la presencia del suscriptor"}.
{"Whether to notify owners about new subscribers and unsubscribes","Si notificar a los dueños sobre nuevas suscripciones y desuscripciones"}.
{"Who can send private messages","Quién puede enviar mensajes privados"}.
{"Who may associate leaf nodes with a collection","Quien puede asociar nodos hoja con una colección"}.
{"Wrong parameters in the web formulary","Parámetros incorrectos en el formulario web"}.
{"Wrong xmlns","XMLNS incorrecto"}.
@@ -674,6 +672,7 @@
{"XMPP Show Value of XA (Extended Away)","Valor 'Show' de XMPP: XA (Ausente Extendido)"}.
{"XMPP URI of Associated Publish-Subscribe Node","URI XMPP del Nodo Asociado de Publicar-Subscribir"}.
{"You are being removed from the room because of a system shutdown","Estás siendo expulsado de la sala porque el sistema se va a detener"}.
{"You are not allowed to send private messages","No tienes permitido enviar mensajes privados"}.
{"You are not joined to the channel","No has entrado en el canal"}.
{"You can later change your password using an XMPP client.","Puedes cambiar tu contraseña después, usando un cliente XMPP."}.
{"You have been banned from this room","Has sido bloqueado en esta sala"}.
-6
View File
@@ -12,11 +12,6 @@
{"A Web Page","Une page Web"}.
{"Accept","Accepter"}.
{"Access denied by service policy","L'accès au service est refusé"}.
{"Access model of authorize","Modèle daccès de « autoriser »"}.
{"Access model of open","Modèle daccès de « ouvrir »"}.
{"Access model of presence","Modèle daccès de « présence »"}.
{"Access model of roster","Modèle daccès de « liste »"}.
{"Access model of whitelist","Modèle daccès de « liste blanche »"}.
{"Access model","Modèle daccès"}.
{"Account doesn't exist","Le compte nexiste pas"}.
{"Action on user","Action sur l'utilisateur"}.
@@ -220,7 +215,6 @@
{"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","L'envoyer de messages d'erreur au salon n'est pas autorisé. Le participant (~s) à envoyé un message d'erreur (~s) et à été expulsé du salon"}.
{"It is not allowed to send private messages of type \"groupchat\"","Il n'est pas permis d'envoyer des messages privés de type \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Il n'est pas permis d'envoyer des messages privés à la conférence"}.
{"It is not allowed to send private messages","L'envoi de messages privés n'est pas autorisé"}.
{"Jabber ID","Jabber ID"}.
{"January","Janvier"}.
{"joins the room","rejoint le salon"}.
-1
View File
@@ -159,7 +159,6 @@
{"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","Non está permitido enviar mensaxes de erro á sala. Este participante (~s) enviou unha mensaxe de erro (~s) e foi expulsado da sala"}.
{"It is not allowed to send private messages of type \"groupchat\"","Non está permitido enviar mensaxes privadas do tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Impedir o envio de mensaxes privadas á sala"}.
{"It is not allowed to send private messages","Non está permitido enviar mensaxes privadas"}.
{"Jabber ID","Jabber ID"}.
{"January","Xaneiro"}.
{"joins the room","entra na sala"}.
-2
View File
@@ -148,7 +148,6 @@
{"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","אין זה מותר לשלוח הודעות פרטיות לועידה"}.
{"It is not allowed to send private messages","אין זה מותר לשלוח הודעות פרטיות"}.
{"Jabber ID","מזהה Jabber"}.
{"January","ינואר"}.
{"joins the room","נכנס/ת אל החדר"}.
@@ -337,7 +336,6 @@
{"The collections with which a node is affiliated","האוספים עמם צומת מסונף"}.
{"The password is too weak","הסיסמה חלשה מדי"}.
{"the password is","הסיסמה היא"}.
{"The type of node data, usually specified by the namespace of the payload (if any)","סוג מידע ממסר, לרוב מצוין לפי מרחב־שמות של מטען הייעוד (אם בכלל)"}.
{"There was an error creating the account: ","אירעה שגיאה ביצירת החשבון: "}.
{"There was an error deleting the account: ","אירעה שגיאה במחיקת החשבון: "}.
{"This room is not anonymous","חדר זה אינו אנונימי"}.
-1
View File
@@ -170,7 +170,6 @@
{"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","Nem engedélyezett hibaüzeneteket küldeni a szobába. A résztvevő (~s) hibaüzenetet (~s) küldött, és ki lett rúgva a szobából"}.
{"It is not allowed to send private messages of type \"groupchat\"","Nem engedélyezett „groupchat” típusú személyes üzeneteket küldeni"}.
{"It is not allowed to send private messages to the conference","Nem engedélyezett személyes üzeneteket küldeni a konferenciába"}.
{"It is not allowed to send private messages","Nem engedélyezett személyes üzeneteket küldeni"}.
{"Jabber ID","Jabber-azonosító"}.
{"January","január"}.
{"JID normalization denied by service policy","A Jabber-azonosító normalizálása megtagadva a szolgáltatási irányelv miatt"}.
-7
View File
@@ -12,11 +12,6 @@
{"A Web Page","Halaman web"}.
{"Accept","Diterima"}.
{"Access denied by service policy","Akses ditolak oleh kebijakan layanan"}.
{"Access model of authorize","Model akses otorisasi"}.
{"Access model of open","Model akses terbuka"}.
{"Access model of presence","Model akses kehadiran"}.
{"Access model of roster","model akses daftar kontak"}.
{"Access model of whitelist","Model akses daftar putih"}.
{"Access model","Model akses"}.
{"Account doesn't exist","Akun tidak ada"}.
{"Action on user","Tindakan pada pengguna"}.
@@ -207,7 +202,6 @@
{"is now known as","sekarang dikenal sebagai"}.
{"It is not allowed to send private messages of type \"groupchat\"","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi jenis \"groupchat \""}.
{"It is not allowed to send private messages to the conference","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi ke konferensi"}.
{"It is not allowed to send private messages","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi"}.
{"Jabber ID","Jabber ID"}.
{"January","Januari"}.
{"joins the room","bergabung ke ruangan"}.
@@ -289,7 +283,6 @@
{"Password","Sandi"}.
{"Path to Dir","Jalur ke Dir"}.
{"Path to File","Jalur ke File"}.
{"Payload type","Tipe payload"}.
{"Pending","Tertunda"}.
{"Period: ","Periode: "}.
{"Persist items to storage","Pertahankan item ke penyimpanan"}.
+378 -27
View File
@@ -3,40 +3,80 @@
%% To improve translations please read:
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
{" (Add * to the end of field to match substring)"," Riempire il modulo per la ricerca di utenti Jabber corrispondenti ai criteri (Aggiungere * alla fine del campo per la ricerca di una sottostringa"}.
{" (Add * to the end of field to match substring)"," (Aggiungere * alla fine del campo per far corrispondere la sottostringa)"}.
{" has set the subject to: "," ha modificato l'oggetto in: "}.
{"# participants","# partecipanti"}.
{"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 è prevista una password"}.
{"A password is required to enter this room","Per entrare in questa stanza è necessaria una password"}.
{"A Web Page","Un Pagina Web"}.
{"Accept","Accettare"}.
{"Access denied by service policy","Accesso impedito dalle politiche del servizio"}.
{"Access model","Modello di accesso"}.
{"Account doesn't exist","L'account non esiste"}.
{"Action on user","Azione sull'utente"}.
{"Add Jabber ID","Aggiungere un Jabber ID (Jabber ID)"}.
{"Add New","Aggiungere nuovo"}.
{"Add User","Aggiungere un utente"}.
{"Add a hat to a user","Aggiungere un cappello a un utente"}.
{"Add Jabber ID","Aggiungere un Jabber ID"}.
{"Add New","Aggiungere Nuovo"}.
{"Add User","Aggiungere un Utente"}.
{"Administration of ","Amministrazione di "}.
{"Administration","Amministrazione"}.
{"Administrator privileges required","Necessari i privilegi di amministratore"}.
{"Administrator privileges required","Sono richiesti privilegi di amministratore"}.
{"All activity","Tutta l'attività"}.
{"All Users","Tutti gli utenti"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Consentire a questo Jabber ID l'iscrizione a questo nodo pubsub?"}.
{"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?"}.
{"Allow users to change the subject","Consentire agli utenti di cambiare l'oggetto"}.
{"Allow users to query other users","Consentire agli utenti query verso altri utenti"}.
{"Allow users to send invites","Consentire agli utenti l'invio di inviti"}.
{"Allow users to send private messages","Consentire agli utenti l'invio di messaggi privati"}.
{"Allow users to send invites","Consenti agli utenti di inviare inviti"}.
{"Allow users to send private messages","Consenti agli utenti di inviare messaggi privati"}.
{"Allow visitors to change nickname","Consentire ai visitatori di cambiare il nickname"}.
{"Allow visitors to send private messages to","Consentire agli ospiti l'invio di messaggi privati a"}.
{"Allow visitors to send status text in presence updates","Consentire ai visitatori l'invio di testo sullo stato in aggiornamenti sulla presenza"}.
{"Allow visitors to send voice requests","Consentire agli ospiti l'invio di richieste di parola"}.
{"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.","Un gruppo LDAP associato che definisce l'appartenenza alla sala; deve trattarsi di un nome distinto LDAP in base a una definizione di gruppo specifica dell'implementazione o della distribuzione."}.
{"Announcements","Annunci"}.
{"Answer associated with a picture","Risposta associata ad un'immagine"}.
{"Answer associated with a video","Risposta associata a un video"}.
{"Answer associated with speech","Risposta associata al discorso"}.
{"Answer to a question","Risposta a una domanda"}.
{"Anyone in the specified roster group(s) may subscribe and retrieve items","Chiunque nei gruppi di elenco specificati può iscriversi e recuperare elementi"}.
{"Anyone may associate leaf nodes with the collection","Chiunque può associare i nodi foglia alla raccolta"}.
{"Anyone may publish","Chiunque può pubblicare"}.
{"Anyone may subscribe and retrieve items","Chiunque può iscriversi e recuperare elementi"}.
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Chiunque abbia un abbonamento di presenza di entrambi o di può sottoscrivere e recuperare elementi"}.
{"Anyone with Voice","Chiunque abbia la Voce"}.
{"Anyone","Chiunque"}.
{"Apparently your account has no administration rights in this server. Please check how to grant admin rights in: https://docs.ejabberd.im/admin/installation/#administration-account","A quanto pare il tuo account non ha diritti di amministrazione su questo server. Controlla come concedere i diritti di amministratore in: https://docs.ejabberd.im/admin/installation/#administration-account"}.
{"April","Aprile"}.
{"Attribute 'channel' is required for this request","Per questa richiesta è richiesto l'attributo 'canale'"}.
{"Attribute 'id' is mandatory for MIX messages","L'attributo 'id' è obbligatorio per i messaggi MIX"}.
{"Attribute 'jid' is not allowed here","L'attributo \"jid\" non è consentito qui"}.
{"Attribute 'node' is not allowed here","L'attributo \"nodo\" non è consentito qui"}.
{"Attribute 'to' of stanza that triggered challenge","Attributo \"a\" della strofa che ha innescato la sfida"}.
{"August","Agosto"}.
{"Backup Management","Gestione dei salvataggi"}.
{"Backup to File at ","Salvataggio sul file "}.
{"Backup","Salvare"}.
{"Automatic node creation is not enabled","La creazione automatica del nodo non è abilitata"}.
{"Backup Management","Gestione dei Backup"}.
{"Backup of ~p","Backup di ~p"}.
{"Backup to File at ","Backup su file in "}.
{"Backup","Backup"}.
{"Bad format","Formato non valido"}.
{"Birthday","Compleanno"}.
{"Both the username and the resource are required","Sono richiesti sia il nome utente che la risorsa"}.
{"Bytestream already activated","Bytestream già attivato"}.
{"Cannot remove active list","Impossibile rimuovere l'elenco attivo"}.
{"Cannot remove default list","Impossibile rimuovere l'elenco predefinito"}.
{"CAPTCHA web page","Pagina web CAPTCHA"}.
{"Change Password","Modificare la password"}.
{"Challenge ID","ID Sfida"}.
{"Change Password","Cambiare la password"}.
{"Change User Password","Cambiare la password dell'utente"}.
{"Changing password is not allowed","Non è consentito modificare la password"}.
{"Changing role/affiliation is not allowed","Non è consentito cambiare ruolo/affiliazione"}.
{"Channel already exists","Canale già esistente"}.
{"Channel does not exist","Il canale non esiste"}.
{"Channel JID","Canale JID"}.
{"Channels","Canali"}.
{"Characters not allowed:","Caratteri non consentiti:"}.
{"Chatroom configuration modified","Configurazione della stanza modificata"}.
{"Chatroom is created","La stanza è creata"}.
@@ -46,39 +86,59 @@
{"Chatrooms","Stanze"}.
{"Choose a username and password to register with this server","Scegliere un nome utente e una password per la registrazione con questo server"}.
{"Choose storage type of tables","Selezionare una modalità di conservazione delle tabelle"}.
{"Choose whether to approve this entity's subscription.","Scegliere se approvare l'iscrizione per questa entità"}.
{"Choose whether to approve this entity's subscription.","Scegliere se approvare l'iscrizione per questa entità."}.
{"City","Città"}.
{"Client acknowledged more stanzas than sent by server","Il client ha riconosciuto più stanze di quelle inviate dal server"}.
{"Commands","Comandi"}.
{"Conference room does not exist","La stanza per conferenze non esiste"}.
{"Configuration of room ~s","Configurazione per la stanza ~s"}.
{"Configuration","Configurazione"}.
{"Connected Resources:","Risorse connesse:"}.
{"Contact Addresses (normally, room owner or owners)","Indirizzi di contatto (normalmente, proprietario o proprietari della stanza)"}.
{"Contrib Modules","Moduli di Contributo"}.
{"Country","Paese"}.
{"CPU Time:","Tempo CPU:"}.
{"Current Discussion Topic","Argomento di discussione attuale"}.
{"Database failure","Errore del database"}.
{"Database Tables at ~p","Tabelle del database a ~p"}.
{"Database Tables Configuration at ","Configurazione delle tabelle del database su "}.
{"Database","Database"}.
{"December","Dicembre"}.
{"Default users as participants","Definire per default gli utenti come partecipanti"}.
{"Delete content","Elimina contenuto"}.
{"Delete message of the day on all hosts","Eliminare il messaggio del giorno (MOTD) su tutti gli host"}.
{"Delete message of the day","Eliminare il messaggio del giorno (MOTD)"}.
{"Delete Selected","Eliminare gli elementi selezionati"}.
{"Delete Selected","Elimina Selezionato"}.
{"Delete table","Elimina tabella"}.
{"Delete User","Eliminare l'utente"}.
{"Deliver event notifications","Inviare notifiche degli eventi"}.
{"Deliver payloads with event notifications","Inviare il contenuto del messaggio con la notifica dell'evento"}.
{"Description:","Descrizione:"}.
{"Disc only copy","Copia su disco soltanto"}.
{"Disc only copy","Copia solo su disco"}.
{"'Displayed groups' not added (they do not exist!): ","'Gruppi visualizzati' non aggiunti (non esistono!): "}.
{"Displayed:","Visualizzato:"}.
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Non rivelare la tua password a nessuno, nemmeno agli amministratori del server XMPP."}.
{"Dump Backup to Text File at ","Trascrivere il salvataggio sul file di testo "}.
{"Dump to Text File","Trascrivere su file di testo"}.
{"Duplicated groups are not allowed by RFC6121","I gruppi duplicati non sono consentiti da RFC6121"}.
{"Dynamically specify a replyto of the item publisher","Specifica dinamicamente una risposta dell'editore dell'elemento"}.
{"Edit Properties","Modificare le proprietà"}.
{"Either approve or decline the voice request.","Approva oppure respingi la richiesta di parola."}.
{"ejabberd HTTP Upload service","Servizio di Caricamento HTTP di ejabberd"}.
{"ejabberd MUC module","Modulo MUC per ejabberd"}.
{"ejabberd Multicast service","Servizio Multicast ejabberd"}.
{"ejabberd Publish-Subscribe module","Modulo Pubblicazione/Iscrizione (PubSub) per ejabberd"}.
{"ejabberd SOCKS5 Bytestreams module","Modulo SOCKS5 Bytestreams per ejabberd"}.
{"ejabberd vCard module","Modulo vCard per ejabberd"}.
{"ejabberd Web Admin","Amministrazione web ejabberd"}.
{"ejabberd","ejabberd"}.
{"Elements","Elementi"}.
{"Email Address","Indirizzo di Posta Elettronica"}.
{"Email","E-mail"}.
{"Enable logging","Abilitare i log"}.
{"Enable hats","Abilitare i cappelli"}.
{"Enable logging","Abilitare la registrazione"}.
{"Enable message archiving","Abilita l'archiviazione dei messaggi"}.
{"Enabling push without 'node' attribute is not supported","L'abilitazione del push senza l'attributo 'nodo' non è supportata"}.
{"End User Session","Terminare la sessione dell'utente"}.
{"Enter nickname you want to register","Immettere il nickname che si vuole registrare"}.
{"Enter path to backup file","Immettere il percorso del file di salvataggio"}.
@@ -86,30 +146,55 @@
{"Enter path to jabberd14 spool file","Immettere il percorso del file di spool di jabberd14"}.
{"Enter path to text file","Immettere il percorso del file di testo"}.
{"Enter the text you see","Immettere il testo visibile"}.
{"Erlang XMPP Server","Server XMPP Erlang"}.
{"Error","Errore"}.
{"Exclude Jabber IDs from CAPTCHA challenge","Escludi degli ID Jabber dal passaggio CAPTCHA"}.
{"Export all tables as SQL queries to a file:","Esporta tutte le tabelle come query SQL in un file:"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Esportare i dati di tutti gli utenti nel server in file PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Esportare i dati degli utenti di un host in file PIEFXIS (XEP-0227):"}.
{"External component failure","Guasto del componente esterno"}.
{"External component timeout","Timeout del componente esterno"}.
{"Failed to activate bytestream","Impossibile attivare il flusso di byte"}.
{"Failed to extract JID from your voice request approval","Impossibile estrarre il JID dall'approvazione della richiesta di parola"}.
{"Failed to map delegated namespace to external component","Impossibile mappare lo spazio dei nomi delegato al componente esterno"}.
{"Failed to parse HTTP response","Impossibile analizzare la risposta HTTP"}.
{"Failed to process option '~s'","Impossibile elaborare l'opzione '~s'"}.
{"Family Name","Cognome"}.
{"FAQ Entry","Inserimento delle domande frequenti"}.
{"February","Febbraio"}.
{"File larger than ~w bytes","File più grande di ~w byte"}.
{"Fill in the form to search for any matching XMPP User","Compila il modulo per cercare qualsiasi utente XMPP corrispondente"}.
{"Friday","Venerdì"}.
{"From ~ts","Da ~ts"}.
{"From","Da"}.
{"Full List of Room Admins","Elenco Completo degli Amministratori delle Stanze"}.
{"Full List of Room Owners","Elenco Completo dei Proprietari delle Stanze"}.
{"Full Name","Nome completo"}.
{"Get List of Online Users","Ottieni L'elenco degli Utenti Online"}.
{"Get List of Registered Users","Ottieni L'elenco degli Utenti Registrati"}.
{"Get Number of Online Users","Ottenere il numero di utenti online"}.
{"Get Number of Registered Users","Ottenere il numero di utenti registrati"}.
{"Get Pending","Ottieni in sospeso"}.
{"Get User Last Login Time","Ottenere la data di ultimo accesso dell'utente"}.
{"Get User Password","Ottenere la password dell'utente"}.
{"Get User Statistics","Ottenere le statistiche dell'utente"}.
{"Given Name","Nome di battesimo"}.
{"Grant voice to this person?","Dare parola a questa persona?"}.
{"Group","Gruppo"}.
{"Groups that will be displayed to the members","Gruppi che verranno visualizzati ai membri"}.
{"Groups","Gruppi"}.
{"has been banned","è stata/o bandita/o"}.
{"has been kicked because of a system shutdown","è stato espulso a causa dello spegnimento del sistema"}.
{"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"}.
{"Hat title","Titolo del Cappello"}.
{"Hat URI","URI Cappello"}.
{"Hats limit exceeded","Limite di cappelli superato"}.
{"Host unknown","Host sconosciuto"}.
{"Host","Host"}.
{"HTTP File Upload","Caricamento file HTTP"}.
{"Idle connection","Connessione inattiva"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Se qui non vedi l'immagine CAPTCHA, visita la pagina web."}.
{"Import Directory","Importare una directory"}.
{"Import File","Importare un file"}.
@@ -119,23 +204,50 @@
{"Import users data from jabberd14 spool directory:","Importare i dati utenti da directory di spool di jabberd14:"}.
{"Import Users from Dir at ","Importare utenti dalla directory "}.
{"Import Users From jabberd14 Spool Files","Importare utenti da file di spool di jabberd14"}.
{"Improper domain part of 'from' attribute","Parte del dominio non corretta dell'attributo 'da'"}.
{"Improper message type","Tipo di messaggio non corretto"}.
{"Incoming s2s Connections:","Connessioni s2s in Entrata:"}.
{"Incorrect CAPTCHA submit","Invio CAPTCHA errato"}.
{"Incorrect data form","Modulo dati errato"}.
{"Incorrect password","Password non esatta"}.
{"Incorrect value of 'action' attribute","Valore errato dell'attributo 'azione'"}.
{"Incorrect value of 'action' in data form","Valore errato di 'azione' nel modulo dati"}.
{"Incorrect value of 'path' in data form","Valore errato di 'percorso' nel modulo dati"}.
{"Installed Modules:","Moduli installati:"}.
{"Install","Installare"}.
{"Insufficient privilege","Privilegio insufficiente"}.
{"Internal server error","Errore interno del server"}.
{"Invalid 'from' attribute in forwarded message","Attributo 'da' non valido nel messaggio inoltrato"}.
{"Invalid node name","Nome del nodo non valido"}.
{"Invalid 'previd' value","Valore 'previd' non valido"}.
{"Invitations are not allowed in this conference","Non sono ammessi inviti a questa conferenza"}.
{"IP addresses","Indirizzi IP"}.
{"is now known as","è ora conosciuta/o come"}.
{"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","Non è consentito inviare messaggi di errore alla stanza. Il partecipante (~s) ha inviato un messaggio di errore (~s) ed è stato espulso dalla stanza"}.
{"It is not allowed to send private messages of type \"groupchat\"","Non è consentito l'invio di messaggi privati di tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Non è consentito l'invio di messaggi privati alla conferenza"}.
{"It is not allowed to send private messages","Non è consentito l'invio di messaggi privati"}.
{"Jabber ID","Jabber ID (Jabber ID)"}.
{"January","Gennaio"}.
{"JID normalization denied by service policy","Normalizzazione JID negata dalla politica del servizio"}.
{"JID normalization failed","La normalizzazione JID non è riuscita"}.
{"Joined MIX channels of ~ts","Canali MIX uniti di ~ts"}.
{"Joined MIX channels:","Canali MIX uniti:"}.
{"joins the room","entra nella stanza"}.
{"July","Luglio"}.
{"June","Giugno"}.
{"Just created","Appena creato"}.
{"Label:","Etichetta:"}.
{"Last Activity","Ultima attività"}.
{"Last login","Ultimo accesso"}.
{"Last message","Ultimo messaggio"}.
{"Last month","Ultimo mese"}.
{"Last year","Ultimo anno"}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","I bit meno significativi dell'hash di testo SHA-256 devono corrispondere all'etichetta esadecimale"}.
{"leaves the room","esce dalla stanza"}.
{"List of rooms","Elenco delle stanze"}.
{"List of users with hats","Elenco degli utenti con cappelli"}.
{"List users with hats","Elenca gli utenti con cappelli"}.
{"Logging","Registrazione"}.
{"Low level update script","Script di aggiornamento di basso livello"}.
{"Make participants list public","Rendere pubblica la lista dei partecipanti"}.
{"Make room CAPTCHA protected","Rendere la stanza protetta da CAPTCHA"}.
@@ -144,41 +256,104 @@
{"Make room password protected","Rendere la stanza protetta da password"}.
{"Make room persistent","Rendere la stanza persistente"}.
{"Make room public searchable","Rendere la sala visibile al pubblico"}.
{"Malformed username","Nome utente malformato"}.
{"MAM preference modification denied by service policy","Modifica delle preferenze MAM negata dalla policy del servizio"}.
{"March","Marzo"}.
{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Numero massimo di elementi da persistere o `max` per nessun limite specifico diverso da quello massimo imposto dal server"}.
{"Max payload size in bytes","Dimensione massima del contenuto del messaggio in byte"}.
{"Maximum file size","Dimensione massima del file"}.
{"Maximum Number of History Messages Returned by Room","Numero Massimo di Messaggi di Cronologia Restituiti dalla Stanza"}.
{"Maximum number of items to persist","Numero massimo di elementi da persistere"}.
{"Maximum Number of Occupants","Numero massimo di occupanti"}.
{"May","Maggio"}.
{"Members not added (inexistent vhost!): ","Membri non aggiunti (vhost inesistente!): "}.
{"Membership is required to enter this room","Per entrare in questa stanza è necessario essere membro"}.
{"Members:","Membri:"}.
{"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.","Memorizza la tua password, oppure scrivila su un foglio riposto in un luogo sicuro. In XMPP non esiste un modo automatico per recuperare la password se la dimentichi."}.
{"Memory","Memoria"}.
{"Mere Availability in XMPP (No Show Value)","Mera disponibilità in XMPP (Nessun Valore Mostrato)"}.
{"Message body","Corpo del messaggio"}.
{"Message not found in forwarded payload","Messaggio non trovato nel payload inoltrato"}.
{"Messages from strangers are rejected","I messaggi provenienti da sconosciuti vengono rifiutati"}.
{"Messages of type headline","Messaggi di tipo headline"}.
{"Messages of type normal","Messaggi di tipo normale"}.
{"Middle Name","Altro nome"}.
{"Minimum interval between voice requests (in seconds)","Intervallo minimo fra due richieste di parola (in secondi)"}.
{"Moderator privileges required","Necessari i privilegi di moderatore"}.
{"Moderator","Moderatore/Moderatrice"}.
{"Moderators Only","Solo i Moderatori"}.
{"Modified modules","Moduli modificati"}.
{"Module failed to handle the query","Il modulo non è riuscito a gestire la query"}.
{"Monday","Lunedì"}.
{"Multicast","Multicast"}.
{"Multiple <item/> elements are not allowed by RFC6121","Più elementi <item/> non sono consentiti da RFC6121"}.
{"Multi-User Chat","Chat Multiutente"}.
{"Name in the rosters where this group will be displayed","Nome nei roster in cui verrà visualizzato questo gruppo"}.
{"Name","Nome"}.
{"Name:","Nome:"}.
{"Natural Language for Room Discussions","Linguaggio Naturale per le Discussioni in Sala"}.
{"Natural-Language Room Name","Nome della Stanza in Linguaggio Naturale"}.
{"Neither 'jid' nor 'nick' attribute found","Né l'attributo 'jid' né quello 'nick' sono stati trovati"}.
{"Neither 'role' nor 'affiliation' attribute found","Non sono stati trovati né gli attributi 'ruolo' né 'affiliazione'"}.
{"Never","Mai"}.
{"New Password:","Nuova password:"}.
{"Nickname can't be empty","Il soprannome non può essere vuoto"}.
{"Nickname Registration at ","Registrazione di un nickname su "}.
{"Nickname ~s does not exist in the room","Il nickname ~s non esiste nella stanza"}.
{"Nickname","Nickname"}.
{"Nickname","Soprannome"}.
{"No address elements found","Nessun elemento dell'indirizzo trovato"}.
{"No addresses element found","Nessun elemento degli indirizzi trovato"}.
{"No 'affiliation' attribute found","Nessun attributo 'affiliazione' trovato"}.
{"No available resource found","Nessuna risorsa disponibile trovata"}.
{"No body provided for announce message","Nessun corpo fornito per il messaggio di annuncio"}.
{"No child elements found","Non sono stati trovati elementi figlio"}.
{"No data form found","Nessun modulo dati trovato"}.
{"No Data","Nessuna informazione"}.
{"No features available","Nessuna funzionalità disponibile"}.
{"No <forwarded/> element found","Nessun elemento <forwarded/> trovato"}.
{"No hook has processed this command","Nessun hook ha elaborato questo comando"}.
{"No info about last activity found","Nessuna informazione sull'ultima attività trovata"}.
{"No 'item' element found","Nessun elemento 'item' trovato"}.
{"No items found in this query","Nessun elemento trovato in questa query"}.
{"No limit","Nessun limite"}.
{"Node ID","ID del nodo"}.
{"No module is handling this query","Nessun modulo gestisce questa query"}.
{"No node specified","Nessun nodo specificato"}.
{"No 'password' found in data form","Nessuna 'password' trovata nel modulo dati"}.
{"No 'password' found in this query","Nessuna \"password\" trovata in questa query"}.
{"No 'path' found in data form","Nessun 'percorso' trovato nel modulo dati"}.
{"No pending subscriptions found","Nessuna sottoscrizione in attesa trovata"}.
{"No privacy list with this name found","Nessun elenco di privacy con questo nome trovato"}.
{"No private data found in this query","Non sono stati trovati dati privati in questa query"}.
{"No running node found","Nessun nodo in esecuzione trovato"}.
{"No services available","Nessun servizio disponibile"}.
{"No statistics found for this item","Nessuna statistica trovata per questa voce"}.
{"No 'to' attribute found in the invitation","Nessun attributo 'a' trovato nell'invito"}.
{"Nobody","Nessuno"}.
{"Node already exists","Il nodo esiste già"}.
{"Node ID","ID del Nodo"}.
{"Node index not found","Indice del nodo non trovato"}.
{"Node not found","Nodo non trovato"}.
{"Node ~p","Nodo ~p"}.
{"Node","Nodo"}.
{"Nodeprep has failed","Nodeprep non è riuscito"}.
{"Nodes","Nodi"}.
{"None","Nessuno"}.
{"None","Niente"}.
{"Not allowed","Non consentito"}.
{"Not Found","Non trovato"}.
{"Not subscribed","Non sottoscritto"}.
{"Notify subscribers when items are removed from the node","Notificare gli iscritti quando sono eliminati degli elementi dal nodo"}.
{"Notify subscribers when the node configuration changes","Notificare gli iscritti quando la configurazione del nodo cambia"}.
{"Notify subscribers when the node is deleted","Notificare gli iscritti quando il nodo è cancellato"}.
{"November","Novembre"}.
{"Number of answers required","Numero di risposte richieste"}.
{"Number of occupants","Numero di presenti"}.
{"Number of Offline Messages","Numero di messaggi offline"}.
{"Number of online users","Numero di utenti online"}.
{"Number of registered users","Numero di utenti registrati"}.
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Numero di secondi dopo i quali eliminare automaticamente gli elementi o `max` per nessun limite specifico diverso da quello massimo imposto dal server"}.
{"Occupants are allowed to invite others","Gli occupanti possono invitare altri"}.
{"Occupants are allowed to query others","Gli occupanti possono interrogare gli altri"}.
{"Occupants May Change the Subject","Gli Occupanti Possono Cambiare il Soggetto"}.
{"October","Ottobre"}.
{"Offline Messages","Messaggi offline"}.
{"Offline Messages:","Messaggi offline:"}.
@@ -187,50 +362,85 @@
{"Online Users:","Utenti connessi:"}.
{"Online Users","Utenti online"}.
{"Online","Online"}.
{"Only admins can see this","Solo gli amministratori possono vedere questo"}.
{"Only collection node owners may associate leaf nodes with the collection","Solo i proprietari dei nodi di raccolta possono associare i nodi foglia alla collezione"}.
{"Only deliver notifications to available users","Inviare le notifiche solamente agli utenti disponibili"}.
{"Only <enable/> or <disable/> tags are allowed","Sono consentiti solo i tag <enable/> o <disable/>"}.
{"Only <list/> element is allowed in this query","In questa query è consentito solo l'elemento <list/>"}.
{"Only members may query archives of this room","Solo i membri possono interrogare gli archivi di questa stanza"}.
{"Only moderators and participants are allowed to change the subject in this room","La modifica dell'oggetto di questa stanza è consentita soltanto ai moderatori e ai partecipanti"}.
{"Only moderators are allowed to change the subject in this room","La modifica dell'oggetto di questa stanza è consentita soltanto ai moderatori"}.
{"Only moderators are allowed to retract messages","Solo i moderatori possono ritirare i messaggi"}.
{"Only moderators can approve voice requests","Soltanto i moderatori possono approvare richieste di parola"}.
{"Only occupants are allowed to send messages to the conference","L'invio di messaggi alla conferenza è consentito soltanto ai presenti"}.
{"Only occupants are allowed to send queries to the conference","L'invio di query alla conferenza è consentito ai soli presenti"}.
{"Only publishers may publish","Solo gli editori possono pubblicare"}.
{"Only service administrators are allowed to send service messages","L'invio di messaggi di servizio è consentito solamente agli amministratori del servizio"}.
{"Only those on a whitelist may associate leaf nodes with the collection","Solo chi fa parte di una whitelist può associare i nodi foglia alla collezione"}.
{"Only those on a whitelist may subscribe and retrieve items","Solo chi fa parte di una whitelist può sottoscrivere e recuperare le voci"}.
{"Organization Name","Nome dell'organizzazione"}.
{"Organization Unit","Unità dell'organizzazione"}.
{"Other Modules Available:","Altri Moduli Disponibili:"}.
{"Outgoing s2s Connections","Connessioni s2s in uscita"}.
{"Outgoing s2s Connections:","Connessioni s2s in uscita:"}.
{"Owner privileges required","Necessari i privilegi di proprietario"}.
{"Packet relay is denied by service policy","Il relay dei pacchetti è negato dalla politica di servizio"}.
{"Packet","Pacchetto"}.
{"Participant ID","ID Partecipante"}.
{"Participant","Partecipante"}.
{"Password Verification","Verifica della password"}.
{"Password Verification:","Verifica della password:"}.
{"Password","Password"}.
{"Password:","Password:"}.
{"Path to Dir","Percorso della directory"}.
{"Path to File","Percorso del file"}.
{"Payload semantic type information","Informazioni sul tipo semantico del payload"}.
{"Pending","Pendente"}.
{"Period: ","Periodo:"}.
{"Period: ","Periodo: "}.
{"Persist items to storage","Conservazione persistente degli elementi"}.
{"Persistent","Persistente"}.
{"Ping query is incorrect","La query ping non è corretta"}.
{"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.","N.B.: Queste opzioni comportano il salvataggio solamente del database interno Mnesia. Se si sta utilizzando il modulo ODBC, è necessario salvare anche il proprio database SQL separatamente."}.
{"Please, wait for a while before sending new voice request","Attendi qualche istante prima di inviare una nuova richiesta di parola"}.
{"Pong","Pong"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Il possesso dell'attributo 'chiedi' non è consentito da RFC6121"}.
{"Present real Jabber IDs to","Rendere visibile il Jabber ID reale a"}.
{"Previous session not found","Sessione precedente non trovata"}.
{"Previous session PID has been killed","Il PID della sessione precedente è stato ucciso"}.
{"Previous session PID has exited","Il PID della sessione precedente è terminato"}.
{"Previous session PID is dead","Il PID della sessione precedente è morto"}.
{"Previous session timed out","La sessione precedente è scaduta"}.
{"private, ","privato, "}.
{"Public","Pubblico"}.
{"Publish model","Pubblica modello"}.
{"Publish-Subscribe","Pubblicazione-Iscrizione"}.
{"PubSub subscriber request","Richiesta di iscrizione per PubSub"}.
{"Purge all items when the relevant publisher goes offline","Cancella tutti gli elementi quando chi li ha pubblicati non è più online"}.
{"Push record not found","Record push non trovato"}.
{"Queries to the conference members are not allowed in this room","In questa stanza non sono consentite query ai membri della conferenza"}.
{"Query to another users is forbidden","La richiesta ad altri utenti è vietata"}.
{"RAM and disc copy","Copia in memoria (RAM) e su disco"}.
{"RAM copy","Copia in memoria (RAM)"}.
{"Really delete message of the day?","Si conferma l'eliminazione del messaggio del giorno (MOTD)?"}.
{"Receive notification from all descendent nodes","Ricevere una notifica da tutti i nodi discendenti"}.
{"Receive notification from direct child nodes only","Ricevere notifiche solo dai nodi figli diretti"}.
{"Receive notification of new items only","Ricevere una notifica solo per le nuove voce"}.
{"Receive notification of new nodes only","Ricevere solo la notifica di nuovi nodi"}.
{"Recipient is not in the conference room","Il destinatario non è nella stanza per conferenze"}.
{"Register an XMPP account","Registra un account XMPP"}.
{"Registered Users","Utenti registrati"}.
{"Registered Users:","Utenti registrati:"}.
{"Register","Registra"}.
{"Remote copy","Copia remota"}.
{"Remove All Offline Messages","Eliminare tutti i messaggi offline"}.
{"Remove User","Eliminare l'utente"}.
{"Remove a hat from a user","Rimuovere un cappello da un utente"}.
{"Remove All Offline Messages","Eliminare Tutti i Messaggi Offline"}.
{"Remove User","Rimuovere l'utente"}.
{"Remove","Eliminare"}.
{"Replaced by new connection","Sostituito da una nuova connessione"}.
{"Request has timed out","La richiesta è scaduta"}.
{"Request is ignored","La richiesta viene ignorata"}.
{"Requested role","Ruolo richiesto"}.
{"Resources","Risorse"}.
{"Restart Service","Riavviare il servizio"}.
{"Restart","Riavviare"}.
@@ -239,34 +449,53 @@
{"Restore binary backup immediately:","Recuperare un salvataggio binario adesso:"}.
{"Restore plain text backup immediately:","Recuperare un salvataggio come semplice testo adesso:"}.
{"Restore","Recuperare"}.
{"Roles and Affiliations that May Retrieve Member List","Ruoli e Affiliazioni che Possono Recuperare L'elenco dei Membri"}.
{"Roles for which Presence is Broadcasted","Ruoli per i quali viene Trasmessa la Presenza"}.
{"Roles that May Send Private Messages","Ruoli che possono inviare messaggi privati"}.
{"Room Configuration","Configurazione della stanza"}.
{"Room creation is denied by service policy","La creazione di stanze è impedita dalle politiche del servizio"}.
{"Room description","Descrizione della stanza"}.
{"Room Occupants","Presenti nella stanza"}.
{"Room terminates","La stanza termina"}.
{"Room title","Titolo della stanza"}.
{"Roster groups allowed to subscribe","Gruppi roster abilitati alla registrazione"}.
{"Roster of ~ts","Roster di ~ts"}.
{"Roster size","Dimensione della lista dei contatti"}.
{"Roster:","Lista dei contatti:"}.
{"RPC Call Error","Errore di chiamata RPC"}.
{"Running Nodes","Nodi attivi"}.
{"~s invites you to the room ~s","~s ti invita nella stanza ~s"}.
{"Saturday","Sabato"}.
{"Script check","Verifica dello script"}.
{"Search from the date","Cerca dalla data"}.
{"Search Results for ","Risultati della ricerca per "}.
{"Search the text","Cerca nel testo"}.
{"Search until the date","Cerca fino alla data"}.
{"Search users in ","Cercare utenti in "}.
{"Select All","Seleziona tutto"}.
{"Send announcement to all online users on all hosts","Inviare l'annuncio a tutti gli utenti online su tutti gli host"}.
{"Send announcement to all online users","Inviare l'annuncio a tutti gli utenti online"}.
{"Send announcement to all users on all hosts","Inviare l'annuncio a tutti gli utenti su tutti gli host"}.
{"Send announcement to all users","Inviare l'annuncio a tutti gli utenti"}.
{"September","Settembre"}.
{"Server:","Server:"}.
{"Service list retrieval timed out","Il recupero dell'elenco dei servizi è scaduto"}.
{"Session state copying timed out","La copia dello stato della sessione è scaduta"}.
{"Set message of the day and send to online users","Impostare il messaggio del giorno (MOTD) ed inviarlo agli utenti online"}.
{"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 Ordinary Table","Mostrare la tabella normale"}.
{"Shut Down Service","Terminare il servizio"}.
{"SOCKS5 Bytestreams","SOCKS5 flussi di byte"}.
{"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Alcuni client XMPP possono memorizzare la tua password nel computer, ma dovresti farlo solo sul tuo computer personale per motivi di sicurezza."}.
{"Sources Specs:","Sorgenti Specifiche:"}.
{"Specify the access model","Specificare il modello di accesso"}.
{"Specify the event message type","Specificare il tipo di messaggio di evento"}.
{"Specify the publisher model","Definire il modello di pubblicazione"}.
{"Stanza id is not valid","L'id della stanza non è valido"}.
{"Stanza ID","Stanza ID"}.
{"Statically specify a replyto of the node owner(s)","Specificare staticamente una risposta del proprietario(i) del nodo"}.
{"Statistics of ~p","Statistiche di ~p"}.
{"Statistics","Statistiche"}.
{"Stop","Arrestare"}.
@@ -274,64 +503,186 @@
{"Storage Type","Tipo di conservazione"}.
{"Store binary backup:","Conservare un salvataggio binario:"}.
{"Store plain text backup:","Conservare un salvataggio come semplice testo:"}.
{"Stream management is already enabled","La gestione del flusso è già abilitata"}.
{"Stream management is not enabled","La gestione del flusso non è abilitata"}.
{"Subject","Oggetto"}.
{"Submit","Inviare"}.
{"Submitted","Inviato"}.
{"Subscriber Address","Indirizzo dell'iscritta/o"}.
{"Subscribers may publish","I sottoscrittori possono pubblicare"}.
{"Subscription requests must be approved and only subscribers may retrieve items","Le richieste di sottoscrizione devono essere approvate e solo i sottoscrittori possono recuperare le voci"}.
{"Subscription","Iscrizione"}.
{"Subscriptions are not allowed","Le sottoscrizioni non sono consentite"}.
{"Sunday","Domenica"}.
{"Text associated with a picture","Testo associato a un'immagine"}.
{"Text associated with a sound","Testo associato a un suono"}.
{"Text associated with a video","Testo associato a un video"}.
{"Text associated with speech","Testo associato al parlato"}.
{"That nickname is already in use by another occupant","Il nickname è già in uso all'interno della conferenza"}.
{"That nickname is registered by another person","Questo nickname è registrato da un'altra persona"}.
{"The account already exists","L'account esiste già"}.
{"The account was not unregistered","L'account non era non registrato"}.
{"The body text of the last received message","Il corpo del testo dell'ultimo messaggio ricevuto"}.
{"The CAPTCHA is valid.","Il CAPTCHA è valido."}.
{"The CAPTCHA verification has failed","La verifica del CAPTCHA ha avuto esito negativo"}.
{"The captcha you entered is wrong","Il captcha che hai inserito è sbagliato"}.
{"The child nodes (leaf or collection) associated with a collection","I nodi figlio (foglia o raccolta) associati a una raccolta"}.
{"The collections with which a node is affiliated","Le collezioni a cui è affiliato un nodo"}.
{"The DateTime at which a leased subscription will end or has ended","Il DateTime in cui un abbonamento in leasing terminerà o è terminato"}.
{"The datetime when the node was created","La dataora in cui è stato creato il nodo"}.
{"The default language of the node","La lingua predefinita del nodo"}.
{"The feature requested is not supported by the conference","La funzionalità richiesta non è supportata dalla conferenza"}.
{"The JID of the node creator","Il JID del creatore del nodo"}.
{"The JIDs of those to contact with questions","I JID di coloro da contattare per domande"}.
{"The JIDs of those with an affiliation of owner","I JID di coloro che hanno un'affiliazione di proprietario"}.
{"The JIDs of those with an affiliation of publisher","I JID di coloro che hanno un'affiliazione di editore"}.
{"The list of all online users","L'elenco di tutti gli utenti online"}.
{"The list of all users","L'elenco di tutti gli utenti"}.
{"The list of JIDs that may associate leaf nodes with a collection","L'elenco dei JID che possono associare i nodi foglia a una collezione"}.
{"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","Il numero massimo di nodi figli che possono essere associati a una collezione, o `max` per non avere un limite specifico, se non quello imposto dal server"}.
{"The minimum number of milliseconds between sending any two notification digests","Il numero minimo di millisecondi tra l'invio di due digest di notifica qualsiasi"}.
{"The name of the node","Il nome del nodo"}.
{"The node is a collection node","Il nodo è un nodo di raccolta"}.
{"The node is a leaf node (default)","Il nodo è un nodo foglia (predefinito)"}.
{"The NodeID of the relevant node","Il NodeID del nodo rilevante"}.
{"The number of pending incoming presence subscription requests","Il numero di richieste di sottoscrizione di presenza in entrata in sospeso"}.
{"The number of subscribers to the node","Il numero di abbonati al nodo"}.
{"The number of unread or undelivered messages","Il numero di messaggi non letti o non consegnati"}.
{"The password contains unacceptable characters","La password contiene caratteri non accettabili"}.
{"The password is too weak","La password è troppo debole"}.
{"the password is","la password è"}.
{"The password of your XMPP account was successfully changed.","La password del tuo account XMPP è stata modificata con successo."}.
{"The password was not changed","La password non è stata modificata"}.
{"The passwords are different","Le password sono diverse"}.
{"The presence states for which an entity wants to receive notifications","Gli stati di presenza per i quali un'entità desidera ricevere le notifiche"}.
{"The query is only allowed from local users","La query è consentita solo da utenti locali"}.
{"The query must not contain <item/> elements","La query non deve contenere elementi <item/>"}.
{"The room subject can be modified by participants","L'oggetto della stanza potrà essere modificato dai partecipanti"}.
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","Le informazioni sul tipo semantico dei dati nel nodo, solitamente specificate dallo spazio dei nomi del payload (se presente)"}.
{"The sender of the last received message","Il mittente dell'ultimo messaggio ricevuto"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","La stanza DEVE contenere solo un elemento <active/>, un elemento <default/> o un elemento <list/>"}.
{"The subscription identifier associated with the subscription request","L'identificatore di sottoscrizione associato alla richiesta di sottoscrizione"}.
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","L'URL di una trasformazione XSL che può essere applicata ai payload per generare un elemento del corpo del messaggio appropriato."}.
{"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","L'URL di una trasformazione XSL che può essere applicata al formato del payload per generare un risultato valido di Data Forms che il client può visualizzare utilizzando un motore di rendering Data Forms generico"}.
{"There was an error changing the password: ","Si è verificato un errore durante la modifica della password: "}.
{"There was an error creating the account: ","Si è verificato un errore nella creazione dell'account: "}.
{"There was an error deleting the account: ","Si è verificato un errore nella cancellazione dell'account: "}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Questo è insensibile alle maiuscole: macbeth è lo stesso che MacBeth e 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.","Questa pagina consente di registrare un account XMPP in questo server XMPP. Il tuo JID (Jabber ID) sarà nel formato: nomeutente@server. Si prega di leggere attentamente le istruzioni per compilare correttamente i campi."}.
{"This page allows to unregister an XMPP account in this XMPP server.","Questa pagina consente di annullare la registrazione di un account XMPP in questo server XMPP."}.
{"This room is not anonymous","Questa stanza non è anonima"}.
{"This service can not process the address: ~s","Questo servizio non può elaborare l'indirizzo: ~s"}.
{"Thursday","Giovedì"}.
{"Time delay","Ritardo"}.
{"Timed out waiting for stream resumption","Timed out in attesa della ripresa dello stream"}.
{"Time","Ora"}.
{"To register, visit ~s","Per registrarsi, visita ~s"}.
{"To ~ts","A ~ts"}.
{"To","A"}.
{"Token TTL","Gettone TTL"}.
{"Too many active bytestreams","Troppi bytestream attivi"}.
{"Too many CAPTCHA requests","Troppe richieste CAPTCHA"}.
{"Too many child elements","Troppi elementi figlio"}.
{"Too many <item/> elements","Troppi elementi <item/>"}.
{"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 users in this conference","Troppi utenti in questa conferenza"}.
{"Total rooms","Stanze totali"}.
{"Traffic rate limit is exceeded","Limite di traffico superato"}.
{"Transactions Aborted:","Transazioni abortite:"}.
{"Transactions Committed:","Transazioni avvenute:"}.
{"Transactions Logged:","Transazioni con log:"}.
{"Transactions Restarted:","Transazioni riavviate:"}.
{"~ts's Offline Messages Queue","La Coda dei Messaggi Offline di ~ts"}.
{"Tuesday","Martedì"}.
{"Unable to generate a CAPTCHA","Impossibile generare un CAPTCHA"}.
{"Unable to register route on existing local domain","Impossibile registrare il percorso sul dominio locale esistente"}.
{"Unauthorized","Non autorizzato"}.
{"Unexpected action","Azione inaspettata"}.
{"Unexpected error condition: ~p","Condizione di errore imprevisto: ~p"}.
{"Uninstall","Disinstallare"}.
{"Unregister an XMPP account","Disregistrare un account XMPP"}.
{"Unregister","Elimina"}.
{"Unselect All","Deseleziona Tutto"}.
{"Unsupported <index/> element","Elemento <index/> non supportato"}.
{"Unsupported version","Versione non supportata"}.
{"Update message of the day (don't send)","Aggiornare il messaggio del giorno (MOTD) (non inviarlo)"}.
{"Update message of the day on all hosts (don't send)","Aggiornare il messaggio del giorno (MOTD) su tutti gli host (non inviarlo)"}.
{"Update ~p","Aggiorna ~p"}.
{"Update plan","Piano di aggiornamento"}.
{"Update script","Script di aggiornamento"}.
{"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"}.
{"Update","Aggiornare"}.
{"Upgrade","Aggiornamento"}.
{"Uptime:","Tempo dall'avvio:"}.
{"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 removed","Utente rimosso"}.
{"User session not found","Sessione utente non trovata"}.
{"User session terminated","Sessione utente terminata"}.
{"User ~ts","Utente ~ts"}.
{"Username:","Nome utente:"}.
{"Users are not allowed to register accounts so quickly","Non è consentito agli utenti registrare account così rapidamente"}.
{"Users Last Activity","Ultima attività degli utenti"}.
{"Users","Utenti"}.
{"User","Utente"}.
{"Validate","Validare"}.
{"Value 'get' of 'type' attribute is not allowed","Il valore 'get' dell'attributo 'type' non è consentito"}.
{"Value of '~s' should be boolean","Il valore di '~s' dovrebbe essere booleano"}.
{"Value of '~s' should be datetime string","Il valore di '~s' deve essere una stringa dataora"}.
{"Value of '~s' should be integer","Il valore di '~s' dovrebbe essere un intero"}.
{"Value 'set' of 'type' attribute is not allowed","Il valore 'set' dell'attributo 'type' non è consentito"}.
{"vCard User Search","Ricerca di utenti per vCard"}.
{"View joined MIX channels","Visualizza i canali MIX uniti"}.
{"View Queue","Visualizza Coda"}.
{"View Roster","Visualizza il Roster"}.
{"Virtual Hosts","Host Virtuali"}.
{"Visitors are not allowed to change their nicknames in this room","Non è consentito ai visitatori cambiare il nickname in questa stanza"}.
{"Visitors are not allowed to send messages to all occupants","Non è consentito ai visitatori l'invio di messaggi a tutti i presenti"}.
{"Visitor","Visitatore"}.
{"Voice request","Richiesta di parola"}.
{"Voice requests are disabled in this conference","In questa conferenza le richieste di parola sono escluse"}.
{"Wednesday","Mercoledì"}.
{"When a new subscription is processed and whenever a subscriber comes online","Quando viene elaborato una nuova sottoscrizione e ogni volta che una sottoscrizione entra in linea"}.
{"When a new subscription is processed","Quando viene elaborata una nuova sottoscrizione"}.
{"When to send the last published item","Quando inviare l'ultimo elemento pubblicato"}.
{"Whether to allow subscriptions","Consentire iscrizioni?"}.
{"Whether an entity wants to receive an XMPP message body in addition to the payload format","Se un'entità vuole ricevere un corpo del messaggio XMPP inoltre al formato del payload"}.
{"Whether an entity wants to receive digests (aggregations) of notifications or all notifications individually","Se un'entità desidera ricevere i digest (aggregazioni) di notifiche o tutte le notifiche individualmente"}.
{"Whether an entity wants to receive or disable notifications","Se un'entità desidera ricevere o disabilitare le notifiche"}.
{"Whether owners or publisher should receive replies to items","Se i proprietari o l'editore dovrebbero ricevere le risposte alle voci"}.
{"Whether the node is a leaf (default) or a collection","Se il nodo è una foglia (impostazione predefinita) o una collezione"}.
{"Whether to allow subscriptions","Se consentire le iscrizioni"}.
{"Whether to make all subscriptions temporary, based on subscriber presence","Se rendere temporanee tutte le sottoscrizioni, in base alla presenza della sottoscrizione"}.
{"Whether to notify owners about new subscribers and unsubscribes","Se notificare ai proprietari le nuove sottoscrizioni e le cancellazioni"}.
{"Who can send private messages","Chi può inviare messaggi privati"}.
{"Who may associate leaf nodes with a collection","Chi può associare i nodi foglia a una collezione"}.
{"Wrong parameters in the web formulary","Parametri errati nel formulario web"}.
{"Wrong xmlns","xmlns errati"}.
{"XMPP Account Registration","Registrazione dell'account XMPP"}.
{"XMPP Domains","Domini XMPP"}.
{"XMPP Show Value of Away","XMPP Mostra Valore di Assenza"}.
{"XMPP Show Value of Chat","XMPP Mostra il Valore della Chat"}.
{"XMPP Show Value of DND (Do Not Disturb)","XMPP Mostra Valore di DND (Non Disturbare)"}.
{"XMPP Show Value of XA (Extended Away)","XMPP Mostra Valore di XA (Extended Away)"}.
{"XMPP URI of Associated Publish-Subscribe Node","URI XMPP del Nodo di Pubblicazione-Sottoscrizione Associato"}.
{"You are being removed from the room because of a system shutdown","Stai per essere rimosso dalla stanza a causa di un arresto del sistema"}.
{"You are not allowed to send private messages","Non ti è consentito inviare messaggi privati"}.
{"You are not joined to the channel","Non si è connessi al canale"}.
{"You can later change your password using an XMPP client.","È possibile modificare successivamente la tua password utilizzando un client XMPP."}.
{"You have been banned from this room","Sei stata/o bandita/o da questa stanza"}.
{"You have joined too many conferences","Hai partecipato a troppe conferenze"}.
{"You must fill in field \"Nickname\" in the form","Si deve riempire il campo \"Nickname\" nel modulo"}.
{"You need a client that supports x:data and CAPTCHA to register","La registrazione richiede un client che supporti x:data e CAPTCHA"}.
{"You need a client that supports x:data to register the nickname","Per registrare il nickname è necessario un client che supporti x:data"}.
{"You need an x:data capable client to search","Per effettuare ricerche è necessario un client che supporti x:data"}.
{"Your active privacy list has denied the routing of this stanza.","In base alla tua attuale lista privacy questa stanza è stata esclusa dalla navigazione."}.
{"Your contact offline message queue is full. The message has been discarded.","La coda dei messaggi offline del contatto è piena. Il messaggio è stato scartato"}.
{"Your contact offline message queue is full. The message has been discarded.","La coda dei messaggi offline del contatto è piena. Il messaggio è stato scartato."}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","I messaggi verso ~s sono bloccati. Per sbloccarli, visitare ~s"}.
{"Your XMPP account was successfully registered.","Il tuo account XMPP è stato registrato con successo."}.
{"Your XMPP account was successfully unregistered.","L'account XMPP è stato disregistrato con successo."}.
{"You're not allowed to create nodes","Non ti è consentito creare nodi"}.
+46 -2
View File
@@ -4,7 +4,7 @@
%% 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: "," はを設定しました: "}.
{"A description of the node","ノードの説明"}.
{"A friendly name for the node","ノードのフレンドリネーム"}.
{"A password is required to enter this room","このチャットルームに入るにはパスワードが必要です"}.
@@ -36,6 +36,7 @@
{"Anyone","誰にでも"}.
{"April","4月"}.
{"August","8月"}.
{"Automatic node creation is not enabled","ノードの自動作成は有効になっていません"}.
{"Backup Management","バックアップ管理"}.
{"Backup of ~p","バックアップ: ~p"}.
{"Backup to File at ","ファイルにバックアップ: "}.
@@ -44,11 +45,13 @@
{"Birthday","誕生日"}.
{"Both the username and the resource are required","ユーザー名とリソースの両方が必要"}.
{"CAPTCHA web page","CAPTCHA ウェブページ"}.
{"Challenge ID","チャレンジ ID"}.
{"Change Password","パスワードを変更"}.
{"Change User Password","パスワードを変更"}.
{"Changing password is not allowed","パスワード変更の権限がありません"}.
{"Channel already exists","チャンネルは既に存在します"}.
{"Channel does not exist","チャンネルは存在しません"}.
{"Channel JID","チャンネル ID"}.
{"Channels","チャンネル"}.
{"Characters not allowed:","使用できない文字:"}.
{"Chatroom configuration modified","チャットルームの設定が変更されました"}.
@@ -70,6 +73,7 @@
{"Country","国"}.
{"CPU Time:","CPU時間:"}.
{"Current Discussion Topic","現在の話題"}.
{"Database failure","データーベース障害"}.
{"Database Tables at ~p","データーベーステーブル: ~p"}.
{"Database Tables Configuration at ","データーベーステーブル設定 "}.
{"Database","データーベース"}.
@@ -117,8 +121,11 @@
{"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 extract JID from your voice request approval","発言権要求の承認から JID を取り出すことに失敗しました"}.
{"Failed to parse HTTP response","HTTP 応答のパースに失敗しました"}.
{"Failed to process option '~s'","オプション '~s' の処理に失敗しました"}.
{"Family Name","姓"}.
{"February","2月"}.
{"Fill in the form to search for any matching XMPP User","XMPP ユーザーを検索するには欄に入力してください"}.
@@ -128,8 +135,11 @@
{"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 Password","パスワードを取得"}.
{"Get User Statistics","ユーザー統計を取得"}.
@@ -158,17 +168,21 @@
{"Incoming s2s Connections:","内向き s2s コネクション:"}.
{"Incorrect data form","データ形式が違います"}.
{"Incorrect password","パスワードが違います"}.
{"Installed Modules:","インストールされているモジュール:"}.
{"Install","インストール"}.
{"Insufficient privilege","権限が不十分です"}.
{"Internal server error","内部サーバーエラー"}.
{"Invalid node name","無効なノード名です"}.
{"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\"","種別が\"groupchat\" であるプライベートメッセージを送信することはできません"}.
{"It is not allowed to send private messages to the conference","この会議にプライベートメッセージを送信することはできません"}.
{"It is not allowed to send private messages","プライベートメッセージを送信することはできません"}.
{"Jabber ID","Jabber ID"}.
{"January","1月"}.
{"JID normalization failed","JID の正規化に失敗しました"}.
{"joins the room","がチャットルームに参加しました"}.
{"July","7月"}.
{"June","6月"}.
@@ -217,14 +231,22 @@
{"Nickname Registration at ","ニックネーム登録: "}.
{"Nickname ~s does not exist in the room","ニックネーム ~s はこのチャットルームにいません"}.
{"Nickname","ニックネーム"}.
{"No address elements found","アドレス要素が見つかりません"}.
{"No addresses element found","アドレス要素が見つかりません"}.
{"No body provided for announce message","アナウンスメッセージはありませんでした"}.
{"No child elements found","子要素が見つかりません"}.
{"No Data","データなし"}.
{"No <forwarded/> element found","<forwarded/> 要素が見つかりません"}.
{"No 'item' element found","'item' 要素が見つかりません"}.
{"No limit","制限なし"}.
{"No 'password' found in this query","このクエリに 'password' が見つかりません"}.
{"No services available","利用できるサービスはありません"}.
{"Node already exists","ノードは既に存在しています"}.
{"Node ID","ノードID"}.
{"Node not found","ノードが見つかりません"}.
{"Node ~p","ノード ~p"}.
{"Nodes","ノード"}.
{"Node","ノード"}.
{"None","なし"}.
{"Not Found","見つかりません"}.
{"Notify subscribers when items are removed from the node","アイテムがノードから消された時に購読者へ通知する"}.
@@ -246,6 +268,8 @@
{"Online Users:","オンラインユーザー:"}.
{"Online","オンライン"}.
{"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","モデレーターのみがチャットルームの件名を変更できます"}.
@@ -259,6 +283,7 @@
{"Outgoing s2s Connections:","外向き s2s コネクション:"}.
{"Owner privileges required","主宰者の権限が必要です"}.
{"Packet","パケット"}.
{"Participant ID","参加者 ID"}.
{"Participant","参加者"}.
{"Password Verification","パスワード (確認)"}.
{"Password Verification:","パスワード (確認):"}.
@@ -275,11 +300,14 @@
{"Please, wait for a while before sending new voice request","新しい発言権の要求を送るまで少し間をおいてください"}.
{"Pong","Pong"}.
{"Present real Jabber IDs to","本当の Jabber ID を公開"}.
{"Previous session not found","前のセッションが見つかりません"}.
{"private, ","プライベート、"}.
{"Public","公開"}.
{"Publish-Subscribe","Publish-Subscribe"}.
{"PubSub subscriber request","PubSub 購読者のリクエスト"}.
{"Purge all items when the relevant publisher goes offline","公開者がオフラインになるときに、すべてのアイテムを削除"}.
{"Queries to the conference members are not allowed in this room","このチャットルームでは、会議のメンバーへのクエリーは禁止されています"}.
{"Query to another users is forbidden","他のユーザーへのクエリは禁止されています"}.
{"RAM and disc copy","RAM, ディスクコピー"}.
{"RAM copy","RAM コピー"}.
{"Really delete message of the day?","本当にお知らせメッセージを削除しますか ?"}.
@@ -293,6 +321,7 @@
{"Remove User","ユーザーを削除"}.
{"Remove","削除"}.
{"Replaced by new connection","新しいコネクションによって置き換えられました"}.
{"Request is ignored","リクエストは無視されます"}.
{"Resources","リソース"}.
{"Restart Service","サービスを再起動"}.
{"Restart","再起動"}.
@@ -331,6 +360,7 @@
{"Show Integral Table","累積の表を表示"}.
{"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.","XMPP クライアントはコンピューターにパスワードを記憶できます。コンピューターが安全であると信頼できる場合にのみ、この機能を使用してください。"}.
{"Specify the access model","アクセスモデルを設定する"}.
{"Specify the event message type","イベントメッセージ種別を設定"}.
@@ -378,6 +408,7 @@
{"Too many CAPTCHA requests","CAPTCHA 要求が多すぎます"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","~p回の認証に失敗しました。このIPアドレス(~s)は~s UTCまでブロックされます。"}.
{"Too many unacked stanzas","多くのスタンザが応答していません"}.
{"Too many users in this conference","この会議にはユーザーが多すぎます"}.
{"Total rooms","チャットルーム数"}.
{"To","To"}.
{"Traffic rate limit is exceeded","トラフィックレートの制限を超えました"}.
@@ -389,8 +420,12 @@
{"Tuesday","火曜日"}.
{"Unable to generate a CAPTCHA","CAPTCHA を生成できません"}.
{"Unauthorized","認証されていません"}.
{"Unexpected action","予期しないアクション"}.
{"Unexpected error condition: ~p","予期しないエラー状態: ~p"}.
{"Uninstall","アンインストール"}.
{"Unregister an XMPP account","XMPP アカウントを削除"}.
{"Unregister","削除"}.
{"Unselect All","すべての選択を解除"}.
{"Unsupported version","対応していないバージョン"}.
{"Update message of the day (don't send)","お知らせメッセージを更新 (送信しない)"}.
{"Update message of the day on all hosts (don't send)","全ホストのお知らせメッセージを更新 (送信しない)"}.
@@ -398,12 +433,15 @@
{"Update ~p","更新 ~p"}.
{"Update script","スクリプトの更新"}.
{"Update","更新"}.
{"Upgrade","アップグレード"}.
{"Uptime:","起動時間:"}.
{"User already exists","ユーザーは既に存在しています"}.
{"User (jid)","ユーザー (JID)"}.
{"User JID","ユーザー JID"}.
{"User Management","ユーザー管理"}.
{"User removed","ユーザーを削除しました"}.
{"User session not found","ユーザーセッションが見つかりません"}.
{"User session terminated","ユーザーセッションが終了しました"}.
{"User ~ts","ユーザー ~ts"}.
{"Username:","ユーザー名:"}.
{"Users are not allowed to register accounts so quickly","それほど速くアカウントを登録することはできません"}.
@@ -411,6 +449,8 @@
{"Users","ユーザー"}.
{"User","ユーザー"}.
{"Validate","検証"}.
{"Value of '~s' should be boolean","'~s' の値はブール値である必要があります"}.
{"Value of '~s' should be integer","'~s' の値は整数である必要があります"}.
{"vCard User Search","vCard検索"}.
{"View Queue","キューを表示"}.
{"View Roster","名簿を表示"}.
@@ -421,11 +461,15 @@
{"Voice requests are disabled in this conference","この会議では、発言権の要求はできません"}.
{"Voice request","発言権を要求"}.
{"Wednesday","水曜日"}.
{"When a new subscription is processed","新しい購読が処理されるとき"}.
{"When to send the last published item","最後の公開アイテムを送信するタイミングで"}.
{"Whether to allow subscriptions","購読を許可するかどうか"}.
{"Who can send private messages","誰がプライベートメッセージを送れるか"}.
{"XMPP Account Registration","XMPP アカウント登録"}.
{"XMPP Domains","XMPP ドメイン"}.
{"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 must fill in field \"Nickname\" in the form","フォームの\"ニックネーム\"欄を入力する必要があります"}.
+1 -1
View File
@@ -3,6 +3,7 @@
%% To improve translations please read:
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
{" (Add * to the end of field to match substring)"," Gebruik de velden om te zoeken (Voeg achteraan het teken * toe om te zoeken naar alles wat met het eerste deel begint.)."}.
{" has set the subject to: "," veranderde het onderwerp in: "}.
{"A friendly name for the node","Bijnaam voor deze knoop"}.
{"A password is required to enter this room","U hebt een wachtwoord nodig om deze chatruimte te kunnen betreden"}.
@@ -129,7 +130,6 @@
{"is now known as","heet nu"}.
{"It is not allowed to send private messages of type \"groupchat\"","Er mogen geen privéberichten van het type \"groupchat\" worden verzonden"}.
{"It is not allowed to send private messages to the conference","Er mogen geen privéberichten naar de chatruimte worden verzonden"}.
{"It is not allowed to send private messages","Het is niet toegestaan priveberichten te sturen"}.
{"Jabber ID","Jabber ID"}.
{"January","Januari"}.
{"joins the room","betrad de chatruimte"}.
-3
View File
@@ -8,8 +8,6 @@
{"A password is required to enter this room","Et passord kreves for tilgang til samtalerommet"}.
{"Accept","Godta"}.
{"Access denied by service policy","Tilgang nektes på grunn av en tjenesteregel"}.
{"Access model of presence","Tilgangsmodell for tilstedeværelse"}.
{"Access model of roster","Tilgangsmodell for kontaktliste"}.
{"Action on user","Handling på bruker"}.
{"Add Jabber ID","Legg til Jabber-ID"}.
{"Add New","Legg til ny"}.
@@ -141,7 +139,6 @@
{"IP addresses","IP-adresser"}.
{"is now known as","er nå kjent som"}.
{"It is not allowed to send private messages to the conference","Det er ikke tillatt å sende private meldinger til konferansen"}.
{"It is not allowed to send private messages","Det er ikke tillatt å sende private meldinger"}.
{"Jabber ID","Jabber-ID"}.
{"January","januar"}.
{"JID normalization failed","JID-normalisering mislyktes"}.
-1
View File
@@ -159,7 +159,6 @@
{"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","Użytkownik nie może wysyłać wiadomości o błędach do pokoju. Użytkownik (~s) wysłał błąd (~s) i został wyrzucony z pokoju"}.
{"It is not allowed to send private messages of type \"groupchat\"","Nie można wysyłać prywatnych wiadomości typu \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Nie wolno wysyłac prywatnych wiadomości na konferencję"}.
{"It is not allowed to send private messages","Wysyłanie prywatnych wiadomości jest zabronione"}.
{"Jabber ID","Jabber ID"}.
{"January","Styczeń"}.
{"joins the room","dołącza do pokoju"}.
+11 -12
View File
@@ -12,11 +12,6 @@
{"A Web Page","Uma página da web"}.
{"Accept","Aceito"}.
{"Access denied by service policy","Acesso negado pela política do serviço"}.
{"Access model of authorize","Modelo de acesso da autorização"}.
{"Access model of open","Modelo para acesso aberto"}.
{"Access model of presence","Modelo para acesso presença"}.
{"Access model of roster","Modelo para acesso lista"}.
{"Access model of whitelist","Modelo de acesso da lista branca"}.
{"Access model","Modelo de acesso"}.
{"Account doesn't exist","A conta não existe"}.
{"Action on user","Ação no usuário"}.
@@ -53,6 +48,7 @@
{"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"}.
{"Apparently your account has no administration rights in this server. Please check how to grant admin rights in: https://docs.ejabberd.im/admin/installation/#administration-account","Aparentemente, a sua conta não tem direitos de administração neste servidor. Verifique como conceder os direitos administrativos em: https://docs.ejabberd.im/admin/installation/#administration-account"}.
{"April","Abril"}.
{"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"}.
@@ -182,7 +178,7 @@
{"Get User Last Login Time","Obter a Data do Último Login"}.
{"Get User Password","Obter Senha do Usuário"}.
{"Get User Statistics","Obter Estatísticas do Usuário"}.
{"Given Name","Sobrenome"}.
{"Given Name","Prenome"}.
{"Grant voice to this person?","Dar voz a esta pessoa?"}.
{"Group","Grupo"}.
{"Groups that will be displayed to the members","Os grupos que serão exibidos para os membros"}.
@@ -230,7 +226,6 @@
{"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","Não é permitido o envio de mensagens de erro para a sala. O membro (~s) enviou uma mensagem de erro (~s) e foi expulso da sala"}.
{"It is not allowed to send private messages of type \"groupchat\"","Não é permitido enviar mensagens privadas do tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Não é permitido enviar mensagens privadas para a sala de conferência"}.
{"It is not allowed to send private messages","Não é permitido enviar mensagens privadas"}.
{"Jabber ID","ID Jabber"}.
{"January","Janeiro"}.
{"JID normalization denied by service policy","Normalização JID negada por causa da política de serviços"}.
@@ -250,7 +245,7 @@
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Bits menos significativos do hash sha-256 do texto devem ser iguais ao rótulo hexadecimal"}.
{"leaves the room","Sair da sala"}.
{"List of rooms","Lista de salas"}.
{"List of users with hats","Lista os usuários com chapéus"}.
{"List of users with hats","Lista dos usuários com chapéus"}.
{"List users with hats","Lista os usuários com chapéus"}.
{"Logging","Registrando no log"}.
{"Low level update script","Script de atualização low level"}.
@@ -351,7 +346,7 @@
{"Notify subscribers when the node is deleted","Notificar assinantes quando o nó for eliminado se elimine"}.
{"November","Novembro"}.
{"Number of answers required","Quantidade de respostas necessárias"}.
{"Number of occupants","Número de participantes"}.
{"Number of occupants","Quantidade de ocupantes"}.
{"Number of Offline Messages","Quantidade das mensagens offline"}.
{"Number of online users","Número de usuários online"}.
{"Number of registered users","Número de usuários registrados"}.
@@ -375,6 +370,7 @@
{"Only members may query archives of this room","Somente os membros podem procurar nos arquivos desta sala"}.
{"Only moderators and participants are allowed to change the subject in this room","Somente os moderadores e os participamentes podem alterar o assunto desta sala"}.
{"Only moderators are allowed to change the subject in this room","Somente os moderadores podem alterar o assunto desta sala"}.
{"Only moderators are allowed to retract messages","Apenas moderadores estão autorizados a retirar mensagens"}.
{"Only moderators can approve voice requests","Somente moderadores podem aprovar requisições de voz"}.
{"Only occupants are allowed to send messages to the conference","Somente os ocupantes podem enviar mensagens à sala de conferência"}.
{"Only occupants are allowed to send queries to the conference","Somente os ocupantes podem enviar consultas à sala de conferência"}.
@@ -398,7 +394,7 @@
{"Password:","Senha:"}.
{"Path to Dir","Caminho para o diretório"}.
{"Path to File","Caminho do arquivo"}.
{"Payload type","Tipo da carga útil"}.
{"Payload semantic type information","Informações de tipo semântico de carga útil"}.
{"Pending","Pendente"}.
{"Period: ","Período: "}.
{"Persist items to storage","Persistir elementos ao armazenar"}.
@@ -459,7 +455,7 @@
{"Room Configuration","Configuração de salas"}.
{"Room creation is denied by service policy","Sala não pode ser criada devido à política do serviço"}.
{"Room description","Descrição da Sala"}.
{"Room Occupants","Número de participantes"}.
{"Room Occupants","Ocupantes do quarto"}.
{"Room terminates","Terminação da sala"}.
{"Room title","Título da sala"}.
{"Roster groups allowed to subscribe","Listar grupos autorizados"}.
@@ -497,6 +493,7 @@
{"Specify the access model","Especificar os modelos de acesso"}.
{"Specify the event message type","Especificar o tipo de mensagem para o evento"}.
{"Specify the publisher model","Especificar o modelo do publicante"}.
{"Stanza id is not valid","A Stanza ID não é válido"}.
{"Stanza ID","ID da estrofe"}.
{"Statically specify a replyto of the node owner(s)","Defina uma resposta fixa do(s) proprietário(s) do nó"}.
{"Statistics of ~p","Estatísticas de ~p"}.
@@ -561,10 +558,10 @@
{"The query is only allowed from local users","Esta consulta só é permitida a partir de usuários locais"}.
{"The query must not contain <item/> elements","A consulta não pode conter elementos <item/>"}.
{"The room subject can be modified by participants","O tema da sala pode ser alterada pelos próprios participantes"}.
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","Informações de tipo semântico dos dados no nó, geralmente especificadas pelo espaço de nomes da carga útil (se houver)"}.
{"The sender of the last received message","O remetente da última mensagem que foi recebida"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","A instância DEVE conter apenas um elemento <active/>, um elemento <default/>, ou um elemento <list/>"}.
{"The subscription identifier associated with the subscription request","O identificador da assinatura associado à solicitação da assinatura"}.
{"The type of node data, usually specified by the namespace of the payload (if any)","O tipo dos dados do nó, normalmente definido pelo espaço dos nomes da carga útil (caso haja)"}.
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","O URL da transformação XSL que pode ser aplicada nas cargas úteis para gerar um elemento apropriado no corpo da mensagem."}.
{"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","A URL de uma transformação XSL que pode ser aplicada ao formato de carga útil para gerar um Formulário de Dados válido onde o cliente possa exibir usando um mecanismo genérico de renderização do Formulários de Dados"}.
{"There was an error changing the password: ","Houve um erro ao alterar a senha: "}.
@@ -663,6 +660,7 @@
{"Whether to allow subscriptions","Permitir subscrições"}.
{"Whether to make all subscriptions temporary, based on subscriber presence","Caso todas as assinaturas devam ser temporárias, com base na presença do assinante"}.
{"Whether to notify owners about new subscribers and unsubscribes","Caso deva notificar os proprietários sobre os novos assinantes e aqueles que cancelaram a assinatura"}.
{"Who can send private messages","Quem pode enviar mensagens privadas"}.
{"Who may associate leaf nodes with a collection","Quem pode associar as folhas dos nós em uma coleção"}.
{"Wrong parameters in the web formulary","O formulário web está com os parâmetros errados"}.
{"Wrong xmlns","Xmlns errado"}.
@@ -674,6 +672,7 @@
{"XMPP Show Value of XA (Extended Away)","XMPP Exiba o valor do XA (Ausência Estendida)"}.
{"XMPP URI of Associated Publish-Subscribe Node","XMPP URI da publicação do nó associado da assinatura"}.
{"You are being removed from the room because of a system shutdown","Você está sendo removido da sala por causa do desligamento do sistema"}.
{"You are not allowed to send private messages","Você não tem permissão para enviar mensagens privadas"}.
{"You are not joined to the channel","Você não está inscrito no canal"}.
{"You can later change your password using an XMPP client.","Você pode alterar a sua senha mais tarde usando um cliente XMPP."}.
{"You have been banned from this room","Você foi banido desta sala"}.
+27 -9
View File
@@ -3,7 +3,7 @@
%% To improve translations please read:
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
{" (Add * to the end of field to match substring)"," (Adicione * no final do campo para combinar com a substring)"}.
{" (Add * to the end of field to match substring)"," (Adicione * no final do campo para combinar com a sub-cadeia)"}.
{" has set the subject to: "," colocou o tópico: "}.
{"# participants","# participantes"}.
{"A description of the node","Uma descrição do nó"}.
@@ -12,11 +12,6 @@
{"A Web Page","Uma página da web"}.
{"Accept","Aceito"}.
{"Access denied by service policy","Acesso negado pela política de serviço"}.
{"Access model of authorize","Modelo de acesso da autorização"}.
{"Access model of open","Modelo para acesso aberto"}.
{"Access model of presence","Modelo para acesso presença"}.
{"Access model of roster","Modelo para acesso lista"}.
{"Access model of whitelist","Modelo de acesso da lista branca"}.
{"Access model","Modelo de acesso"}.
{"Account doesn't exist","A conta não existe"}.
{"Action on user","Acção no utilizador"}.
@@ -53,6 +48,7 @@
{"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"}.
{"Apparently your account has no administration rights in this server. Please check how to grant admin rights in: https://docs.ejabberd.im/admin/installation/#administration-account","Aparentemente, a sua conta não tem direitos de administração neste servidor. Verifique como conceder os direitos administrativos em: https://docs.ejabberd.im/admin/installation/#administration-account"}.
{"April","Abril"}.
{"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"}.
@@ -79,6 +75,7 @@
{"Changing role/affiliation is not allowed","Não é permitida a alteração da função/afiliação"}.
{"Channel already exists","O canal já existe"}.
{"Channel does not exist","O canal não existe"}.
{"Channel JID","Canal JID"}.
{"Channels","Canais"}.
{"Characters not allowed:","Caracteres não aceitos:"}.
{"Chatroom configuration modified","Configuração da sala de bate-papo modificada"}.
@@ -98,6 +95,7 @@
{"Configuration","Configuração"}.
{"Connected Resources:","Recursos conectados:"}.
{"Contact Addresses (normally, room owner or owners)","Endereços de contato (normalmente, o proprietário ou os proprietários da sala)"}.
{"Contrib Modules","Módulos contrib"}.
{"Country","País"}.
{"CPU Time:","Tempo da CPU:"}.
{"Current Discussion Topic","Assunto em discussão"}.
@@ -172,6 +170,8 @@
{"Full List of Room Admins","Lista completa dos administradores das salas"}.
{"Full List of Room Owners","Lista completa dos proprietários das salas"}.
{"Full Name","Nome completo"}.
{"Get List of Online Users","Obter a lista de utilizadores online"}.
{"Get List of Registered Users","Obter a lista de utilizadores registados"}.
{"Get Number of Online Users","Obter quantidade de utilizadores online"}.
{"Get Number of Registered Users","Obter quantidade de utilizadores registados"}.
{"Get Pending","Obter os pendentes"}.
@@ -213,6 +213,8 @@
{"Incorrect value of 'action' attribute","Valor incorreto do atributo 'action'"}.
{"Incorrect value of 'action' in data form","Valor incorreto de 'action' no formulário de dados"}.
{"Incorrect value of 'path' in data form","Valor incorreto de 'path' no formulário de dados"}.
{"Installed Modules:","Módulos instalados:"}.
{"Install","Instalar"}.
{"Insufficient privilege","Privilégio insuficiente"}.
{"Internal server error","Erro interno do servidor"}.
{"Invalid 'from' attribute in forwarded message","Atributo 'from' inválido na mensagem reenviada"}.
@@ -224,11 +226,12 @@
{"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","Não é permitido o envio de mensagens de erro para a sala. O membro (~s) enviou uma mensagem de erro (~s) e foi expulso da sala"}.
{"It is not allowed to send private messages of type \"groupchat\"","Não é permitido enviar mensagens privadas do tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Impedir o envio de mensagens privadas para a sala"}.
{"It is not allowed to send private messages","Não é permitido enviar mensagens privadas"}.
{"Jabber ID","ID Jabber"}.
{"January","Janeiro"}.
{"JID normalization denied by service policy","Normalização JID negada por causa da política de serviços"}.
{"JID normalization failed","A normalização JID falhou"}.
{"Joined MIX channels of ~ts","Entrou no canais MIX do ~ts"}.
{"Joined MIX channels:","Uniu-se aos canais MIX:"}.
{"joins the room","Entrar na sala"}.
{"July","Julho"}.
{"June","Junho"}.
@@ -349,6 +352,7 @@
{"Number of registered users","Quantidade de utilizadores registados"}.
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Quantidade de segundos após limpar automaticamente os itens ou `max` para nenhum limite específico que não seja um servidor imposto máximo"}.
{"Occupants are allowed to invite others","As pessoas estão autorizadas a convidar outras pessoas"}.
{"Occupants are allowed to query others","Os ocupantes estão autorizados a consultar os outros"}.
{"Occupants May Change the Subject","As pessoas talvez possam alterar o assunto"}.
{"October","Outubro"}.
{"Offline Messages","Mensagens offline"}.
@@ -366,6 +370,7 @@
{"Only members may query archives of this room","Somente os membros podem procurar nos arquivos desta sala"}.
{"Only moderators and participants are allowed to change the subject in this room","Somente os moderadores e os participamentes podem alterar o assunto desta sala"}.
{"Only moderators are allowed to change the subject in this room","Somente os moderadores podem alterar o assunto desta sala"}.
{"Only moderators are allowed to retract messages","Apenas moderadores estão autorizados de retirar mensagens"}.
{"Only moderators can approve voice requests","Somente moderadores podem aprovar requisições de voz"}.
{"Only occupants are allowed to send messages to the conference","Só os ocupantes podem enviar mensagens para a sala"}.
{"Only occupants are allowed to send queries to the conference","Só os ocupantes podem enviar consultas para a sala"}.
@@ -375,11 +380,13 @@
{"Only those on a whitelist may subscribe and retrieve items","Apenas aqueles presentes numa lista branca podem se inscrever e recuperar os itens"}.
{"Organization Name","Nome da organização"}.
{"Organization Unit","Unidade da organização"}.
{"Other Modules Available:","Outros módulos disponíveis:"}.
{"Outgoing s2s Connections","Conexões s2s de Saída"}.
{"Outgoing s2s Connections:","Saída das conexões s2s:"}.
{"Owner privileges required","São necessários privilégios de dono"}.
{"Packet relay is denied by service policy","A retransmissão de pacote é negada por causa da política de serviço"}.
{"Packet","Pacote"}.
{"Participant ID","ID do participante"}.
{"Participant","Participante"}.
{"Password Verification:","Verificação da Palavra-passe:"}.
{"Password Verification","Verificação de Palavra-passe"}.
@@ -387,7 +394,7 @@
{"Password:","Palavra-chave:"}.
{"Path to Dir","Caminho para o directório"}.
{"Path to File","Caminho do ficheiro"}.
{"Payload type","Tipo da carga útil"}.
{"Payload semantic type information","Informações de tipo semântico de carga útil"}.
{"Pending","Pendente"}.
{"Period: ","Período: "}.
{"Persist items to storage","Persistir elementos ao armazenar"}.
@@ -482,9 +489,11 @@
{"Shut Down Service","Parar Serviço"}.
{"SOCKS5 Bytestreams","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.","Alguns clientes XMPP podem armazenar a sua palavra-passe no seu computador, só faça isso no seu computador particular por questões de segurança."}.
{"Sources Specs:","Especificações das fontes:"}.
{"Specify the access model","Especificar os modelos de acesso"}.
{"Specify the event message type","Especificar o tipo de mensagem para o evento"}.
{"Specify the publisher model","Especificar o modelo do publicante"}.
{"Stanza id is not valid","A Stanza ID é inválido"}.
{"Stanza ID","ID da estrofe"}.
{"Statically specify a replyto of the node owner(s)","Defina uma resposta fixa do(s) proprietário(s) do nó"}.
{"Statistics of ~p","Estatísticas de ~p"}.
@@ -527,6 +536,8 @@
{"The JIDs of those to contact with questions","Os JIDs daqueles para entrar em contato com perguntas"}.
{"The JIDs of those with an affiliation of owner","Os JIDs daqueles com uma afiliação de proprietário"}.
{"The JIDs of those with an affiliation of publisher","Os JIDs daqueles com uma afiliação de editor"}.
{"The list of all online users","A lista de todos os utilizadores online"}.
{"The list of all users","A lista de todos os utilizadores"}.
{"The list of JIDs that may associate leaf nodes with a collection","A lista dos JIDs que podem associar as páginas dos nós numa coleção"}.
{"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","A quantidade máxima de nós relacionados que podem ser associados a uma coleção ou `máximo` para nenhum limite específico que não seja um servidor imposto no máximo"}.
{"The minimum number of milliseconds between sending any two notification digests","A quantidade mínima de milissegundos entre o envio do resumo das duas notificações"}.
@@ -547,10 +558,10 @@
{"The query is only allowed from local users","Esta consulta só é permitida a partir de utilizadores locais"}.
{"The query must not contain <item/> elements","A consulta não pode conter elementos <item/>"}.
{"The room subject can be modified by participants","O tema da sala pode ser alterada pelos próprios participantes"}.
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","Informações de tipo semântico dos dados no nó, geralmente especificadas pelo espaço de nomes da carga útil (se houver)"}.
{"The sender of the last received message","O remetente da última mensagem que foi recebida"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","A instância DEVE conter apenas um elemento <active/>, um elemento <default/>, ou um elemento <list/>"}.
{"The subscription identifier associated with the subscription request","O identificador da assinatura associado à solicitação da assinatura"}.
{"The type of node data, usually specified by the namespace of the payload (if any)","O tipo dos dados do nó, normalmente definido pelo espaço dos nomes da carga útil (caso haja)"}.
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","O URL da transformação XSL que pode ser aplicada nas cargas úteis para gerar um elemento apropriado no corpo da mensagem."}.
{"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","A URL de uma transformação XSL que pode ser aplicada ao formato de carga útil para gerar um Formulário de Dados válido onde o cliente possa exibir usando um mecanismo genérico de renderização do Formulários de Dados"}.
{"There was an error changing the password: ","Houve um erro ao alterar a palavra-passe: "}.
@@ -591,6 +602,7 @@
{"Unauthorized","Não Autorizado"}.
{"Unexpected action","Ação inesperada"}.
{"Unexpected error condition: ~p","Condição de erro inesperada: ~p"}.
{"Uninstall","Desinstalar"}.
{"Unregister an XMPP account","Excluir uma conta XMPP"}.
{"Unregister","Deletar registo"}.
{"Unselect All","Desmarcar todos"}.
@@ -601,7 +613,10 @@
{"Update ~p","Atualizar ~p"}.
{"Update plan","Plano de atualização"}.
{"Update script","Script de atualização"}.
{"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"}.
{"Update","Actualizar"}.
{"Upgrade","Atualização"}.
{"Uptime:","Tempo de atividade:"}.
{"URL for Archived Discussion Logs","A URL para o arquivamento dos registos da discussão"}.
{"User already exists","Utilizador já existe"}.
@@ -624,6 +639,7 @@
{"Value of '~s' should be integer","Valor de '~s' deveria ser um inteiro"}.
{"Value 'set' of 'type' attribute is not allowed","Valor 'set' não permitido para atributo 'type'"}.
{"vCard User Search","Busca de Utilizador vCard"}.
{"View joined MIX channels","Exibir os canais MIX aderidos"}.
{"View Queue","Exibir a fila"}.
{"View Roster","Ver a lista"}.
{"Virtual Hosts","Hosts virtuais"}.
@@ -644,6 +660,7 @@
{"Whether to allow subscriptions","Permitir subscrições"}.
{"Whether to make all subscriptions temporary, based on subscriber presence","Caso todas as assinaturas devam ser temporárias, com base na presença do assinante"}.
{"Whether to notify owners about new subscribers and unsubscribes","Caso deva notificar os proprietários sobre os novos assinantes e aqueles que cancelaram a assinatura"}.
{"Who can send private messages","Quem pode enviar mensagens privadas"}.
{"Who may associate leaf nodes with a collection","Quem pode associar as folhas dos nós numa coleção"}.
{"Wrong parameters in the web formulary","O formulário web está com os parâmetros errados"}.
{"Wrong xmlns","Xmlns errado"}.
@@ -655,6 +672,7 @@
{"XMPP Show Value of XA (Extended Away)","XMPP Exiba o valor do XA (Ausência Estendida)"}.
{"XMPP URI of Associated Publish-Subscribe Node","XMPP URI da publicação do nó associado da assinatura"}.
{"You are being removed from the room because of a system shutdown","Está a ser removido da sala devido ao desligamento do sistema"}.
{"You are not allowed to send private messages","Não tem permissão de enviar mensagens privadas"}.
{"You are not joined to the channel","Não está inscrito no canal"}.
{"You can later change your password using an XMPP client.","Pode alterar a sua palavra-passe mais tarde usando um cliente XMPP."}.
{"You have been banned from this room","Foi banido desta sala"}.
-1
View File
@@ -180,7 +180,6 @@
{"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","Не разрешается посылать частные сообщения прямо в конференцию"}.
{"It is not allowed to send private messages","Запрещено посылать приватные сообщения"}.
{"Jabber ID","Jabber ID"}.
{"January","января"}.
{"joins the room","вошёл(а) в комнату"}.
-1
View File
@@ -124,7 +124,6 @@
{"is now known as","sa premenoval(a) na"}.
{"It is not allowed to send private messages of type \"groupchat\"","Nie je dovolené odoslanie súkromnej správy typu \"Skupinová správa\" "}.
{"It is not allowed to send private messages to the conference","Nie je povolené odosielať súkromné správy do konferencie"}.
{"It is not allowed to send private messages","Nieje povolené posielať súkromné správy"}.
{"Jabber ID","Jabber ID"}.
{"January","Január"}.
{"joins the room","vstúpil(a) do miestnosti"}.
-2
View File
@@ -142,7 +142,6 @@
{"IP addresses","Adresa IP"}.
{"is now known as","tani njihet si"}.
{"It is not allowed to send private messages to the conference","Nuk lejohet të dërgohen mesazhe private te konferenca"}.
{"It is not allowed to send private messages","Nuk lejohet të dërgohen mesazhe private"}.
{"Jabber ID","ID Jabber"}.
{"January","Janar"}.
{"JID normalization failed","Normalizimi JID dështoi"}.
@@ -253,7 +252,6 @@
{"Password:","Fjalëkalim:"}.
{"Path to Dir","Shteg për te Drejtori"}.
{"Path to File","Shteg për te Kartelë"}.
{"Payload type","Lloj ngarkese"}.
{"Pending","Pezull"}.
{"Period: ","Periudhë: "}.
{"Ping","Ping"}.
-1
View File
@@ -110,7 +110,6 @@
{"is now known as","är känd som"}.
{"It is not allowed to send private messages of type \"groupchat\"","Det är inte tillåtet att skicka privata medelanden med typen \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Det är inte tillåtet att skicka privata medelanden till den här konferensen"}.
{"It is not allowed to send private messages","Det ar inte tillåtet att skicka privata meddelanden"}.
{"Jabber ID","Jabber ID"}.
{"January","Januari"}.
{"joins the room","joinar rummet"}.
-1
View File
@@ -123,7 +123,6 @@
{"is now known as","isim değiştirdi :"}.
{"It is not allowed to send private messages of type \"groupchat\"","\"groupchat\" tipinde özel mesajlar gönderilmesine izin verilmiyor"}.
{"It is not allowed to send private messages to the conference","Konferansa özel mesajlar gönderilmesine izin verilmiyor"}.
{"It is not allowed to send private messages","Özel mesaj gönderilmesine izin verilmiyor"}.
{"Jabber ID","Jabber ID"}.
{"January","Ocak"}.
{"joins the room","odaya katıldı"}.
+93 -46
View File
@@ -12,6 +12,7 @@
{"A Web Page","Веб-сторінка"}.
{"Accept","Прийняти"}.
{"Access denied by service policy","Доступ заборонений політикою служби"}.
{"Access model","Права доступу"}.
{"Account doesn't exist","Обліковий запис не існує"}.
{"Action on user","Дія над користувачем"}.
{"Add a hat to a user","Додати капелюх користувачу"}.
@@ -34,75 +35,82 @@
{"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 may publish","Будь-хто може опублікувати"}.
{"Anyone may subscribe and retrieve items","Будь-хто може підписатися та отримати елементи"}.
{"Anyone with Voice","Усі, хто має голос"}.
{"April","квітня"}.
{"Attribute 'channel' is required for this request","Для цього запиту потрібен атрибут \"канал\""}.
{"Attribute 'id' is mandatory for MIX messages","Для MIX повідомлень потрібен атрибут \"id\""}.
{"Attribute 'jid' is not allowed here","Атрибут 'jid' тут заборонений"}.
{"Attribute 'node' is not allowed here","Атрибут \"вузол\" тут заборонений"}.
{"August","серпня"}.
{"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","Будь-хто"}.
{"Apparently your account has no administration rights in this server. Please check how to grant admin rights in: https://docs.ejabberd.im/admin/installation/#administration-account","Очевидно, ваш обліковий запис не має прав адміністратора на цьому сервері. Будь ласка, перевірте, як отримати права адміністратора за посиланням: https://docs.ejabberd.im/admin/installation/#administration-account"}.
{"April","Квітень"}.
{"Attribute 'channel' is required for this request","Атрибут \"канал\" є обов'язковим для цього запиту"}.
{"Attribute 'id' is mandatory for MIX messages","Атрибут 'id' обов'язковий для MIX повідомлень"}.
{"Attribute 'jid' is not allowed here","Атрибут 'jid' заборонений"}.
{"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","Неправильний формат"}.
{"Bad format","Невірний формат"}.
{"Birthday","День народження"}.
{"Both the username and the resource are required","Потрібне ім'я користувача та ресурс"}.
{"Both the username and the resource are required","Обов'язково потрібне ім'я користувача та джерело"}.
{"Bytestream already activated","Потік байтів вже активовано"}.
{"Cannot remove active list","Неможливо видалити активний список"}.
{"Cannot remove default list","Неможливо видалити список за промовчанням"}.
{"CAPTCHA web page","Адреса капчі"}.
{"Cannot remove default list","Неможливо видалити список за замовчуванням"}.
{"CAPTCHA web page","Веб-сторінка CAPTCHA"}.
{"Challenge ID","ID виклику"}.
{"Change Password","Змінити пароль"}.
{"Change User Password","Змінити Пароль Користувача"}.
{"Change User Password","Змінити пароль користувача"}.
{"Changing password is not allowed","Зміна пароля заборонена"}.
{"Changing role/affiliation is not allowed","Зміна ролі/рангу заборонена"}.
{"Channel already exists","Канал уже існує"}.
{"Channel does not exist","Канал не існує"}.
{"Channel already exists","Канал вже існує"}.
{"Channel does not exist","Каналу не існує"}.
{"Channel JID","Канали JID"}.
{"Channels","Канали"}.
{"Characters not allowed:","Заборонені символи:"}.
{"Chatroom configuration modified","Конфігурація кімнати змінилась"}.
{"Chatroom is created","Створено кімнату"}.
{"Chatroom is destroyed","Знищено кімнату"}.
{"Chatroom is started","Запущено кімнату"}.
{"Chatroom is stopped","Зупинено кімнату"}.
{"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 a username and password to register with this server","Виберіть логін і пароль для реєстрації на цьому сервері"}.
{"Choose storage type of tables","Оберіть тип збереження таблиць"}.
{"Choose whether to approve this entity's subscription.","Вирішіть, чи задовольнити запит цього об'єкту на підписку."}.
{"Choose whether to approve this entity's subscription.","Виберіть, чи підтверджувати підписку."}.
{"City","Місто"}.
{"Client acknowledged more stanzas than sent by server","Клієнт підтвердив більше повідомлень, ніж було відправлено сервером"}.
{"Commands","Команди"}.
{"Conference room does not exist","Конференція не існує"}.
{"Conference room does not exist","Кімната для переговорів відсутня"}.
{"Configuration of room ~s","Конфігурація кімнати ~s"}.
{"Configuration","Конфігурація"}.
{"Connected Resources:","Підключені ресурси:"}.
{"Contact Addresses (normally, room owner or owners)","Контактні адреси (зазвичай, власника або власників кімнати)"}.
{"Contrib Modules","Запуск модулів"}.
{"Country","Країна"}.
{"CPU Time:","Процесорний час:"}.
{"CPU Time:","Час роботи процесора:"}.
{"Current Discussion Topic","Поточна тема обговорення"}.
{"Database failure","Помилка база даних"}.
{"Database failure","Збій бази даних"}.
{"Database Tables at ~p","Таблиці бази даних на ~p"}.
{"Database Tables Configuration at ","Конфігурація таблиць бази даних на "}.
{"Database","База даних"}.
{"December","грудня"}.
{"Default users as participants","Зробити користувачів учасниками за замовчуванням"}.
{"December","Грудень"}.
{"Default users as participants","Користувачі за замовчуванням як учасники"}.
{"Delete content","Видалити вміст"}.
{"Delete message of the day on all hosts","Видалити повідомлення дня на усіх хостах"}.
{"Delete message of the day","Видалити повідомлення дня"}.
{"Delete Selected","Видалити виділені"}.
{"Delete Selected","Видалити вибране"}.
{"Delete table","Видалити таблицю"}.
{"Delete User","Видалити Користувача"}.
{"Delete User","Видалити користувача"}.
{"Deliver event notifications","Доставляти сповіщення про події"}.
{"Deliver payloads with event notifications","Доставляти разом з повідомленнями про публікації самі публікації"}.
{"Description:","Опис:"}.
@@ -160,11 +168,15 @@
{"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 Password","Отримати Пароль Користувача"}.
{"Get User Statistics","Отримати Статистику по Користувачу"}.
{"Given Name","По-батькові"}.
{"Grant voice to this person?","Надати голос персоні?"}.
{"Groups that will be displayed to the members","Групи, які показуватимуться учасникам"}.
{"Groups","Групи"}.
@@ -174,6 +186,9 @@
{"has been kicked because of an affiliation change","вигнано з кімнати внаслідок зміни рангу"}.
{"has been kicked because the room has been changed to members-only","вигнано з кімнати тому, що вона стала тільки для учасників"}.
{"has been kicked","вигнали з кімнати"}.
{"Hat title","Назва кімнати"}.
{"Hat URI","Назва URI"}.
{"Hats limit exceeded","Перевищено швидкість передачі інформації"}.
{"Host unknown","Невідоме ім'я сервера"}.
{"Host","Хост"}.
{"HTTP File Upload","Відвантаження файлів по HTTP"}.
@@ -196,6 +211,8 @@
{"Incorrect value of 'action' attribute","Неправильне значення атрибута \"action\""}.
{"Incorrect value of 'action' in data form","Неправильне значення \"action\" у формі даних"}.
{"Incorrect value of 'path' in data form","Неправильне значення \"path\" у формі даних"}.
{"Installed Modules:","Запуск модулів:"}.
{"Install","Встановлення"}.
{"Insufficient privilege","Недостатньо привілеїв"}.
{"Internal server error","Внутрішня помилка сервера"}.
{"Invalid 'from' attribute in forwarded message","Неприйнятний атрибут \"from\" у пересланому повідомленні"}.
@@ -207,9 +224,9 @@
{"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","Не дозволяється надсилати приватні повідомлення в конференцію"}.
{"It is not allowed to send private messages","Приватні повідомлення не дозволені"}.
{"Jabber ID","Jabber ID"}.
{"January","січня"}.
{"JID normalization denied by service policy","Створювати конференцію заборонено політикою служби"}.
{"JID normalization failed","Помилка нормалізації JID"}.
{"joins the room","увійшов(ла) в кімнату"}.
{"July","липня"}.
@@ -221,6 +238,7 @@
{"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 rooms","Перелік кімнат"}.
{"List of users with hats","Список користувачів із капелюхами"}.
@@ -235,7 +253,9 @@
{"Make room persistent","Зробити кімнату постійною"}.
{"Make room public searchable","Зробити кімнату видимою всім"}.
{"Malformed username","Неправильне ім’я користувача"}.
{"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","Максимальний розмір корисного навантаження в байтах"}.
{"Maximum file size","Макс. розмір файлу"}.
{"Maximum Number of History Messages Returned by Room","Максимальна кількість повідомлень історії на кімнату"}.
@@ -245,7 +265,9 @@
{"Members not added (inexistent vhost!): ","Учасників не додано (вірт. сервер не існує!): "}.
{"Membership is required to enter this room","В цю конференцію можуть входити тільки її члени"}.
{"Members:","Члени:"}.
{"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 не існує автоматизованого способу відновлення паролю, якщо ви його забудете."}.
{"Memory","Пам'ять"}.
{"Mere Availability in XMPP (No Show Value)","Проста доступність у XMPP (без показу статусу)"}.
{"Message body","Тіло повідомлення"}.
{"Message not found in forwarded payload","Повідомлення не знайдено в пересланому вмісті"}.
{"Messages from strangers are rejected","Повідомлення від незнайомців відхиляються"}.
@@ -254,6 +276,7 @@
{"Middle Name","По-батькові"}.
{"Minimum interval between voice requests (in seconds)","Мінімальний інтервал між голосовими запитами (в секундах)"}.
{"Moderator privileges required","Необхідні права модератора"}.
{"Moderators Only","Тільки модераторам"}.
{"Moderator","Модератор"}.
{"Modified modules","Змінені модулі"}.
{"Module failed to handle the query","Модулю не вдалося обробити запит"}.
@@ -261,8 +284,11 @@
{"Multicast","Мультікаст"}.
{"Multiple <item/> elements are not allowed by RFC6121","Кілька елементів <item/> не дозволені RFC6121"}.
{"Multi-User Chat","Багато-користувальницький чат"}.
{"Name in the rosters where this group will be displayed","Назва у списку контактів, де ця група буде відображена"}.
{"Name","Назва"}.
{"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","Ніколи"}.
@@ -298,6 +324,7 @@
{"No services available","Немає доступних сервісів"}.
{"No statistics found for this item","Для цього елемента статистичні дані не знайдено"}.
{"No 'to' attribute found in the invitation","У запрошенні не знайдено атрибут \"до\""}.
{"Nobody","Ніхто"}.
{"Node already exists","Вузол уже існує"}.
{"Node ID","ID вузла"}.
{"Node index not found","Індекс вузла не знайдено"}.
@@ -319,6 +346,10 @@
{"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","Учасникам дозволено змінювати тему"}.
{"October","грудня"}.
{"Offline Messages","Офлайнові повідомлення"}.
{"Offline Messages:","Офлайнові повідомлення:"}.
@@ -335,19 +366,23 @@
{"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","Пакет"}.
{"Participant ID","ID учасника"}.
{"Participant","Учасник"}.
{"Password Verification","Перевірка Пароля"}.
{"Password Verification:","Перевірка Пароля:"}.
@@ -355,24 +390,36 @@
{"Password:","Пароль:"}.
{"Path to Dir","Шлях до директорії"}.
{"Path to File","Шлях до файла"}.
{"Payload semantic type information","Інформація про тип вмісту даних"}.
{"Pending","Очікування"}.
{"Period: ","Період: "}.
{"Persist items to storage","Зберегати публікації до сховища"}.
{"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","Будь ласка, почекайте деякий час перед тим, як знову відправляти голосовий запит"}.
{"Pong","Понг"}.
{"Present real Jabber IDs to","Зробити реальні Jabber ID учасників видимими"}.
{"Previous session not found","Попередній сеанс не знайдено"}.
{"Persist items to storage","Зберігати елементи в сховищі"}.
{"Persistent","Тривалий"}.
{"Ping query is incorrect","Запит 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, вам також потрібно окремо створити резервну копію вашої SQL-бази даних."}.
{"Please, wait for a while before sending new voice request","Будь ласка, зачекайте трохи перед тим, як відправляти новий голосовий запит"}.
{"Pong","Pong (відповідь на Ping, підтвердження взаємодії)"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Наявність атрибуту 'ask' не дозволена згідно з RFC6121"}.
{"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","Публікація-Підписка"}.
{"PubSub subscriber request","Запит на підписку PubSub"}.
{"Purge all items when the relevant publisher goes offline","Видалити всі елементи, коли особа, що їх опублікувала, вимикається від мережі"}.
{"PubSub subscriber request","Запит підписника PubSub"}.
{"Purge all items when the relevant publisher goes offline","Видалити всі елементи, коли автор публікації виходить офлайн"}.
{"Push record not found","Push-запис не знайдено"}.
{"Queries to the conference members are not allowed in this room","Запити до користувачів в цій конференції заборонені"}.
{"RAM and disc copy","ОЗП та диск"}.
{"RAM copy","ОЗП"}.
{"Really delete message of the day?","Насправді, видалити повідомлення дня?"}.
{"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","Отримувати сповіщення від усіх підпорядкованих вузлів"}.
{"Recipient is not in the conference room","Адресата немає в конференції"}.
{"Register an XMPP account","Зареєструвати XMPP-запис"}.
{"Registered Users","Зареєстровані користувачі"}.
-1
View File
@@ -132,7 +132,6 @@
{"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","On n' pout nén evoyî des messaedjes d' aroke sol såle. Li pårticipan (~s) a-st evoyî on messaedje d' aroke (~s) ey a stî tapé foû."}.
{"It is not allowed to send private messages of type \"groupchat\"","C' est nén possibe d' evoyî des messaedjes privés del sôre «groupchat»"}.
{"It is not allowed to send private messages to the conference","On n' pout nén evoyî des messaedjes privés dins cisse conferince ci"}.
{"It is not allowed to send private messages","Ci n' est nén permetou d' evoyî des messaedjes privés"}.
{"Jabber ID","ID Jabber"}.
{"January","djanvî"}.
{"joins the room","arive sol såle"}.
+210 -211
View File
@@ -4,24 +4,19 @@
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
{" (Add * to the end of field to match substring)"," (在字段末添加*来匹配子串)"}.
{" has set the subject to: "," 已将标题设置为: "}.
{"# participants","# 参与"}.
{" 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 of authorize","授权的访问模型"}.
{"Access model of open","开启的访问模型"}.
{"Access model of presence","状态的访问模型"}.
{"Access model of roster","花名册的访问模型"}.
{"Access model of whitelist","白名单的访问模型"}.
{"Access model","访问模型"}.
{"Account doesn't exist","账号不存在"}.
{"Action on user","对用户的动作"}.
{"Action on user","对用户执行的操作"}.
{"Add a hat to a user","给用户添加头衔"}.
{"Add Jabber ID","添加Jabber ID"}.
{"Add Jabber ID","添加 Jabber ID"}.
{"Add New","添加新用户"}.
{"Add User","添加用户"}.
{"Administration of ","管理 "}.
@@ -30,18 +25,18 @@
{"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 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专有名称."}.
{"Announcements","通知"}.
{"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 专有名称"}.
{"Announcements","公告"}.
{"Answer associated with a picture","与图片关联的回答"}.
{"Answer associated with a video","与视频关联的回答"}.
{"Answer associated with speech","与讲话关联的回答"}.
@@ -51,11 +46,12 @@
{"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 with Voice","任何有发言权的人"}.
{"Anyone","任何人"}.
{"Apparently your account has no administration rights in this server. Please check how to grant admin rights in: https://docs.ejabberd.im/admin/installation/#administration-account","显然,您的账号在此服务器上没有管理权限。请检查如何授予管理员权限:https://docs.ejabberd.im/admin/installation/#administration-account"}.
{"April","四月"}.
{"Attribute 'channel' is required for this request","此请求要求'频道'属性"}.
{"Attribute 'id' is mandatory for MIX messages","对MIX消息, 'id' 属性为必填项"}.
{"Attribute 'id' is mandatory for MIX messages","对 MIX 消息'id' 属性为必填项"}.
{"Attribute 'jid' is not allowed here","此处不允许 'jid' 属性"}.
{"Attribute 'node' is not allowed here","此处不允许 'node' 属性"}.
{"Attribute 'to' of stanza that triggered challenge","触发挑战一节的 'to' 属性"}.
@@ -69,46 +65,46 @@
{"Birthday","出生日期"}.
{"Both the username and the resource are required","用户名和资源均为必填项"}.
{"Bytestream already activated","字节流已经被激活"}.
{"Cannot remove active list","无法移除活列表"}.
{"Cannot remove default list","无法移除缺省列表"}.
{"Cannot remove active list","无法移除活列表"}.
{"Cannot remove default list","无法移除默认列表"}.
{"CAPTCHA web page","验证码网页"}.
{"Challenge ID","挑战ID"}.
{"Challenge ID","挑战 ID"}.
{"Change Password","更改密码"}.
{"Change User Password","更改用户密码"}.
{"Changing password is not allowed","不允许修改密码"}.
{"Changing role/affiliation is not allowed","不允许修改角色/单位"}.
{"Changing role/affiliation is not allowed","不允许修改角色/从属关系"}.
{"Channel already exists","频道已存在"}.
{"Channel does not exist","频道不存在"}.
{"Channel JID","频道 JID"}.
{"Channels","频道"}.
{"Characters not allowed:","不允许字符:"}.
{"Chatroom configuration modified","聊天室配置已修改"}.
{"Chatroom is created","聊天室已创建"}.
{"Chatroom is destroyed","聊天室已被销毁"}.
{"Chatroom is started","聊天室已启动"}.
{"Chatroom is stopped","聊天室已停用"}.
{"Chatroom is created","聊天室已创建"}.
{"Chatroom is destroyed","聊天室已解散"}.
{"Chatroom is started","聊天室已启动"}.
{"Chatroom is stopped","聊天室已停用"}.
{"Chatrooms","聊天室"}.
{"Choose a username and password to register with this server","选择在此服务器上注册所需的用户名和密码"}.
{"Choose a username and password to register with this server","选择在此服务器上注册的用户名和密码"}.
{"Choose storage type of tables","请选择表格的存储类型"}.
{"Choose whether to approve this entity's subscription.","选择是否允许该实体的订阅."}.
{"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","配置"}.
{"Connected Resources:","已连接资源:"}.
{"Contact Addresses (normally, room owner or owners)","联系人地址 (通常为房间持有人)"}.
{"Connected Resources:","已连接资源"}.
{"Contact Addresses (normally, room owner or owners)","联系人地址(通常为房间所有者)"}.
{"Contrib Modules","Contrib 模块"}.
{"Country","国家"}.
{"CPU Time:","CPU时间:"}.
{"Country","国家/地区"}.
{"CPU Time:","CPU 时间:"}.
{"Current Discussion Topic","当前讨论话题"}.
{"Database failure","数据库失败"}.
{"Database Tables at ~p","位于~p的数据库表"}.
{"Database Tables Configuration at ","数据库表格配置位于 "}.
{"Database","数据库"}.
{"December","十二月"}.
{"Default users as participants","用户默认被视为参与"}.
{"Default users as participants","默认用户为参与"}.
{"Delete content","删除内容"}.
{"Delete message of the day on all hosts","删除所有主机上的每日消息"}.
{"Delete message of the day","删除每日消息"}.
@@ -117,62 +113,62 @@
{"Delete User","删除用户"}.
{"Deliver event notifications","传递事件通知"}.
{"Deliver payloads with event notifications","用事件通告传输有效负载"}.
{"Description:","描述:"}.
{"Description:","描述"}.
{"Disc only copy","仅磁盘复制"}.
{"'Displayed groups' not added (they do not exist!): ","'显示的群组' 未被添加 (它们不存在!): "}.
{"Displayed:","已显示:"}.
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","不要将密码告诉任何人, 就算是XMPP服务器的管理员也不可以."}.
{"'Displayed groups' not added (they do not exist!): ","'显示的群组' 未被添加(它们不存在!) "}.
{"Displayed:","已显示"}.
{"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的规则,不允许有重复的群组"}.
{"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 Multicast service","ejabberd 多重映射服务"}.
{"ejabberd Publish-Subscribe module","ejabberd 发行-订阅模块"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 字节流模块"}.
{"ejabberd vCard module","ejabberd vCard模块"}.
{"ejabberd Web Admin","ejabberd网页管理"}.
{"ejabberd vCard module","ejabberd vCard 模块"}.
{"ejabberd Web Admin","ejabberd Web 管理"}.
{"ejabberd","ejabberd"}.
{"Elements","元素"}.
{"Email Address","电地址"}.
{"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","请输入您想要注册的昵称"}.
{"Enter path to backup file","请输入备份文件的路径"}.
{"Enter path to jabberd14 spool dir","请输入jabberd14 spool目录的路径"}.
{"Enter path to jabberd14 spool dir","请输入 jabberd14 spool 目录的路径"}.
{"Enter path to jabberd14 spool file","请输入 jabberd14 spool 文件的路径"}.
{"Enter path to text file","请输入文本文件的路径"}.
{"Enter the text you see","请输入您所看到的文本"}.
{"Erlang XMPP Server","Erlang XMPP 服务器"}.
{"Error","错误"}.
{"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):"}.
{"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 extract JID from your voice request approval","从您的发言请求批准提取 JID 失败"}.
{"Failed to map delegated namespace to external component","未能将代理命名空间映射到外部组件"}.
{"Failed to parse HTTP response","HTTP响应解析失败"}.
{"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","填充表单来搜索任何匹配的XMPP用户"}.
{"Fill in the form to search for any matching XMPP User","填充表单来搜索任何匹配的 XMPP 用户"}.
{"Friday","星期五"}.
{"From ~ts","来自 ~ts"}.
{"From","从"}.
{"Full List of Room Admins","房间管理员完整列表"}.
{"Full List of Room Owners","房间持有人完整列表"}.
{"Full List of Room Owners","房间所有者完整列表"}.
{"Full Name","全名"}.
{"Get List of Online Users","获取在线用户列表"}.
{"Get List of Registered Users","获取注册用户列表"}.
@@ -183,34 +179,34 @@
{"Get User Password","获取用户密码"}.
{"Get User Statistics","获取用户统计"}.
{"Given Name","中间名"}.
{"Grant voice to this person?","为此人授权声音?"}.
{"Groups that will be displayed to the members","将显示给员的群组"}.
{"Grant voice to this person?","允许此用户发言?"}.
{"Groups that will be displayed to the members","将显示给员的群组"}.
{"Groups","组"}.
{"Group","组"}.
{"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 an affiliation change","因属关系改变而被踢出"}.
{"has been kicked because the room has been changed to members-only","被踢了,因为房间改为仅成员进入"}.
{"has been kicked","已被踢出"}.
{"Hat title","头衔标题"}.
{"Hat URI","头衔 URI"}.
{"Hats limit exceeded","已超过头衔限制"}.
{"Host unknown","主未知"}.
{"Host unknown","主未知"}.
{"Host","主机"}.
{"HTTP File Upload","HTTP文件上传"}.
{"Idle connection","空闲连接"}.
{"If you don't see the CAPTCHA image here, visit the web page.","如果您在这里没有看到验证码图片, 请访问网页."}.
{"HTTP File Upload","HTTP 文件上传"}.
{"Idle connection","空闲连接"}.
{"If you don't see the CAPTCHA image here, visit the web page.","如果您在此处没有看到 CAPTCHA 图片,请访问网页"}.
{"Import Directory","导入目录"}.
{"Import File","导入文件"}.
{"Import user data from jabberd14 spool file:","从 jabberd14 Spool 文件导入用户数据:"}.
{"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 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 From jabberd14 Spool Files","从 jabberd14 Spool 文件导入用户"}.
{"Improper domain part of 'from' attribute","不恰当的'from'属性域名部分"}.
{"Improper message type","不恰当的消息类型"}.
{"Incoming s2s Connections:","入站 s2s 连接:"}.
{"Incoming s2s Connections:","入站 s2s 连接"}.
{"Incorrect CAPTCHA submit","提交的验证码不正确"}.
{"Incorrect data form","数据形式不正确"}.
{"Incorrect password","密码不正确"}.
@@ -224,66 +220,65 @@
{"Invalid 'from' attribute in forwarded message","转发的信息中 'from' 属性的值无效"}.
{"Invalid node name","无效的节点名称"}.
{"Invalid 'previd' value","无效的 'previd' 值"}.
{"Invitations are not allowed in this conference","此会议不允许邀请"}.
{"IP addresses","IP地址"}.
{"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 private messages","不可以发送私聊消息"}.
{"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","Jabber ID"}.
{"January","一月"}.
{"JID normalization denied by service policy","JID规范化被服务策略拒绝"}.
{"JID normalization failed","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","加入房间"}.
{"July","七月"}.
{"June","六月"}.
{"Just created","刚刚创建"}.
{"Label:","标签:"}.
{"Label:","标签"}.
{"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哈希的最低有效位应等于十六进制标签"}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","文本的 SHA-256 哈希的最低有效位应等于十六进制标签"}.
{"leaves the room","离开房间"}.
{"List of rooms","房间列表"}.
{"List of users with hats","有头衔用户的列表"}.
{"List users with hats","有头衔用户列表"}.
{"Logging","正在记录"}.
{"Low level update script","低级别更新脚本"}.
{"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","MAM偏好被服务策略拒绝"}.
{"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","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","最大有效负载字节数"}.
{"Maximum file size","最大文件大小"}.
{"Maximum Number of History Messages Returned by Room","房间返回的历史消息最大值"}.
{"Maximum number of items to persist","持久化内容的最大条目数"}.
{"Maximum Number of Occupants","允许的与会人最大数"}.
{"Maximum Number of Occupants","最大占用人数"}.
{"May","五月"}.
{"Members not added (inexistent vhost!): ","成员未添加 (不存在的vhost!): "}.
{"Membership is required to enter this room","进入此房间需要会员身份"}.
{"Members:","会员:"}.
{"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也没有自动恢复密码的方式."}.
{"Members not added (inexistent vhost!): ","成员未添加(不存在的vhost!) "}.
{"Membership is required to enter this room","进入此房间需要成员资格"}.
{"Members:","成员:"}.
{"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 中,如果忘记密码,则没有自动恢复密码的方法。"}.
{"Memory","内存"}.
{"Mere Availability in XMPP (No Show Value)","仅XMPP中的可用性 (不显示值)"}.
{"Mere Availability in XMPP (No Show Value)","仅 XMPP 中的可用性(不显示值)"}.
{"Message body","消息主体"}.
{"Message not found in forwarded payload","转发的有效载荷中找不到消息"}.
{"Messages from strangers are rejected","陌生人的消息会被拒绝"}.
{"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","主持人"}.
@@ -295,13 +290,13 @@
{"Multi-User Chat","多用户聊天"}.
{"Name in the rosters where this group will be displayed","花名册中将显示的该分组的名称"}.
{"Name","姓名"}.
{"Name:","姓名:"}.
{"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:","新密码:"}.
{"New Password:","新密码"}.
{"Nickname can't be empty","昵称不能为空"}.
{"Nickname Registration at ","昵称注册于 "}.
{"Nickname ~s does not exist in the room","昵称~s不在该房间"}.
@@ -335,7 +330,7 @@
{"No 'to' attribute found in the invitation","邀请中未发现 'to' 标签"}.
{"Nobody","没有人"}.
{"Node already exists","节点已存在"}.
{"Node ID","节点ID"}.
{"Node ID","节点 ID"}.
{"Node index not found","没有找到节点索引"}.
{"Node not found","没有找到节点"}.
{"Node ~p","节点~p"}.
@@ -346,83 +341,84 @@
{"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","当节点被删除时通知订阅"}.
{"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 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","成员可以修改主题"}.
{"Occupants are allowed to invite others","允许占用者邀请别人"}.
{"Occupants are allowed to query others","允许占用者查询别人"}.
{"Occupants May Change the Subject","占用者可以修改主题"}.
{"October","十月"}.
{"Offline Messages","离线消息"}.
{"Offline Messages:","离线消息:"}.
{"Offline Messages:","离线消息"}.
{"OK","确定"}.
{"Old Password:","旧密码:"}.
{"Old Password:","旧密码"}.
{"Online Users","在线用户"}.
{"Online Users:","在线用户:"}.
{"Online Users:","在线用户"}.
{"Online","在线"}.
{"Only admins can see this","仅管理员可以看见此内容"}.
{"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 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 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 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","需要持有人权限"}.
{"Outgoing s2s Connections:","出站 s2s 连接"}.
{"Owner privileges required","需要所有者权限"}.
{"Packet relay is denied by service policy","包中继被服务策略拒绝"}.
{"Packet","数据包"}.
{"Participant ID","参与者 ID"}.
{"Participant","参与"}.
{"Password Verification:","密码确认:"}.
{"Participant","参与"}.
{"Password Verification:","密码确认"}.
{"Password Verification","确认密码"}.
{"Password","密码"}.
{"Password:","密码:"}.
{"Password:","密码"}.
{"Path to Dir","目录的路径"}.
{"Path to File","文件路径"}.
{"Payload type","有效载荷类型"}.
{"Payload semantic type information","有效载荷语义类型信息"}.
{"Pending","挂起"}.
{"Period: ","持续时间: "}.
{"Period: ","持续时间 "}.
{"Persist items to storage","持久化内容条目"}.
{"Persistent","久"}.
{"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 模块您还需要分别备份您的数据库"}.
{"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","将真实Jabber ID显示给"}.
{"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 PID has been killed","上一个会话的 PID 已被杀掉"}.
{"Previous session PID has exited","上一个会话的 PID 已退出"}.
{"Previous session PID is dead","上一个会话的 PID 已死"}.
{"Previous session timed out","上一个会话已超时"}.
{"private, ","保密, "}.
{"private, ","保密 "}.
{"Public","公开"}.
{"Publish model","发布模型"}.
{"Publish-Subscribe","发布-订阅"}.
{"PubSub subscriber request","PubSub订阅请求"}.
{"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","本房间不可以查询会议成员信息"}.
{"Queries to the conference members are not allowed in this room","不允许在此群聊中查询群聊成员"}.
{"Query to another users is forbidden","禁止查询其他用户"}.
{"RAM and disc copy","内存与磁盘复制"}.
{"RAM copy","内存(RAM)复制"}.
@@ -432,9 +428,9 @@
{"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 an XMPP account","注册 XMPP 账号"}.
{"Registered Users","注册用户"}.
{"Registered Users:","注册用户:"}.
{"Registered Users:","注册用户"}.
{"Register","注册"}.
{"Remote copy","远程复制"}.
{"Remove a hat from a user","移除用户头衔"}.
@@ -449,26 +445,26 @@
{"Restart Service","重启服务"}.
{"Restart","重启"}.
{"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 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 and Affiliations that May Retrieve Member List","可检索成员列表的角色和从属关系"}.
{"Roles for which Presence is Broadcasted","被广播状态的角色"}.
{"Roles that May Send Private Messages","可以发送私聊消息的角色"}.
{"Roles that May Send Private Messages","可以发送私的角色"}.
{"Room Configuration","房间配置"}.
{"Room creation is denied by service policy","创建房间被服务策略拒绝"}.
{"Room description","房间描述"}.
{"Room Occupants","房间人数"}.
{"Room Occupants","房间占用者"}.
{"Room terminates","房间终止"}.
{"Room title","房间标题"}.
{"Roster groups allowed to subscribe","允许订阅的花名册组"}.
{"Roster of ~ts","~ts的花名册"}.
{"Roster size","花名册大小"}.
{"Roster:","花名册:"}.
{"Roster:","花名册"}.
{"RPC Call Error","RPC 调用错误"}.
{"Running Nodes","运行中的节点"}.
{"~s invites you to the room ~s","~s邀请到房间~s"}.
{"~s invites you to the room ~s","~s 邀请到房间 ~s"}.
{"Saturday","星期六"}.
{"Script check","脚本检查"}.
{"Search from the date","从日期搜索"}.
@@ -482,7 +478,7 @@
{"Send announcement to all users on all hosts","发送通知给所有主机上的所有用户"}.
{"Send announcement to all users","发送通知给所有用户"}.
{"September","九月"}.
{"Server:","服务器:"}.
{"Server:","服务器"}.
{"Service list retrieval timed out","服务列表检索超时"}.
{"Session state copying timed out","会话状态复制超时"}.
{"Set message of the day and send to online users","设定每日消息并发送给所有在线用户"}.
@@ -492,28 +488,29 @@
{"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 客户端可以在计算机里存储你的密码. 处于安全考虑, 请仅在你的个人计算机里使用该功能."}.
{"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","节ID"}.
{"Stanza id is not valid","节 id 无效"}.
{"Stanza ID","节 ID"}.
{"Statically specify a replyto of the node owner(s)","静态指定节点所有者的回复"}.
{"Statistics of ~p","~p的统计"}.
{"Statistics","统计"}.
{"Stopped Nodes","已经停止的节点"}.
{"Stop","停止"}.
{"Storage Type","存储类型"}.
{"Store binary backup:","存储为二进制备份:"}.
{"Store plain text backup:","存储为普通文本备份:"}.
{"Store binary backup:","存储为二进制备份"}.
{"Store plain text backup:","存储为普通文本备份"}.
{"Stream management is already enabled","流管理已启用"}.
{"Stream management is not enabled","流管理未启用"}.
{"Subject","标题"}.
{"Submitted","已提交"}.
{"Submit","提交"}.
{"Subscriber Address","订阅地址"}.
{"Subscribers may publish","订阅可以发布"}.
{"Subscription requests must be approved and only subscribers may retrieve items","订阅请求必须得到批准, 只有订阅才能检索项目"}.
{"Subscriber Address","订阅地址"}.
{"Subscribers may publish","订阅可以发布"}.
{"Subscription requests must be approved and only subscribers may retrieve items","订阅请求必须得到批准只有订阅才能检索项目"}.
{"Subscriptions are not allowed","不允许订阅"}.
{"Subscription","订阅"}.
{"Sunday","星期天"}.
@@ -521,93 +518,93 @@
{"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","帐户未注"}.
{"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 is valid.","验证码有效"}.
{"The CAPTCHA verification has failed","验证码检查失败"}.
{"The captcha you entered is wrong","您输入的验证码有误"}.
{"The child nodes (leaf or collection) associated with a collection","关联集合的字节点 (叶子或集合)"}.
{"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","节点创建人的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 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 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 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 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 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 type of node data, usually specified by the namespace of the payload (if any)","节点数据的类型, 如果有, 通常由有效负载的名称空间指定"}.
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","XSL转换的URL,可以将其应用于有效负载以生成适当的消息正文元素。"}.
{"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","XSL转换的URL, 可以将其应用于有效负载格式, 以生成有效的数据表单结果, 客户端可以使用通用数据表单呈现引擎来显示该结果"}.
{"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.","此处不区分大小写: 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 帐户。"}.
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","XSL 转换的 URL,可以将其应用于有效负载以生成适当的消息正文元素。"}.
{"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","XSL 转换的 URL,可以将其应用于有效负载格式,以生成有效的数据表单结果,客户端可以使用通用数据表单呈现引擎来显示该结果"}.
{"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.","此处不区分大小写: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) 的形式如下:username@server。请仔细阅读说明以正确填写字段。"}.
{"This page allows to unregister an XMPP account in this XMPP server.","页面允许在此 XMPP 服务器上注XMPP 账号。"}.
{"This room is not anonymous","此房间不是匿名房间"}.
{"This service can not process the address: ~s","此服务无法处理地址: ~s"}.
{"This service can not process the address: ~s","此服务无法处理地址~s"}.
{"Thursday","星期四"}.
{"Time delay","时间延迟"}.
{"Timed out waiting for stream resumption","等待流恢复超时"}.
{"Time","时间"}.
{"To register, visit ~s","要注册,请访问 ~s"}.
{"To ~ts","发送到~ts"}.
{"Token TTL","TTL令牌"}.
{"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 (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","来自 IP 地址(~p)的(~s)失败认证太多。将在 UTC 时间 ~s 解除对该地址的封锁"}.
{"Too many receiver fields were specified","指定的接收者字段太多"}.
{"Too many unacked stanzas","未被确认的节太多"}.
{"Too many users in this conference","该会议的用户太多"}.
{"Total rooms","所有房间"}.
{"To","到"}.
{"Traffic rate limit is exceeded","已经超过传输率限制"}.
{"Transactions Aborted:","取消的事务:"}.
{"Transactions Committed:","提交的事务:"}.
{"Transactions Logged:","记入日志的事务:"}.
{"Transactions Restarted:","重启的事务:"}.
{"Transactions Aborted:","取消的事务"}.
{"Transactions Committed:","提交的事务"}.
{"Transactions Logged:","记入日志的事务"}.
{"Transactions Restarted:","重启的事务"}.
{"~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"}.
{"Unexpected error condition: ~p","意外错误条件~p"}.
{"Uninstall","卸载"}.
{"Unregister an XMPP account","注销XMPP帐户"}.
{"Unregister","取消注册"}.
{"Unregister an XMPP account","注销 XMPP 账号"}.
{"Unregister","注销"}.
{"Unselect All","取消全选"}.
{"Unsupported <index/> element","不支持的 <index/> 元素"}.
{"Unsupported version","不支持的版本"}.
@@ -620,18 +617,18 @@
{"Update Specs","更新参数"}.
{"Update","更新"}.
{"Upgrade","升级"}.
{"Uptime:","正常运行时间:"}.
{"URL for Archived Discussion Logs","已档对话日志的URL"}.
{"Uptime:","正常运行时间"}.
{"URL for Archived Discussion Logs","已档对话日志的 URL"}.
{"User already exists","用户已存在"}.
{"User (jid)","用户 (jid)"}.
{"User JID","用户JID"}.
{"User JID","用户 JID"}.
{"User Management","用户管理"}.
{"User removed","用户已移除"}.
{"User session not found","用户会话未找到"}.
{"User session terminated","用户会话已终止"}.
{"User ~ts","用户~ts"}.
{"Username:","用户名:"}.
{"Users are not allowed to register accounts so quickly","不允许用户太频繁地注册帐户"}.
{"Username:","用户名"}.
{"Users are not allowed to register accounts so quickly","不允许用户太频繁地注册账号"}.
{"Users Last Activity","用户上次活动"}.
{"Users","用户"}.
{"User","用户"}.
@@ -641,50 +638,52 @@
{"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用户搜索"}.
{"vCard User Search","vCard 用户搜索"}.
{"View joined MIX channels","查看已加入的 MIX 频道"}.
{"View Queue","查看队列"}.
{"View Roster","查看花名册"}.
{"Virtual Hosts","虚拟主机"}.
{"Visitors are not allowed to change their nicknames in this room","此房间不允许用户更改昵称"}.
{"Visitors are not allowed to send messages to all occupants","不允许访客给所有占者发送息"}.
{"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","声音请求"}.
{"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","实体是否要接收通知的摘要汇总或单独接收所有通知"}.
{"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 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","是否将新订阅和退订通知所有者"}.
{"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的不在显示值"}.
{"XMPP Show Value of Chat","XMPP的聊天显示值"}.
{"XMPP Show Value of DND (Do Not Disturb)","XMPPDND(勿扰)显示值"}.
{"XMPP Show Value of XA (Extended Away)","XMPPXA (扩展不在)显示值"}.
{"XMPP URI of Associated Publish-Subscribe Node","发布-订阅节点关联的XMPP URI"}.
{"You are being removed from the room because of a system shutdown","系统关机, 你正在被从房间移除"}.
{"XMPP Account Registration","XMPP 账号注册"}.
{"XMPP Domains","XMPP 域"}.
{"XMPP Show Value of Away","XMPP 的离开显示值"}.
{"XMPP Show Value of Chat","XMPP 的聊天显示值"}.
{"XMPP Show Value of DND (Do Not Disturb)","XMPPDND (勿扰)显示值"}.
{"XMPP Show Value of XA (Extended Away)","XMPPXA (延长离开)显示值"}.
{"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 can later change your password using an XMPP client.","您稍后可以使用 XMPP 客户端更改密码"}.
{"You have been banned from this room","您已被禁止进入该房间"}.
{"You have joined too many conferences","您加入的会议太多"}.
{"You must fill in field \"Nickname\" in the form","您必须填充表单中\"昵称\"项"}.
{"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 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帐户注销成功."}.
{"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","您不可以创建节点"}.
Vendored
BIN
View File
Binary file not shown.
+124 -47
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 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,23 +18,23 @@
%%%
%%%----------------------------------------------------------------------
%%%
%%% Dependencies
%%%
{deps, [{base64url, ".*", {git, "https://github.com/dvv/base64url", {tag, "1.0.1"}}},
{cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.30"}}},
{eimp, ".*", {git, "https://github.com/processone/eimp", {tag, "1.0.22"}}},
{if_var_true, tools,
{ejabberd_po, ".*", {git, "https://github.com/processone/ejabberd-po", {branch, "main"}}}},
{if_var_true, elixir,
{elixir, ".*", {git, "https://github.com/elixir-lang/elixir", {tag, "v1.4.4"}}}},
{if_var_true, pam,
{epam, ".*", {git, "https://github.com/processone/epam", {tag, "1.0.14"}}}},
{if_var_true, redis,
{eredis, ".*", {git, "https://github.com/wooga/eredis", {tag, "v1.2.0"}}}},
{if_var_true, sip,
{esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.49"}}}},
{esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.52"}}}},
{if_var_true, zlib,
{ezlib, ".*", {git, "https://github.com/processone/ezlib", {tag, "1.0.12"}}}},
{fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.16"}}},
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.49"}}},
{fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.1.19"}}},
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.51"}}},
{fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.36"}}},
{idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}},
{if_version_above, "19",
@@ -48,36 +48,47 @@
{if_version_below, "22",
{lager, ".*", {git, "https://github.com/erlang-lager/lager", {tag, "3.9.1"}}}
},
%% Lua, rebar, OTP 20: 1.0 git tag
{if_var_true, lua,
{if_not_rebar3,
{luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0"}}}
}},
{if_version_below, "21",
{luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0"}}}
}}},
%% Lua, rebar3, OTP 20: 1.0.0 hex package
{if_var_true, lua,
{if_rebar3,
{luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0.0"}}}
}},
{mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.15"}}},
{if_version_below, "21",
{luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.0.0"}}}
}}},
%% Lua, any rebar, OTP 21-26: 1.1.1 git tag / 1.1.1 hex package
{if_var_true, lua,
{if_version_above, "20", {if_version_below, "27",
{luerl, ".*", {git, "https://github.com/rvirding/luerl", {tag, "1.1.1"}}}
}}},
%% Lua, any rebar, OTP 27: temporary otp27 branch from fork
{if_var_true, lua,
{if_version_above, "26",
{luerl, ".*", {git, "https://github.com/processone/luerl", {branch, "otp27"}}}
}},
{mqtree, ".*", {git, "https://github.com/processone/mqtree", {tag, "1.0.16"}}},
{p1_acme, ".*", {git, "https://github.com/processone/p1_acme", {tag, "1.0.22"}}},
{if_var_true, mysql,
{p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.21"}}}},
{p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.11"}}},
{p1_mysql, ".*", {git, "https://github.com/processone/p1_mysql", {tag, "1.0.23"}}}},
{p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.14"}}},
{if_var_true, pgsql,
{p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.20"}}}},
{p1_pgsql, ".*", {git, "https://github.com/processone/p1_pgsql", {tag, "1.1.25"}}}},
{p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.25"}}},
{pkix, ".*", {git, "https://github.com/processone/pkix", {tag, "1.0.9"}}},
{if_not_rebar3, %% Needed because modules are not fully migrated to new structure and mix
{if_var_true, elixir,
{rebar_elixir_plugin, ".*", {git, "https://github.com/processone/rebar_elixir_plugin", "0.1.0"}}}},
{if_var_true, sqlite,
{sqlite3, ".*", {git, "https://github.com/processone/erlang-sqlite3", {tag, "1.1.14"}}}},
{stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.29"}}},
{if_var_true, stun,
{stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.2.7"}}}},
{xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.6.1"}}},
{stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.2.12"}}}},
{xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.8.1"}}},
{yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.15"}}}
]}.
{gitonly_deps, [elixir]}.
{gitonly_deps, [ejabberd_po]}.
{if_var_true, latest_deps,
{floating_deps, [cache_tab,
@@ -101,6 +112,21 @@
xmpp,
yconf]}}.
%%%
%%% Compile
%%%
{recursive_cmds, ['configure-deps']}.
{post_hook_configure, [{"eimp", []},
{if_var_true, pam, {"epam", []}},
{if_var_true, sip, {"esip", []}},
{if_var_true, zlib, {"ezlib", []}},
{"fast_tls", []},
{"fast_xml", [{if_var_true, full_xml, "--enable-full-xml"}]},
{"fast_yaml", []},
{"stringprep", []}]}.
{erl_first_files, ["src/ejabberd_sql_pt.erl", "src/ejabberd_config.erl",
"src/gen_mod.erl", "src/mod_muc_room.erl",
"src/mod_push.erl", "src/xmpp_socket.erl"]}.
@@ -117,6 +143,7 @@
{if_version_below, "23", {d, 'USE_OLD_PG2'}},
{if_version_below, "24", {d, 'COMPILER_REPORTS_ONLY_LINES'}},
{if_version_below, "24", {d, 'SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL'}},
{if_version_below, "24", {d, 'OTP_BELOW_24'}},
{if_version_below, "25", {d, 'OTP_BELOW_25'}},
{if_var_false, debug, no_debug_info},
{if_var_true, debug, debug_info},
@@ -127,31 +154,47 @@
{if_var_true, stun, {d, 'STUN'}},
{src_dirs, [src,
{if_rebar3, sql},
{if_var_true, tools, tools},
{if_var_true, elixir, include}]}]}.
{if_var_true, tools, tools}]}]}.
{if_rebar3, {plugins, [rebar3_hex, {provider_asn1, "0.2.0"}]}}.
{if_rebar3, {plugins, [rebar3_hex, {provider_asn1, "0.2.0"},
%% 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:
%% https://github.com/Supersonido/rebar_mix/pull/31
{if_var_true, elixir, {rebar_mix, ".*",
{git, "https://github.com/bsanyi/rebar_mix.git",
{branch, "consolidation_fix"}}}
}]}}.
{if_rebar3, {project_plugins, [configure_deps]}}.
{if_not_rebar3, {plugins, [
deps_erl_opts, override_deps_versions2, override_opts, configure_deps,
{if_var_true, elixir, rebar_elixir_compiler},
{if_var_true, elixir, rebar_exunit}
deps_erl_opts, override_deps_versions2, override_opts, configure_deps
]}}.
{if_rebar3, {if_var_true, elixir,
{project_app_dirs, [".", "elixir/lib"]}}}.
{if_not_rebar3, {if_var_true, elixir,
{lib_dirs, ["deps/elixir/lib"]}}}.
{if_var_true, elixir,
{src_dirs, ["include"]}}.
{provider_hooks, [
{post, [{compile, {mix, consolidate_protocols}}]}
]}}}.
{sub_dirs, ["rel"]}.
{keep_build_info, true}.
%%%
%%% Test
%%%
{xref_warnings, false}.
{xref_checks, [deprecated_function_calls]}.
{if_rebar3,
{xref_checks,
[deprecated_function_calls, deprecated_functions, locals_not_used,
undefined_function_calls, undefined_functions]}
}.
{if_not_rebar3,
{xref_checks,
[deprecated_function_calls, deprecated_functions,
undefined_function_calls, undefined_functions]}
}.
{xref_exclusions, [
"(\"gen_transport\":_/_)",
@@ -166,26 +209,53 @@
{if_var_false, sqlite, "(\"sqlite3\":_/_)"},
{if_var_false, zlib, "(\"ezlib\":_/_)"}]}.
{xref_ignores, [{eldap_filter_yecc, return_error, 2},
{http_uri, encode, 1}]}.
{eunit_compile_opts, [{i, "tools"},
{i, "include"}]}.
{dialyzer, [{get_warnings, false}, % Show warnings of dependencies
{if_version_above, "25",
{plt_extra_apps,
[asn1, odbc, public_key, stdlib, syntax_tools,
idna, jiffy, jose,
cache_tab, eimp, fast_tls, fast_xml, fast_yaml,
mqtree, p1_acme, p1_oauth2, p1_utils, pkix,
stringprep, xmpp, yconf,
{if_var_true, pam, epam},
{if_var_true, redis, eredis},
{if_var_true, sip, esip},
{if_var_true, zlib, ezlib},
{if_var_true, lua, luerl},
{if_var_true, mysql, p1_mysql},
{if_var_true, pgsql, p1_pgsql},
{if_var_true, stun, stun},
{if_var_true, sqlite, sqlite3}]},
{plt_extra_apps, % For Erlang/OTP 25 and older
[cache_tab, eimp, fast_tls, fast_xml, fast_yaml,
mqtree, p1_acme, p1_oauth2, p1_utils, pkix, stringprep, xmpp, yconf,
{if_var_true, pam, epam},
{if_var_true, redis, eredis},
{if_var_true, sip, esip},
{if_var_true, zlib, ezlib},
{if_var_true, lua, luerl},
{if_var_true, mysql, p1_mysql},
{if_var_true, pgsql, p1_pgsql},
{if_var_true, stun, stun},
{if_var_true, sqlite, sqlite3}]}
} ]}.
{ct_opts, [{keep_logs, 20}]}.
{cover_enabled, true}.
{cover_export_enabled, true}.
{coveralls_coverdata, "_build/test/cover/ct.coverdata"}.
{coveralls_service_name, "github"}.
{recursive_cmds, ['configure-deps']}.
{overrides, [
{del, [{erl_opts, [warnings_as_errors]}]}]}.
{post_hook_configure, [{"eimp", []},
{if_var_true, pam, {"epam", []}},
{if_var_true, sip, {"esip", []}},
{if_var_true, zlib, {"ezlib", []}},
{"fast_tls", []},
{"fast_xml", [{if_var_true, full_xml, "--enable-full-xml"}]},
{"fast_yaml", []},
{"stringprep", []}]}.
%%%
%%% OTP Release
%%%
{relx, [{release, {ejabberd, {cmd, "grep {vsn, vars.config | sed 's|{vsn, \"||;s|\"}.||' | tr -d '\012'"}},
[ejabberd]},
@@ -197,6 +267,12 @@
{mkdir, "conf"},
{copy, "rel/files/erl", "erts-\{\{erts_vsn\}\}/bin/erl"},
{template, "ejabberdctl.template", "bin/ejabberdctl"},
{copy, "_build/default/lib/ejabberd/ebin/Elixir.*", "lib/ejabberd-{{release_version}}/ebin/"},
{copy, "{{base_dir}}/consolidated/*", "lib/ejabberd-{{release_version}}/ebin/"},
{copy, "rel/overlays/iex", "releases/{{release_version}}/"},
{if_var_true, elixir,
{template, "rel/overlays/elixir", "releases/{{release_version}}/elixir"}
},
{copy, "inetrc", "conf/inetrc"},
{copy, "tools/captcha*.sh", "lib/ejabberd-\{\{release_version\}\}/priv/bin/"},
{copy, "rel/files/install_upgrade.escript", "bin/install_upgrade.escript"}]}
@@ -210,7 +286,7 @@
{overlay, [{copy, "sql/*", "lib/ejabberd-\{\{release_version\}\}/priv/sql/"},
{copy, "ejabberdctl.cfg.example", "conf/ejabberdctl.cfg"},
{copy, "ejabberd.yml.example", "conf/ejabberd.yml"}]}]}]},
{dev, [{post_hooks, [{release, "rel/setup-dev.sh"}]},
{dev, [{post_hooks, [{release, "rel/setup-dev.sh rebar3"}]},
{relx, [{debug_info, keep},
{dev_mode, true},
{include_erts, true},
@@ -221,6 +297,7 @@
{copy, "ejabberd.yml.example", "conf/ejabberd.yml.example"},
{copy, "test/ejabberd_SUITE_data/ca.pem", "conf/"},
{copy, "test/ejabberd_SUITE_data/cert.pem", "conf/"}]}]}]},
{translations, [{deps, [{ejabberd_po, ".*", {git, "https://github.com/processone/ejabberd-po", {branch, "main"}}}]}]},
{test, [{erl_opts, [nowarn_export_all]}]}]}.
{alias, [{relive, [{shell, "--apps ejabberd \
+6 -8
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2023 ProcessOne
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -232,7 +232,8 @@ LibDir = fun(Name, Suffix) ->
GlobalDepsFilter =
fun(Deps) ->
DepNames = lists:map(fun({DepName, _, _}) -> DepName;
({DepName, _}) -> DepName
({DepName, _}) -> DepName;
(DepName) -> DepName
end, Deps),
lists:filtermap(fun(Dep) ->
case LibDir(atom_to_list(Dep), "") of
@@ -352,14 +353,11 @@ VarsApps = case file:consult(filename:join([filename:dirname(SCRIPT),"vars.confi
ProcessRelx = fun(Relx, Deps) ->
{value, {release, NameVersion, DefaultApps}, RelxTail} = lists:keytake(release, 1, Relx),
ProfileApps = case os:getenv("REBAR_PROFILE") of
"dev" -> [observer, runtime_tools, wx, debugger];
_ -> []
end,
DepApps = lists:map(fun({DepName, _, _}) -> DepName;
({DepName, _}) -> DepName
({DepName, _}) -> DepName;
(DepName) -> DepName
end, Deps),
[{release, NameVersion, DefaultApps ++ VarsApps ++ ProfileApps ++ DepApps} | RelxTail]
[{release, NameVersion, DefaultApps ++ VarsApps ++ DepApps} | RelxTail]
end,
GithubConfig = case {os:getenv("GITHUB_ACTIONS"), os:getenv("GITHUB_TOKEN")} of
BIN
View File
Binary file not shown.
+8 -2
View File
@@ -1,6 +1,6 @@
%%%-------------------------------------------------------------------
%%% @author Evgeniy Khramtsov <ekhramtsov@process-one.net>
%%% @copyright (C) 2013-2023, Evgeniy Khramtsov
%%% @copyright (C) 2013-2024, Evgeniy Khramtsov
%%% @doc
%%%
%%% @end
@@ -53,6 +53,8 @@ OTPApps = RequiredOTPApps ++ ConfiguredOTPApps,
DepApps = lists:usort(lists:flatten(GetDeps(filename:join(TopDir, "rebar.config"), GetDeps))),
SysVer = erlang:system_info(otp_release),
Sys = [{lib_dirs, []},
{erts, [{mod_cond, derived}, {app_file, strip}]},
{app_file, strip},
@@ -70,13 +72,17 @@ Sys = [{lib_dirs, []},
{boot_rel, "ejabberd"},
{profile, embedded},
{incl_cond, exclude},
{excl_archive_filters, [".*"]}, %% Do not archive built libs
{excl_sys_filters, ["^bin/.*", "^erts.*/bin/(dialyzer|typer)",
"^erts.*/(doc|info|include|lib|man|src)"]},
{excl_app_filters, ["\.gitignore"]},
{app, stdlib, [{incl_cond, include}]},
{app, kernel, [{incl_cond, include}]},
{app, ejabberd, [{incl_cond, include}, {lib_dir, ".."}]}]
++ if SysVer < "26" ->
[{excl_archive_filters, [".*"]}]; %% Do not archive built libs
true ->
[]
end
++ lists:map(
fun(App) ->
{app, App, [{incl_cond, include},
+15 -7
View File
@@ -1,28 +1,36 @@
echo -n "===> Preparing dev configuration files: "
printf "===> Preparing dev configuration files: "
PWD_DIR=`pwd`
PWD_DIR=$(pwd)
REL_DIR=$PWD_DIR/_build/dev/rel/ejabberd/
CON_DIR=$REL_DIR/conf/
[ -z "$REL_DIR_TEMP" ] && REL_DIR_TEMP=$REL_DIR
CON_DIR_TEMP=$REL_DIR_TEMP/conf/
BIN_DIR_TEMP=$REL_DIR_TEMP/bin/
cd $CON_DIR_TEMP
cd $CON_DIR_TEMP || exit
sed -i "s|# certfiles:|certfiles:\n - $CON_DIR/cert.pem|g" ejabberd.yml.example
sed -i "s|certfiles:|ca_file: $CON_DIR/ca.pem\ncertfiles:|g" ejabberd.yml.example
sed -i 's|^acl:$|acl:\n admin: [user: admin]|g' ejabberd.yml.example
[ ! -f "$CON_DIR/ejabberd.yml" ] \
&& echo -n "ejabberd.yml " \
&& printf "ejabberd.yml " \
&& mv ejabberd.yml.example ejabberd.yml
sed -i "s|#' POLL|EJABBERD_BYPASS_WARNINGS=true\n\n#' POLL|g" ejabberdctl.cfg.example
[ ! -f "$CON_DIR/ejabberdctl.cfg" ] \
&& echo -n "ejabberdctl.cfg " \
&& printf "ejabberdctl.cfg " \
&& mv ejabberdctl.cfg.example ejabberdctl.cfg
echo ""
echo "===> Some example ways to start this ejabberd dev:"
echo " _build/dev/rel/ejabberd/bin/ejabberd console"
echo " _build/dev/rel/ejabberd/bin/ejabberdctl live"
case "$1" in
"rebar3")
echo " _build/dev/rel/ejabberd/bin/ejabberd console"
;;
"mix")
echo " RELEASE_NODE=ejabberd@localhost _build/dev/rel/ejabberd/bin/ejabberd start"
;;
"*")
;;
esac

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