Compare commits

...

657 Commits

Author SHA1 Message Date
Pawel Chmielowski 27b87d4a8a Add SECURITY.md in hex docs
Container / build (amd64, <nil>) (push) Failing after 45s
Installers / binaries (amd64, <nil>) (push) Failing after 1m48s
CI / compile (28) (push) Has been cancelled
Container / build (arm64, -arm) (push) Has been cancelled
Installers / binaries (arm64, -arm) (push) Has been cancelled
Runtime / rebars (25, rebar) (push) Has been cancelled
Runtime / rebars (25, rebar3) (push) Has been cancelled
Runtime / rebars (26, rebar) (push) Has been cancelled
Runtime / rebars (26, rebar3) (push) Has been cancelled
Runtime / rebars (27, rebar3) (push) Has been cancelled
Runtime / rebars (28, rebar3) (push) Has been cancelled
Runtime / rebars (29, rebar3) (push) Has been cancelled
Runtime / rebar3-elixir (1.14) (push) Has been cancelled
Runtime / rebar3-elixir (1.18) (push) Has been cancelled
Runtime / rebar3-elixir (1.19) (push) Has been cancelled
Runtime / mix (1.14) (push) Has been cancelled
Runtime / mix (1.18) (push) Has been cancelled
Runtime / mix (1.19) (push) Has been cancelled
CI / static (28) (push) Has been cancelled
CI / dynamic (28) (push) Has been cancelled
CI / ct (agnostic, 28, multi) (push) Has been cancelled
CI / ct (extauth, 28, multi) (push) Has been cancelled
CI / ct (ldap, 28, multi) (push) Has been cancelled
CI / ct (mnesia, 28, multi) (push) Has been cancelled
CI / ct (mysql, 28, multi) (push) Has been cancelled
CI / ct (mysql, 28, single) (push) Has been cancelled
CI / ct (pgsql, 28, multi) (push) Has been cancelled
CI / ct (pgsql, 28, single) (push) Has been cancelled
CI / ct (redis, 28, multi) (push) Has been cancelled
CI / ct (sqlite, 28, multi) (push) Has been cancelled
CI / ct (sqlite, 28, single) (push) Has been cancelled
CI / cover (push) Has been cancelled
CI / schema (28) (push) Has been cancelled
Container / merge (push) Has been cancelled
Installers / Release (push) Has been cancelled
2026-03-25 16:42:17 +01:00
Badlop 6e90f5e681 Set version to 26.03
Container / build (amd64, <nil>) (push) Failing after 41s
Installers / binaries (amd64, <nil>) (push) Failing after 27s
CI / compile (28) (push) Has been cancelled
Container / build (arm64, -arm) (push) Has been cancelled
Installers / binaries (arm64, -arm) (push) Has been cancelled
Runtime / rebars (25, rebar) (push) Has been cancelled
Runtime / rebars (25, rebar3) (push) Has been cancelled
Runtime / rebars (26, rebar) (push) Has been cancelled
Runtime / rebars (26, rebar3) (push) Has been cancelled
Runtime / rebars (27, rebar3) (push) Has been cancelled
Runtime / rebars (28, rebar3) (push) Has been cancelled
Runtime / rebars (29, rebar3) (push) Has been cancelled
Runtime / rebar3-elixir (1.14) (push) Has been cancelled
Runtime / rebar3-elixir (1.18) (push) Has been cancelled
Runtime / rebar3-elixir (1.19) (push) Has been cancelled
Runtime / mix (1.14) (push) Has been cancelled
Runtime / mix (1.18) (push) Has been cancelled
Runtime / mix (1.19) (push) Has been cancelled
CI / static (28) (push) Has been cancelled
CI / dynamic (28) (push) Has been cancelled
CI / ct (agnostic, 28, multi) (push) Has been cancelled
CI / ct (extauth, 28, multi) (push) Has been cancelled
CI / ct (ldap, 28, multi) (push) Has been cancelled
CI / ct (mnesia, 28, multi) (push) Has been cancelled
CI / ct (mysql, 28, multi) (push) Has been cancelled
CI / ct (mysql, 28, single) (push) Has been cancelled
CI / ct (pgsql, 28, multi) (push) Has been cancelled
CI / ct (pgsql, 28, single) (push) Has been cancelled
CI / ct (redis, 28, multi) (push) Has been cancelled
CI / ct (sqlite, 28, multi) (push) Has been cancelled
CI / ct (sqlite, 28, single) (push) Has been cancelled
CI / cover (push) Has been cancelled
CI / schema (28) (push) Has been cancelled
Container / merge (push) Has been cancelled
Installers / Release (push) Has been cancelled
2026-03-25 15:37:09 +01:00
Badlop 9a82a28c8d CHANGELOG.md: Update to 26.03 2026-03-25 15:37:09 +01:00
Badlop c44c259180 Update man page to 26.03 2026-03-25 15:29:47 +01:00
Pawel Chmielowski 13c89279a2 Include ezlib in included_applications 2026-03-25 13:27:17 +01:00
Pawel Chmielowski fcf685a4dc Use tagged deps 2026-03-25 12:22:22 +01:00
Badlop 07580e6787 mod_mam: Allow backend modules to add fulltext namespace in Service Discovery 2026-03-25 02:10:37 +01:00
Pawel Chmielowski 6ce687262e Bump idna to 7.1 as used in xmpp 2026-03-24 16:40:50 +01:00
Pawel Chmielowski 2c8156dcd0 Update xmpp with fixes for dialyzer 2026-03-24 16:26:15 +01:00
Pawel Chmielowski bb8d65b68a Improve handling of c=y flag during sasl scram authentication
With this change we will no longer abort connection if all -PLUS
methods are disabled by administrator using `disable_sasl_mechanisms`.

Additionally when using SASL2 authentication we will also allow
connections to continue, if filtering methods based on stored
user passwords, removed all offered -PLUS mechanisms.
2026-03-24 14:47:21 +01:00
Badlop c43b15b3cd make-binaries: Bump libexpat 2.7.5 2026-03-23 16:01:03 +01:00
Badlop acc6beb3f3 Result of running "make format options" 2026-03-23 15:59:50 +01:00
Badlop bf2692a710 Annotate improvements in new version 2026-03-23 15:59:49 +01:00
Badlop 42e5a443ed Update Chinese Simplified translation (thanks to Sketch6580) 2026-03-23 15:59:48 +01:00
Badlop c5221f9350 Update German translation (thanks to Stefan Strigler) 2026-03-23 15:59:47 +01:00
Badlop 16739180f5 Update Bulgarian translation (thanks to Mr. EddX) 2026-03-23 15:59:45 +01:00
Pawel Chmielowski 181465ea3e Fix dialyzer warning 2026-03-20 17:43:00 +01:00
Pawel Chmielowski 23a32cae1a Add handling of Etag and If-Modified-Since headers to files served by mod_http_upload 2026-03-20 17:01:07 +01:00
badlop b2e2bd7ca8 Merge pull request #4547 from sstrigler/invites-broken-paths
fix mod_invites broken paths
2026-03-19 10:33:55 +01:00
Badlop efdc90b7b8 Bump Erlang/OTP 28.4.1 2026-03-16 19:23:34 +01:00
Badlop 010a6901b3 mod_invites: Fix minor typos in documentation 2026-03-16 19:23:19 +01:00
Badlop 8fb6257388 Fix warning about unused variable 2026-03-16 19:23:14 +01:00
Pawel Chmielowski 2832c4f513 Don't use gen_server:call for resolving pubsub host in mod_pubsub_serverinfo
Because each disco query do call this, this can be a bottleneck,
we can now get this value straight from options.
2026-03-16 19:08:19 +01:00
Pawel Chmielowski 6022105f39 Add ability for mod_options values to depend on other options 2026-03-16 18:56:15 +01:00
Pawel Chmielowski 3a78d6cf2a Fix test on mnesia 2026-03-16 15:29:36 +01:00
Pawel Chmielowski 975dcc1128 Start with tests for sasl2 2026-03-16 15:10:44 +01:00
Pawel Chmielowski 00e61dd816 Make mod_fast_auth filter offered methods, based on available channel bindings
This is a fix for issue #4549
2026-03-16 15:10:31 +01:00
Pawel Chmielowski c0134fe820 Ignore whitespaces at end of host header 2026-03-13 14:50:42 +01:00
Pawel Chmielowski ab59302204 Revert "Use global value for default_version as failback in mod_http_api if host is not recognized"
This fail tests.
This reverts commit 89b11829ce.
2026-03-13 14:48:57 +01:00
Pawel Chmielowski 89b11829ce Use global value for default_version as failback in mod_http_api if host is not recognized 2026-03-13 14:39:55 +01:00
Holger Weiss 267d8ca124 Don't fail to classify stand-alone chat states
Ignore XEP-0359 elements when checking whether a stanza has non-XEP-0085
content.  This allows mod_client_state to filter chat states with an
<origin-id/> element.
2026-03-12 19:12:23 +01:00
Stefan Strigler 427f68daa6 fix(mod_invites): broken path when behind proxy with prefix 2026-03-12 14:34:56 +01:00
Stefan Strigler b15bae267d fix path to bootstrap files 2026-03-12 13:47:52 +01:00
Pawel Chmielowski 6bbed5854a Fix duplicate stanza-id in muc mam responses generated from local history
This fixes issue #4544
2026-03-11 13:03:53 +01:00
Pawel Chmielowski 15661f16c4 Always hide password in mod_http_api log entries 2026-03-10 11:41:06 +01:00
Pawel Chmielowski 54b30cf0c4 Improve transformation code in mod_roster_mnesia 2026-03-10 11:39:29 +01:00
Badlop b7940ba360 Workflows: Don't use jsdelivr mirror: not up-to-date, unnecessary and problematic
* Not up-to-date

jsdelivr takes some days or weeks to get latest erlang versions, compare
  https://builds.hex.pm/builds/otp/arm64/ubuntu-24.04/builds.txt
  https://cdn.jsdelivr.net/hex/builds/otp/arm64/ubuntu-24.04/builds.txt

* Unnecessary

As builds.hex.pm is already geodistributed, there's no need to add mirror
Reference: https://www.hex.pm/docs/mirrors

* Problematic in parallel jobs

The ci.yml workflow is split in separate jobs that run in parallel,
and all of them must use the exact same erlang version.
When using mirrors, different erlang versions may be used...
and then the compiled files require more recompilation, which fail
  ===> Compiling /home/runner/work/ejabberd/ejabberd/c_src/epam.c
  ===> /home/runner/work/ejabberd/ejabberd/c_src/epam.c:18:10: fatal error: security/pam_appl.h: No such file or directory
   18 | #include <security/pam_appl.h>
      |          ^~~~~~~~~~~~~~~~~~~~~

Instead of removing mirrors, an alternative solution would be
to specify exact OTP version: "28.3.2", but then we would need to update
all those strings in ci.yml for every erlang release.
2026-03-10 02:07:41 +01:00
Badlop ee2fd8446a Update Catalan and Spanish translations 2026-03-09 19:26:00 +01:00
Badlop b41a8b0925 Update Czech translation (thanks to hollymrklm) 2026-03-09 19:26:00 +01:00
Badlop 8603cd85db manage-ejabberd: Compile with test profile to get all required deps 2026-03-09 19:25:22 +01:00
Badlop 3a2d1bd12b Makefile: Run invites-deps only when files are missing 2026-03-09 19:24:53 +01:00
Badlop a04ed90e25 Rename target test-eunit to avoid name pattern test-GROUP
Example:
$ make test-eunit
Makefile:696: warning: overriding recipe for target 'test-eunit'
Makefile:692: warning: ignoring old recipe for target 'test-eunit'
...
2026-03-09 19:20:41 +01:00
Holger Weiss 383b498fbb Merge remote-tracking branch 'processone/pr/4542'
* processone/pr/4542:
  make-binaries: Enable missing crypto features
2026-03-09 17:19:34 +01:00
Pawel Chmielowski af3987fc0a Update one more place where store_mam_message hook is triggered 2026-03-09 14:57:28 +01:00
Pawel Chmielowski 9fd1ed34ee Call store_mam_message hook for messages that user_mucsub_from_muc_archive was filtering out
Just adjust mod_mam callback for it to not store them.

This callback is used by mod_push for triggering push, and previous
behaviour did disable pushes for muc messages with that option
enabled.
2026-03-09 14:05:19 +01:00
Holger Weiss a9ae72ba9f make-binaries: Download unixODBC from GitHub
The unixODBC web site (unixodbc.org) seems to be unreachable.
2026-03-07 21:38:22 +01:00
badlop aa704c0d75 Merge pull request #4540 from sstrigler/overuse_limit
fix: set overuse limits
2026-03-06 19:00:24 +01:00
Badlop bc48fa4c55 CONTRIBUTORS: Add Stefan Strigler 2026-03-06 18:19:26 +01:00
Badlop 2251cb7547 container.yml: Disable the container cleanup action; it's dry anyway 2026-03-06 18:19:23 +01:00
badlop 15b51d7a7b Merge pull request #4539 from sstrigler/security_fixes
Even more security fixes (and other minor things)
2026-03-06 17:23:12 +01:00
Stefan Strigler 5721f77d5a fix: set overuse limits
This is an effort to detect abuse where accounts get created to create more
invites (invite chaining) and so on.
2026-03-06 17:11:09 +01:00
Badlop fa32fecd97 Update French translation (thanks to Dyxux) 2026-03-06 15:58:37 +01:00
Badlop e291d84cf8 Update German translation (thanks to Stefan Strigler) 2026-03-06 15:57:20 +01:00
Badlop 934fdcdc5d Update Bulgarian translation (thanks to Mr. EddX) 2026-03-06 15:56:51 +01:00
Stefan Strigler eba6868a3f styling improvements 2026-03-06 15:18:25 +01:00
Stefan Strigler 5bb989d998 invites: bring yaxim back 2026-03-06 15:18:25 +01:00
Stefan Strigler e9645ffec0 improv(invites): add favicon and change color to match ejabberd branding 2026-03-06 15:18:25 +01:00
Stefan Strigler 179c5c4cbb feat(invites: enable dark mode 2026-03-06 15:18:25 +01:00
Stefan Strigler f210803202 fix(invites): no inline scripts 2026-03-06 15:18:25 +01:00
Stefan Strigler 793855ad91 fix(invites): make format csrf token 2026-03-06 15:18:25 +01:00
Stefan Strigler 1a423743af feat(invites): add support for webchat_url 2026-03-06 15:18:25 +01:00
Stefan Strigler b8f20fb663 fix(invites): add csrf token to failed post 2026-03-06 15:18:25 +01:00
Stefan Strigler 7b4338e7df invites: update jquery 2026-03-06 15:18:25 +01:00
Stefan Strigler e6b1e55705 invites: migrate to bootstrap5 2026-03-06 15:18:25 +01:00
Stefan Strigler eb784b4026 fix(invites): include js/css deps in static dir 2026-03-06 15:18:25 +01:00
Stefan Strigler 07d363ed0c fix(invites): correct hashes for bootstrap 4.6.2 2026-03-06 15:18:25 +01:00
Stefan Strigler 8a7cf45d0b fix(invites): hint at type for landing_page opt 2026-03-06 15:18:25 +01:00
Badlop d93ece6540 Result of running "make format" 2026-03-06 13:48:21 +01:00
Badlop 2a65a5001d Bump Erlang/OTP 28.4 2026-03-06 13:47:50 +01:00
Badlop 1ffcd1ce6e ejabberd_ctl: Document how to set empty lists in ejabberdctl and WebAdmin 2026-03-06 13:47:48 +01:00
Badlop d5c14406db mod_roster: Fix display of groups in WebAdmin when it's a list 2026-03-06 13:47:46 +01:00
Badlop 67b87ac892 mod_roster: in WebAdmin page, first execute SET actions, later GET 2026-03-06 13:47:44 +01:00
Holger Weiss a44f865432 make-binaries: Enable missing crypto features
With OTP's --enable-static-nifs, libcrypto features detected by
configure aren't propagated to the static NIF build flags.  Work
around this issue by patching OTP's Makefile until the following
PR is merged:

https://github.com/erlang/otp/pull/10817
2026-03-02 22:44:10 +01:00
Pawel Chmielowski a4ff3f3a65 Make table cleanup in test more robust 2026-02-27 11:31:59 +01:00
Pawel Chmielowski ca56f11dc6 Add abilty to mark that column can be null in e_sql_schema 2026-02-27 09:47:40 +01:00
badlop 1695385912 Merge pull request #4538 from sstrigler/security_fixes
Security fixes
2026-02-26 17:16:40 +01:00
Stefan Strigler b9e3841186 fix: check CSRF token in register form 2026-02-26 16:22:57 +01:00
Stefan Strigler 0680f6ac5e fix: add integrity hashes to scripts and css 2026-02-26 15:18:02 +01:00
Stefan Strigler ff15018b24 fix: comment unused resources 2026-02-26 15:18:02 +01:00
Stefan Strigler 635054007d fix: add security headers 2026-02-26 15:18:02 +01:00
Stefan Strigler f1527ba21e fix: remove debug log of whole query parameters (including pw) 2026-02-26 15:18:02 +01:00
Stefan Strigler 3b1a8a6c00 fix: don't crash on unknown host from http host header 2026-02-26 15:18:02 +01:00
Stefan Strigler c862f58c78 fix: make creating invite transactional 2026-02-26 15:18:02 +01:00
Badlop 6e938dcc84 CI and Weekly: If sending to coveralls fails, continue anyway 2026-02-26 13:49:55 +01:00
Badlop ecb88d9ebc Result of running "make format options" 2026-02-24 16:34:39 +01:00
Badlop b7464e19ff mod_roster_mnesia: Fix compilation warning in recent commit 2026-02-24 16:31:35 +01:00
badlop 1bcd52300f Merge pull request #4512 from sstrigler/roster-pre-approval
Roster Subscription Pre-Approval
2026-02-24 16:00:42 +01:00
Badlop 0c55beff6e Runtime and Weekly: Add Erlang/OTP 29 2026-02-24 15:47:46 +01:00
Badlop 3adb30c859 Bump Erlang/OTP 28.3.2 2026-02-24 15:46:35 +01:00
Badlop 5378d177e2 Revert "rebar.config: Bump rebar3_lint to 4.2.2, used for Elvis"
This breaks compiling ejabberd with Erlang/OTP 29 in many libraries,
for example:
    ┌─ _build/default/lib/eredis/src/eredis.erl:
    │
 10 │  -include("eredis.hrl").
    │           ╰── can't find include file "eredis.hrl"

Compiling with Erlang 28 or older works,
but Elvis fails as it includes many new tests that are not passed.

This reverts commit 5b89ee0fe8.
2026-02-24 15:46:31 +01:00
Badlop 160cd976b4 mod_mam_sql: Only provide the new XEP-0431 fulltext field, not old custom withtext 2026-02-23 16:39:46 +01:00
Badlop 95d8f6c531 mod_muc_room: Fix hook name in commit 7732984 (thanks to trixnz)(#4526) 2026-02-23 16:39:44 +01:00
Badlop cdcf3ef1b9 mod_invites: Check at start time the syntax of landing_page option (#4525) 2026-02-23 16:39:42 +01:00
Badlop afd49b9847 make-binaries: Bump zlib to 1.3.2 2026-02-23 16:39:40 +01:00
Badlop 5b89ee0fe8 rebar.config: Bump rebar3_lint to 4.2.2, used for Elvis 2026-02-23 16:39:38 +01:00
Badlop 4ce63d9a6c rebar.config: Remove nowarn_deprecated_function, seems useless nowadays 2026-02-23 16:39:33 +01:00
Pawel Chmielowski 29ac776a98 Update p1_pgsql once more 2026-02-20 11:25:01 +01:00
Pawel Chmielowski 8cf9a0b79b Update p1_pgsql 2026-02-20 11:12:35 +01:00
badlop d0d9b2f968 Merge pull request #4535 from sstrigler/no_redirect-url_if_preauth
set meta.pre-auth to skip redirect_url if token validated
2026-02-19 21:52:04 +01:00
Stefan Strigler 785412be5c fix: set meta.pre-auth to skip redirect_url if token validated
otherwise if redirect_url for mod_register is set, then we can't register even
if a valid invite token has been presented
2026-02-19 09:02:55 +01:00
badlop 3b05cb0700 Merge pull request #4531 from sstrigler/mod_invites_http_set_link_header
imprv: send 'Link' http header
2026-02-17 13:15:36 +01:00
Stefan Strigler 1fc1626d3f imprv: send 'Link' http header
Conversations' QR code scanner does a HEAD request on embedded http links and
extracts and interprets any XMPP URI if found. This way skipping the step of
having the user handle the landing page.
2026-02-17 13:02:14 +01:00
Badlop 56f47dbec7 rebar.config: Add temporary workarounds for Erlang/OTP 29 warnings (#4527) 2026-02-17 12:42:18 +01:00
Badlop 05cd172b77 Use also *.lock files to determine dependencies cache key
The cache key must change too when a dependency is updated
only in the lock file.
2026-02-17 12:42:13 +01:00
Badlop 0876662a20 rebar.lock: Update also rebar.lock 2026-02-17 12:42:11 +01:00
Badlop 9402dbb16f CI: Don't finish a parallel build in converalls in case of error
Because we may want to re-run the job in Github Actions, and coveralls
would then refuse new cover submits as the build is already closed.
2026-02-17 12:42:10 +01:00
Badlop 99f9443ec8 Fix some warnings compiling with Erlang/OTP 29 (#4527) 2026-02-17 12:42:08 +01:00
Badlop 84f698c489 Runtime: Remove obsolete step for Erlang lower than 25 2026-02-17 12:42:07 +01:00
Badlop 274a5dfbc8 Weekly: Clean useless newline 2026-02-17 12:42:05 +01:00
Badlop 641aa88bbc CI: Test with Erlang 28, the one included in installers and container 2026-02-17 12:42:03 +01:00
Badlop 029aa67ccf Fix URL in documentation to work correctly with "make archive" 2026-02-17 12:42:01 +01:00
Pawel Chmielowski 120973074a Update p1_mysql 2026-02-16 17:29:52 +01:00
Badlop 8138b48cad Set version to 26.02
Container / build (amd64, <nil>) (push) Failing after 45s
Installers / binaries (amd64, <nil>) (push) Failing after 38s
CI / compile (27) (push) Has been cancelled
Container / build (arm64, -arm) (push) Has been cancelled
Installers / binaries (arm64, -arm) (push) Has been cancelled
Runtime / rebars (25, rebar) (push) Has been cancelled
Runtime / rebars (25, rebar3) (push) Has been cancelled
Runtime / rebars (26, rebar) (push) Has been cancelled
Runtime / rebars (26, rebar3) (push) Has been cancelled
Runtime / rebars (27, rebar3) (push) Has been cancelled
Runtime / rebars (28, rebar3) (push) Has been cancelled
Runtime / rebar3-elixir (1.14) (push) Has been cancelled
Runtime / rebar3-elixir (1.18) (push) Has been cancelled
Runtime / rebar3-elixir (1.19) (push) Has been cancelled
Runtime / mix (1.14) (push) Has been cancelled
Runtime / mix (1.18) (push) Has been cancelled
Runtime / mix (1.19) (push) Has been cancelled
CI / static (27) (push) Has been cancelled
CI / dynamic (27) (push) Has been cancelled
CI / ct (agnostic, 27, multi) (push) Has been cancelled
CI / ct (extauth, 27, multi) (push) Has been cancelled
CI / ct (ldap, 27, multi) (push) Has been cancelled
CI / ct (mnesia, 27, multi) (push) Has been cancelled
CI / ct (mysql, 27, multi) (push) Has been cancelled
CI / ct (mysql, 27, single) (push) Has been cancelled
CI / ct (pgsql, 27, multi) (push) Has been cancelled
CI / ct (pgsql, 27, single) (push) Has been cancelled
CI / ct (redis, 27, multi) (push) Has been cancelled
CI / ct (sqlite, 27, multi) (push) Has been cancelled
CI / ct (sqlite, 27, single) (push) Has been cancelled
CI / cover (push) Has been cancelled
CI / schema (27) (push) Has been cancelled
Container / merge (push) Has been cancelled
Installers / Release (push) Has been cancelled
2026-02-11 10:09:39 +01:00
Badlop 7de0afb613 CHANGELOG.md: Add links to issues 2026-02-11 10:08:11 +01:00
Badlop c407e87da3 CHANGELOG.md: Update to 26.02 2026-02-11 09:33:36 +01:00
Badlop 2681f3b5d8 Update man page to 26.02 2026-02-11 09:31:06 +01:00
Badlop f9a187c3aa Update Catalan and Spanish translations 2026-02-11 09:28:39 +01:00
Badlop 40fffe6cf4 Update Bulgarian translation (thanks to Mr. EddX) 2026-02-11 09:28:38 +01:00
Badlop 903943362e Update Chinese Simplified translation (thanks to Sketch6580) 2026-02-11 09:28:36 +01:00
Badlop e6120641f9 Update German translation (thanks to Stefan Strigler) 2026-02-11 09:28:34 +01:00
Badlop 43f0b811f5 New 'configure' input in manage-ejabberd to append in ./configure 2026-02-10 15:34:38 +01:00
Badlop bd61571ce5 Result of running "make format" 2026-02-10 15:34:34 +01:00
badlop e06bdd6b30 Merge pull request #4524 from sstrigler/invites_a11y_fixes
Invites a11y fixes
2026-02-10 15:28:10 +01:00
Stefan Strigler 75c66cba9c accessibility improvements 2026-02-10 15:06:45 +01:00
Badlop 531d17ddb9 mod_muc: Document all the protocols implemented 2026-02-10 11:12:09 +01:00
Badlop 1aa2e75a21 Update Catalan and Spanish translations 2026-02-10 11:12:07 +01:00
Badlop 416bee969f Update German translation (thanks to Stefan Strigler) 2026-02-10 11:12:06 +01:00
Badlop fa75800ee1 Update Czech translation (thanks to ffunk) 2026-02-10 11:12:04 +01:00
Badlop 5426358959 weekly.yml: Don't test mssql, as it fails
Right start fails with:

2026-02-09 11:48:05.211061+00:00 [warning]
 <0.26972.0>@ejabberd_sql:handle_reconnect/2:540
 mssql connection failed:
  ** Reason: {"01000",0,
              "[unixODBC][Driver Manager]Can't open lib 'libtdsodbc.so' :
               file not found Connection to database failed."}
2026-02-09 16:47:26 +01:00
Badlop 8e01c04e96 Use manage-ejabberd action in workflows to compile ejabberd 2026-02-09 16:47:25 +01:00
Badlop 809d9d2d0f gen_mod: Fix recent commit, deleting global hook when module in no more hosts 2026-02-09 16:47:23 +01:00
Badlop 7c2db2aebb mod_muc_mnesia: Fix bug introduced in 2b7285e when upgrading old database
If mod_muc uses Mnesia database,
and there is any room created using ejabberd older than 21.12,
and its room config was never modified using newer ejabberd versions...
in that case the room configuration does not contain hats_users.

When upgrading to ejabberd 25.10 or 26.01,
it tries to upgrade the MUC rooms configuration but fails with error:
  ejabberd_mnesia:transform_fun/2:382
  Failed to transform Mnesia table muc_room
2026-02-09 16:47:22 +01:00
Badlop 4f930cb94d mod_register_web: Document that enabling the module adds link to WebAdmin 2026-02-09 16:47:20 +01:00
Badlop 9a48088d84 Remove mod_muc_occupantid in example config: feature is now in mod_muc 2026-02-09 16:47:19 +01:00
Badlop 2e9b538c27 Ammend recent commit to fix warning, also run "make format" 2026-02-09 16:47:17 +01:00
Badlop 1a6d22615d make-binaries: Bump OpenSSL 3.5.5, Expat 2.7.4 2026-02-09 16:47:16 +01:00
Pawel Chmielowski 97fc89bc7f Fix dialyzer warning 2026-02-06 12:54:11 +01:00
Pawel Chmielowski fbc3349e04 Add odbc to dialyzer only if odbc is configured 2026-02-06 12:54:01 +01:00
Pawel Chmielowski 42122b7aa7 Prevent crash in mod_pubsub_serverinfo when parsing bad disco responses 2026-02-06 12:38:29 +01:00
Pawel Chmielowski ee05a863f7 Better handling of invalid percent encoded urls in ejabberd_http 2026-02-06 12:31:11 +01:00
Badlop 44fa357534 Result of running "make doap format options" 2026-02-06 00:52:46 +01:00
Badlop 354e4920b3 mod_invites: Handle 'auto' value as an atom in the 'landing_page' option 2026-02-06 00:28:06 +01:00
Badlop 9bfdb2b8d4 mod_conversejs: Report problem in WebAdmin autologin if WebSocket is disabled 2026-02-06 00:26:51 +01:00
Badlop e31fced208 mod_conversejs: Support in autologin for WebAdmin authentication with just username
WebAdmin supports to login by providing just the username, in that case
the HTTP Host is considered to be also the JID domain.
2026-02-06 00:26:49 +01:00
Badlop f65903a181 Mark changed options/commands with same emoji already used in CONTAINER.md 2026-02-06 00:26:47 +01:00
Paweł Chmielowski f21bd9b96e Merge pull request #4515 from sstrigler/mod_invites_fixes
Fixes for mod_invites
2026-02-05 14:08:06 +01:00
Pawel Chmielowski 0647a23ea7 Delete mnesia muc_occupant_id table 2026-02-05 13:57:22 +01:00
Pawel Chmielowski 9b5ea84ee5 Check in tests if room offer occupant-id feature 2026-02-05 13:56:56 +01:00
Pawel Chmielowski 7732984133 Move occupant_id storage and processing to mod_muc_room 2026-02-05 13:56:55 +01:00
Pawel Chmielowski 6f59b7e63d Fix dialyzer warning 2026-02-04 13:58:52 +01:00
Pawel Chmielowski 40d6ef6156 Use jid from mediated invitation instead of confernce jid in mod_block_strangers checks
For issue #4523
2026-02-04 13:00:54 +01:00
Badlop b5f8bc7c15 mod_muc_occupantid: When reloading config, clean obsolete salts (#4521) 2026-02-02 16:57:54 +01:00
Badlop 97e0530be1 mod_muc_occupantid: Fix Mnesia table creation (#4521) 2026-02-02 16:57:52 +01:00
Badlop 3ab3c71cf6 Don't delete global hook if stopping module that is alive in other host 2026-02-02 16:57:47 +01:00
Pawel Chmielowski 7bc96ee464 Add tests for muc hats 2026-01-30 12:24:41 +01:00
Stefan Strigler ca07b182c6 pretty print command errors 2026-01-30 11:34:04 +01:00
Stefan Strigler 3ffe6383b2 fix privacy tests 2026-01-30 10:36:38 +01:00
Stefan Strigler 47d898bb8b add support for roster pre-approval
Implementation of RFC 6121 section 3.4: Pre-Approving a Subscription Request
https://datatracker.ietf.org/doc/html/rfc6121#section-3.4
2026-01-30 10:36:38 +01:00
Pawel Chmielowski 3a5f7e6cfe Fix exception with adding hats info in presence
This should fix issue #4516
2026-01-30 09:49:16 +01:00
Stefan Strigler c8ba793851 fix type in docs for templates_dir 2026-01-30 08:18:24 +01:00
Stefan Strigler d0646e8009 traverse priv/mod_invites on install target
Fixes processone/ejabberd#4514
2026-01-30 08:18:24 +01:00
Stefan Strigler d89da2d3eb mentione dl script to get jquery and bootstrap 2026-01-30 08:18:24 +01:00
Stefan Strigler 99b54916f4 link to more specific places for jquery and bootstrap 2026-01-30 08:18:24 +01:00
Stefan Strigler d0437ab19a fix stale comma 2026-01-30 08:18:24 +01:00
Pawel Chmielowski 12910ed023 Define :TEST when using test MIX_ENV
This is needed for invites test
2026-01-26 13:40:55 +01:00
Pawel Chmielowski ae5356b2a6 Recognize -behavior attribute in opt_types script 2026-01-22 15:07:37 +01:00
Badlop f417b9f7c3 Amend previous commit: only Rebar2 needs this override
and that override, when using Rebar3,
breaks Dialyzer for mod_avatar and mod_http_upload
2026-01-21 23:05:38 +01:00
Badlop bd3c805e67 Use erlydtl 0.14.0 from hex.pm, or 0.15.0 from git
Rebar3 and Mix support hex.pm:
download its latest package 0.14.0

Rebar2 doesn't support hex.pm:
download 0.15.0 from git and delete its require_otp_vsn option.
2026-01-21 18:08:22 +01:00
Badlop 0375cea2ce Set version to 26.01
Container / build (amd64, <nil>) (push) Failing after 38s
Installers / binaries (amd64, <nil>) (push) Failing after 42s
CI / compile (27) (push) Has been cancelled
Container / build (arm64, -arm) (push) Has been cancelled
Installers / binaries (arm64, -arm) (push) Has been cancelled
Runtime / rebars (25, rebar) (push) Has been cancelled
Runtime / rebars (25, rebar3) (push) Has been cancelled
Runtime / rebars (26, rebar) (push) Has been cancelled
Runtime / rebars (26, rebar3) (push) Has been cancelled
Runtime / rebars (27, rebar3) (push) Has been cancelled
Runtime / rebars (28, rebar3) (push) Has been cancelled
Runtime / rebar3-elixir (1.14) (push) Has been cancelled
Runtime / rebar3-elixir (1.18) (push) Has been cancelled
Runtime / rebar3-elixir (1.19) (push) Has been cancelled
Runtime / mix (1.14) (push) Has been cancelled
Runtime / mix (1.18) (push) Has been cancelled
Runtime / mix (1.19) (push) Has been cancelled
CI / static (27) (push) Has been cancelled
CI / dynamic (27) (push) Has been cancelled
CI / ct (agnostic, 27, multi) (push) Has been cancelled
CI / ct (extauth, 27, multi) (push) Has been cancelled
CI / ct (ldap, 27, multi) (push) Has been cancelled
CI / ct (mnesia, 27, multi) (push) Has been cancelled
CI / ct (mysql, 27, multi) (push) Has been cancelled
CI / ct (mysql, 27, single) (push) Has been cancelled
CI / ct (pgsql, 27, multi) (push) Has been cancelled
CI / ct (pgsql, 27, single) (push) Has been cancelled
CI / ct (redis, 27, multi) (push) Has been cancelled
CI / ct (sqlite, 27, multi) (push) Has been cancelled
CI / ct (sqlite, 27, single) (push) Has been cancelled
CI / cover (push) Has been cancelled
CI / schema (27) (push) Has been cancelled
Container / merge (push) Has been cancelled
Installers / Release (push) Has been cancelled
2026-01-21 10:54:18 +01:00
Badlop 1d67918b8d CHANGELOG.md: Convert issues text to links 2026-01-21 10:54:18 +01:00
Badlop 3da3ced880 CHANGELOG.md: Update to 26.01 2026-01-21 10:26:04 +01:00
Badlop 85ca3cbd1b Update man page to 26.01 2026-01-21 10:07:16 +01:00
Badlop cef212145f mod_invites: Document that jQuery 3 and Bootstrap 4 are the supported versions 2026-01-21 10:00:36 +01:00
Badlop cf40d73f95 Dockerfile: Bump jQuery to 3.7.1, the latest supported 2026-01-21 10:00:33 +01:00
Badlop 7df7c7664d CONTAINER.md: Improve some explanations; update to 26.01 2026-01-20 20:51:49 +01:00
Badlop d0a91cc9de make-binaries: Don't strip attributes, they are needed by erlydtl 2026-01-20 20:51:49 +01:00
Badlop a7a11ef287 Dockerfile: Install JavaScript libraries for mod_invites using npm 2026-01-20 20:51:49 +01:00
Badlop db924b488c Revert "install mod_invites dependencies"
This reverts commit 41c8dbb135.
2026-01-20 20:51:01 +01:00
Pawel Chmielowski a213f6862d Remove extra logic for handling unsubscribed in mod_shared_roster
This breaks some state changes, and it's original purpose (removing
pending flag from roster item) works correctly without this it.
2026-01-20 18:07:42 +01:00
Badlop b70337513c Result of running "make format" 2026-01-20 12:16:19 +01:00
Badlop 0a0bb72501 Update version notes in modules, options and API commands 2026-01-20 12:16:19 +01:00
Badlop 5cbe7ebf54 Update other translations automatically 2026-01-20 12:16:19 +01:00
Badlop 9f165996b7 Update Spanish translation 2026-01-20 12:16:19 +01:00
Badlop 56589d491f Update Swedish translation (thanks to Stefan Strigler) 2026-01-20 12:16:19 +01:00
Badlop 35d082da8c Update German translation (thanks to Stefan Strigler) 2026-01-20 12:16:19 +01:00
Badlop 343f462ca5 Update German translation (thanks to poVoq and nautilusx) 2026-01-20 12:16:19 +01:00
Badlop 87a6ab7aee Update Chinese Simplified translation (thanks to Sketch6580) 2026-01-20 12:16:19 +01:00
Badlop 6e4a8ae015 Update French translation (thanks to Mickaël Rémond) 2026-01-20 12:16:19 +01:00
Badlop b2c7929d23 Update Bulgarian translation (thanks to Mr. EddX and Kiril Panayotov) 2026-01-20 12:16:19 +01:00
Badlop 956c0488c9 Update a few more copyright year 2026-01-20 12:16:19 +01:00
Badlop 5f0a26cf08 mod_invites: Mention implemented XEPs in the documentation 2026-01-20 12:16:19 +01:00
Badlop 5de8d8619f mod_invites: Update supported XEPs, then run "make doap" 2026-01-20 12:12:47 +01:00
badlop eb46646eb1 Merge pull request #4513 from sstrigler/fix-dl_invites_page_deps.sh
validate checksum for downloads
2026-01-20 12:00:12 +01:00
Stefan Strigler 6ce338e8e2 validate checksum for downloads
also use mktemp for temporary files
also use set -e to stop in case of error
2026-01-20 09:21:31 +01:00
Pawel Chmielowski 0bb0dcc6b1 Make mod_invites sql schema compatible with mysql<8 2026-01-19 20:29:17 +01:00
Badlop a315046af8 Result of running "make format" 2026-01-19 18:31:52 +01:00
Badlop 04946dbf74 mod_invites: Split paragraphs in shorter lines in source code
Also update some capitalization, punctuation, minor clarifications,
and try to differentiate "create account" and "create invitation".
2026-01-19 18:30:56 +01:00
Badlop bb900099a7 Update mix.lock and mix.lock 2026-01-19 18:30:53 +01:00
badlop 903c48f3a5 Merge pull request #4493 from sstrigler/great_invitations
Great invitations
2026-01-19 17:15:09 +01:00
Stefan Strigler 41c8dbb135 install mod_invites dependencies 2026-01-19 17:03:42 +01:00
Stefan Strigler 47b419dd98 add script to download landing page deps 2026-01-19 17:03:42 +01:00
Stefan Strigler 41e57f89c9 add js packages as recommended for debian packages 2026-01-19 17:03:42 +01:00
Stefan Strigler 480c6e0995 add support for 'great invitations' as mod_invites 2026-01-19 17:03:42 +01:00
Pawel Chmielowski ca364541e7 Properly parse presence_broadcast values passed to change_room_options command
This fixes issue #4510
2026-01-19 13:46:20 +01:00
Pawel Chmielowski b71fcfc82f Use tagged dependencies 2026-01-19 12:57:20 +01:00
Badlop 19a5edd63a mod_conversejs: Cosmetic change: sort paths alphabetically 2026-01-19 12:25:45 +01:00
Badlop 330d513fe8 Add new Conversejs Paths and ContentTypes (thanks to ieQu1)(#4511) 2026-01-19 12:25:43 +01:00
Badlop f07e16a597 mod_conversejs: Use ContentType functions from mod_http_fileserver (#4511) 2026-01-19 12:25:41 +01:00
Badlop 3c950fe65c mod_http_fileserver: Reduce system menu name, sort them alphabetically 2026-01-16 16:45:51 +01:00
Badlop a7aa52fc9f Bump Erlang/OTP 28.3.1 and Elixir 1.19.5 2026-01-16 16:45:49 +01:00
Badlop dd7f3033fc mod_http_upload: Pass ServerHost, not Host which may be "upload.HOST" 2026-01-15 20:25:46 +01:00
Badlop cc7e50782e mod_http_upload: Use content_type similarly to mod_http_fileserver (#4488) 2026-01-15 19:40:58 +01:00
Badlop 5fddf889e7 Use /websocket URL by default like mod_conversejs, it's more meaningful 2026-01-15 19:40:43 +01:00
Badlop bce68d52e7 Result of running "make format" 2026-01-15 19:40:38 +01:00
Pawel Chmielowski 2fac416520 Add replaced_connection_timeout option
This option enabled new session to wait for termination
of session that it replaces. This should mitigate
problems where old session presences unavailable sometimes
were delivered after new session sent it's presence available.
2026-01-15 17:04:03 +01:00
Pawel Chmielowski 1d2b0fc910 Fix whitespace warning 2026-01-14 13:52:13 +01:00
Pawel Chmielowski 8ac3661bcf Add db_serialize support in mnesia modules 2026-01-14 13:41:32 +01:00
Pawel Chmielowski bbcf0fa4f3 Fix whitespace warning 2026-01-13 10:26:20 +01:00
Pawel Chmielowski c531936f83 Add muc_online_rooms_count command 2026-01-13 10:07:09 +01:00
Badlop 6d74bef73b commands_tests: Better check for the disco item node instead of name 2026-01-12 18:21:02 +01:00
Badlop 96a1b16099 Fix specs reported by Dialyzer 2026-01-12 17:54:45 +01:00
Badlop 40d86edbc2 Amend recent commits: lists:append is preferable for 1-level deep lists
See
https://www.erlang.org/doc/system/listhandling.html#deep-and-flat-lists
2026-01-12 17:34:36 +01:00
Badlop be56e1305b mod_adhoc_api: Show nice command name, as WebAdmin already does 2026-01-12 17:34:18 +01:00
Badlop a76a9fa6e6 When building WebAdmin menu system, {URLPATH} in link text is substituted 2026-01-07 14:00:33 +01:00
Badlop 75e9294033 ejabberd_http: Support repeated module in request_handlers
If the same module serves several paths in request_handlers:

  -
    module: ejabberd_http
    request_handlers:
      /share: mod_http_fileserver
      /pub/test: mod_http_fileserver
      /assets: mod_http_fileserver

Until now the function find_handler_port_path only processed
the first path. Now all the paths are returned.
2026-01-07 14:00:30 +01:00
Badlop a864d89970 mod_http_fileserver: Support map of paths in docroot option 2026-01-07 14:00:27 +01:00
Badlop 7bbea9e186 Dockerfile: Use "make prod" instead of "make rel" 2026-01-07 14:00:24 +01:00
Metalhearf 5f94b5252b Update copyright year to 2026 2026-01-05 12:22:57 +01:00
Badlop 2d16c7d1f4 ejabberd_admin: Result of running "make format" after commit ff31ef7f3 2025-12-24 13:37:56 +01:00
Badlop 8fddc9665f ejabberd_http: Get back handling when BOSH or WS are disabled
This support was broken in recent commit 06a8994f2
2025-12-24 13:37:52 +01:00
Badlop 0d24869274 ejabberd_oauth: Fix typo in previous commit 2025-12-24 13:37:50 +01:00
Badlop d2fb995753 ejabberd_oauth: Log error if oauth_list_tokens executed with unsupported DB (#4506) 2025-12-23 18:48:17 +01:00
Badlop 6c751b03c9 ejabberd_commands: Show meaningul error message when problem executing command (#4506) 2025-12-23 18:48:14 +01:00
Badlop 0e8e4579a6 manage-ejabberd: If something fails, print logs 2025-12-19 01:36:45 +01:00
Badlop 937239e329 Dockerfile: Try to fix error with recent freetds Alpine package 2025-12-19 01:36:42 +01:00
Badlop 37f34924f5 ejabberdctl.cfg: Move FIREWALL_WINDOW down, as it is used only for EPMD 2025-12-19 01:36:39 +01:00
Badlop e66e495c22 ejabberd_app: Ammend c35605e log text 2025-12-19 01:36:37 +01:00
Badlop 124d3f3ab0 ejabberdctl: Ammend a22c88a text when ERL_DIST_PORT is already used 2025-12-19 01:36:35 +01:00
Badlop ff31ef7f3d When epmd isn't running show explanation in Clustering WebAdmin page 2025-12-19 01:36:33 +01:00
dependabot[bot] 141dba70e5 build(deps): bump actions/download-artifact from 6 to 7
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v6...v7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-19 01:36:31 +01:00
dependabot[bot] d532705d52 build(deps): bump actions/cache from 4 to 5
Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4...v5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-19 01:36:30 +01:00
dependabot[bot] d45c7e94ca build(deps): bump actions/upload-artifact from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v5...v6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-19 01:36:28 +01:00
Pawel Chmielowski bea87c9f05 Remove file commited by mistake 2025-12-16 12:56:57 +01:00
Badlop 9101d7edf0 Container: Apply commit a22c88a
ejabberdctl.template: Show meaningful error when ERL_DIST_PORT is in use
2025-12-12 16:57:05 +01:00
Badlop d88da5717d Container: Apply commit fb572bf
ejabberdctl: When ping returns pang, return also status code 1 (#4327)
2025-12-12 16:57:03 +01:00
Badlop cf2962a359 Container: Apply commit 7f8519c
ejabberdctl: If ERLANG_NODE lacks host, add hostname (#4288)
2025-12-12 16:57:01 +01:00
Badlop 0f5b61b096 Container: Setup new macro STARTTLS_REQUIRED to allow easy disabling 2025-12-12 16:56:58 +01:00
dependabot[bot] 5260597717 build(deps-dev): bump ex_doc from 0.39.1 to 0.39.2
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.39.1 to 0.39.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.39.1...v0.39.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-12 16:56:56 +01:00
Badlop 0a2a486c77 Bump Erlang/OTP 28.3 2025-12-12 16:56:53 +01:00
Badlop 4944f77159 mod_muc_occupantid: Keep salt per MUC service, not individual rooms 2025-12-12 16:56:51 +01:00
Badlop e77bdf6e35 Separate relive/relivectl paths so ejabberdctl script works correctly 2025-12-12 16:56:48 +01:00
Badlop 5d3b8010cd Update some forgotten documentation from default/new to singlehost/multihost 2025-12-12 16:56:46 +01:00
Badlop 6f424ecd1a Result of running "make doap" 2025-12-12 16:56:43 +01:00
Badlop 08b47e62ec Bump more XEPs versions already supported 2025-12-12 16:56:40 +01:00
Badlop 6c20273ad1 Result of running "make doap" 2025-12-11 12:27:37 +01:00
Badlop f9ed405118 Bump some XEPs versions that are already supported 2025-12-11 12:27:36 +01:00
Badlop acd077c728 mod_muc_room: Rewrite Hats code that gets xdata values 2025-12-11 12:27:35 +01:00
Badlop c589cf68c2 mod_muc_room: Handle hats without definition (#4503) 2025-12-11 12:27:34 +01:00
Badlop a824385424 mod_muc_room: When user has no hats, don't store in hats_users 2025-12-11 12:27:32 +01:00
Badlop 46737b115d mod_muc: Allow vcard queries even when IQ queries are disabled (#4489) 2025-12-11 12:27:30 +01:00
Badlop b1ab2808bb ejabberd_web_admin: Show menu system only when can view vhosts 2025-12-10 13:12:03 +01:00
Badlop 849d239a79 Ammend recent commit c35605e to work in Common Test 2025-12-10 13:11:56 +01:00
Badlop 96a8fc516d Makefile.in: Add "make relivectl" similar to relive but using ejabberdctl
"make relive" was presented in
https://www.process-one.net/blog/ejabberd-22-05/#new-make-relive

Documentation mentions it in:
https://docs.ejabberd.im/admin/install/source/#start

Comparison "make relive" <--> "make relivectl"

- Starts ejabberd using:
  Rebar3/Mix tools <--> ejabberdctl script

- Compiles ejabberd before start?
  Yes! <--> No

- Recompiles source code at runtime?
  Yes! using Sync/ExSync <--> No

- Reads ejabberdctl.cfg?
  No <--> Yes!

In summary:
- relive: preferable when developing: recompiles source code automatically
- relivectl: preferable when testing: uses ejabberdctl script and ejabberdctl.cfg

Example usage:
./autogen.sh && ./configure && make && make relivectl
2025-12-10 10:36:04 +01:00
Badlop a22c88a5c0 ejabberdctl.template: Show meaningful error when ERL_DIST_PORT is in use 2025-12-10 10:33:28 +01:00
Badlop c35605ecce ejabberd_app: Print address and port where listens for erlang node connections 2025-12-10 10:33:25 +01:00
Badlop 6a598ee3cb ejabberd_logger: Ammend commit 97aac8a4 to avoid duplicate newline 2025-12-10 10:33:20 +01:00
Pawel Chmielowski daab203ec0 Revert changes to conversion of pgsql int types 2025-12-05 20:25:42 +01:00
Pawel Chmielowski 7a5319251e Extend timestamp type handling in sql macros 2025-12-05 19:42:31 +01:00
Pawel Chmielowski 6263a93f8f Update p1_mysql to bring fix for timestamp decoding 2025-12-05 19:42:25 +01:00
Pawel Chmielowski 15fd7dc900 Apply timestamp pass in ?SQL_INSERT queries 2025-12-04 16:09:19 +01:00
Pawel Chmielowski 3758128e83 Deliver pubsub notifications to remote servers for nodes with presence based delivery
Nodes configured for presence based delivery did send notifications
only to subscribers that did match presence rules. But this only
works for local users, as we don't know presence for remote users.

This change makes subscribers from remote server get
notification without performing any presence tests.
2025-12-02 18:31:23 +01:00
Badlop cfd54fa9a2 make-binaries: Bump Erlang/OTP 28.2 and Elixir 1.19.4 2025-12-02 18:22:46 +01:00
Badlop 538766bacf Dockerfile: Bump Erlang/OTP 28.2.0.0 and Elixir 1.19.4 2025-12-02 18:22:44 +01:00
Badlop e8eab55d4f mod_muc: Set enable_hats room option true by default 2025-12-02 18:22:41 +01:00
Pawel Chmielowski 525f8bac22 Fix error handling in last commit 2025-12-02 14:08:09 +01:00
Pawel Chmielowski 220eb98f2e Add db serialization to mod_muc_sql 2025-12-02 12:38:06 +01:00
Holger Weiss 7be6580b65 mod_scram_update: Don't hard-code iteration count 2025-11-29 23:25:36 +01:00
Badlop 0d0b39c89f Use improved WebAdmin menu system in more modules 2025-11-27 17:19:29 +01:00
Badlop 091e7e27d4 ejabberd_web_admin: Add helper functions make_menu_system 2025-11-27 17:19:27 +01:00
Badlop 06a8994f24 ejabberd_http: Add helper get_auto_urls/2 that returns all URLs and TLS 2025-11-27 17:19:25 +01:00
Pawel Chmielowski 905a433950 Fix dialyzer warnings 2025-11-27 16:21:17 +01:00
Pawel Chmielowski b72b92cc46 Add commands for new dataabase export/import 2025-11-27 15:30:39 +01:00
Badlop c9e3f0bcf6 mod_http_upload: Amend the fix for #4450 to support IDNA correctly (#3519) 2025-11-27 01:17:40 +01:00
Badlop 434b0423e4 Bump Jose 1.11.12 for Erlang/OTP 26 and newer
Erlang/OTP 25 cannot compile Jose 1.11.12, supports only up to 1.11.10

Revert partially "Remove HAVE_URI_STRING" 489b3fdfb5.
2025-11-27 01:17:18 +01:00
dependabot[bot] e946d20bda build(deps): bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [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/v5...v6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-27 01:17:15 +01:00
Pawel Chmielowski 3de7cceadc Fix dialyzer warning 2025-11-20 13:17:16 +01:00
Pawel Chmielowski 5b83603d51 New database export/import infrastructure 2025-11-20 12:24:50 +01:00
Badlop 03e535eac0 mod_conversejs: Improve link to conversejs in WebAdmin (#4495)
Until now, the WebAdmin menu included a link to the first request handler
with mod_conversejs that the admin configured in ejabberd.yml
That link included the authentication credentials hashed as URI arguments
if using HTTPS. Then process/2 extracted those arguments and passed them
as autologin options to Converse.

From now, mod_conversejs automatically adds a request_handler nested in
webadmin subpath. The webadmin menu links to that converse URI; this allows
to access the HTTP auth credentials, no need to explicitly pass them.
process/2 extracts this HTTP auth and passes autologin options to Converse.
Now scram password storage is supported too.

This minimum configuration allows WebAdmin to access Converse:

listen:
  -
    port: 5443
    module: ejabberd_http
    tls: true
    request_handlers:
      /admin: ejabberd_web_admin
      /ws: ejabberd_http_ws
modules:
  mod_conversejs:
    conversejs_resources: "/home/conversejs/12.0.0/dist"
2025-11-18 13:37:51 +01:00
Badlop c0de565d2c ejabberd_web_admin: Pass Level in webadmin_menu_system_post and inside hooks 2025-11-18 13:37:00 +01:00
Badlop 3e847f3302 ejabberd_http: Run new http_request_handlers_init fold hook 2025-11-18 13:37:00 +01:00
Badlop 23a3180862 Runtime: Let it pick Elixir 1.19, new 1.19.3 works correctly 2025-11-18 13:37:00 +01:00
Badlop 12d85aef48 Dockerfile: Bump Elixir 1.19.3 2025-11-18 13:36:50 +01:00
Badlop 86fe0ff355 Dockerfile: Expose also port 7777 for SOCKS5
Ports unused in the default configuration, and consequently not exposed:
- 8883 MQTTS
- 5060 SIP
- 5060 SIPS
2025-11-17 20:07:23 +01:00
Badlop dced4f4dac Dockerfile: Configure TURN ports and expose 5478 50000-50099 2025-11-17 20:07:20 +01:00
dependabot[bot] bf46082c82 Bump dialyxir from 1.4.6 to 1.4.7
Bumps [dialyxir](https://github.com/jeremyjh/dialyxir) from 1.4.6 to 1.4.7.
- [Release notes](https://github.com/jeremyjh/dialyxir/releases)
- [Changelog](https://github.com/jeremyjh/dialyxir/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jeremyjh/dialyxir/compare/1.4.6...1.4.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-17 18:05:26 +01:00
Badlop e9b653e6da misc: Get back functions and mark them as deprecated 2025-11-17 18:04:56 +01:00
Badlop 71dccedfc6 Move get_url functions from mod_host_meta to ejabberd_http 2025-11-14 15:18:14 +01:00
Badlop b24230fe0a ejabberd_captcha: Use mod_host_meta:get_auto_url/2 2025-11-14 15:15:32 +01:00
Badlop edb9aa053d mod_host_meta: Allow calling get_url/2 for other modules, not only websocket 2025-11-14 15:15:30 +01:00
Badlop b1bf769e59 mod_host_meta: Cosmetic rename Module to Handler 2025-11-14 15:15:28 +01:00
Badlop b315fe4770 mod_pubsub_serverinfo: Bump support for XEP-0485 1.0.0 2025-11-14 15:15:22 +01:00
Badlop 026bd24a56 Runtime: Test Elixir 1.19.1, not 1.19.2 as it has a bug building app file
Relevant commit that will fix the problem in elixir 1.19.3:
https://github.com/elixir-lang/elixir/commit/0126f1f1a330049c4b25bc916fa14a69b4b6b20d
2025-11-13 18:24:18 +01:00
Badlop ce500fa30e Remove OTP_BELOW_25 2025-11-13 18:24:16 +01:00
Badlop 51081276c2 Remove OTP_BELOW_24 2025-11-13 18:24:13 +01:00
Badlop 9b1c81829a Remove SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL 2025-11-13 18:24:12 +01:00
Badlop 7e1237bb0f Remove COMPILER_REPORTS_ONLY_LINES 2025-11-13 18:24:10 +01:00
Badlop 80fd0e4b6d Remove USE_OLD_PG2 2025-11-13 18:24:09 +01:00
Badlop 26875762b5 Remove USE_OLD_CRYPTO_HMAC 2025-11-13 18:24:07 +01:00
Badlop ebfcf3b5db Remove NO_CUSTOMIZE_HOSTNAME_CHECK 2025-11-13 18:24:05 +01:00
Badlop c472aad566 Remove LAGER 2025-11-13 18:24:04 +01:00
Badlop 59138d810c Remove USE_OLD_HTTP_URI 2025-11-13 18:24:02 +01:00
Badlop 489b3fdfb5 Remove HAVE_URI_STRING 2025-11-13 18:24:00 +01:00
Badlop 4a225c0f4b Remove HAVE_ERL_ERROR 2025-11-13 18:23:59 +01:00
Badlop 997b32b46a Remove irrelevant macro DEPRECATED_GET_STACKTRACE
Its usage was removed two months ago in commit 19b7106
2025-11-13 18:23:57 +01:00
Badlop 5c1566ddb7 CONTAINER.md: Podman already supports exposing range of ports 2025-11-13 18:23:55 +01:00
Badlop 3f10994574 Require Elixir 1.14 or higher, that's the lowest we can test automatically 2025-11-13 18:23:54 +01:00
Badlop 2dbd0795b9 Remove dependency support for Erlang older than 25 2025-11-13 18:23:52 +01:00
Badlop 55e1c5ef78 mod_muc: Fix recent commit when deleting account
The function set_nick crashes if mod_muc is not enabled in some vhosts,
for example when running the Common Tests; and that should not be
considered a failure.
2025-11-13 18:23:50 +01:00
Badlop c51d5e0416 Don't bother to ignore examples/ path in workflows, as it doesn't exist 2025-11-13 18:23:47 +01:00
Badlop 2e41f64243 mod_muc: Announce stable-id feature from XEP-0045 1.31, supported since long ago 2025-11-06 18:30:14 +01:00
Badlop 1b2a166693 Improve documentation of install_contrib_modules (#4487) 2025-11-06 18:30:12 +01:00
Badlop be30990d7f Crash in terminate/2 when stopping mod_muc_log (#4486) 2025-11-06 18:30:11 +01:00
Badlop 5219bf36a9 Container: Apply recent changes in ejabberdctl.template
Even if those changes are not used in the container,
let's try to keep both files as similar as possible.
2025-11-06 18:30:09 +01:00
badlop 3182a3100c Merge pull request #4320 from catap/openbsd
ejabberdctl: support OpenBSD su
2025-11-06 18:16:23 +01:00
Badlop 59f5621ffa mod_muc: Run new hooks: registering_nickmuc and registered_nickmuc (#4478) 2025-11-05 20:03:36 +01:00
Badlop c4d9e536b6 mod_muc: When deleting account, unregister account's nicks in all MUC hosts (#4478) 2025-11-05 20:03:34 +01:00
dependabot[bot] a97d8ab046 Bump actions/download-artifact from 5 to 6
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v5...v6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-05 20:03:33 +01:00
Badlop f7e8d8f1c1 Dockerfile: Bump Erlang/OTP 28.1.0.0 amd Elixir 1.19.1 (#4477) 2025-11-05 20:03:31 +01:00
Badlop 97aac8a446 ejabberd_logger: Append "color clean" only in console template, not file
This amends commit d70ac7f7c
2025-11-05 20:03:29 +01:00
Badlop 3f391be8f0 Installers: Try again to fix artifact paths 2025-11-05 20:03:27 +01:00
Pawel Chmielowski e86362bb2b Make rest module use separate httpc profile 2025-11-05 12:22:49 +01:00
Paweł Chmielowski f17c5a3350 Merge pull request #4476 from ChaosKid42/fix_preload_rooms_with_sql
fix preload_rooms in case of SQL-DB
2025-10-30 09:48:46 +01:00
Christoph Scholz b9a161bb1a fix preload_rooms in case of SQL-DB 2025-10-29 17:16:58 +01:00
Paweł Chmielowski 18110f240b Merge pull request #4475 from sstrigler/ssl_handshake_warnings
Improve logged SSL error messages
2025-10-29 13:12:16 +01:00
Stefan Strigler 92c329912c fix nasty ssl warnings 2025-10-29 08:40:31 +01:00
Badlop d97366fe74 Installers: Fix yaml syntax
Container / build (amd64, <nil>) (push) Failing after 43s
Installers / binaries (amd64, <nil>) (push) Failing after 46s
CI / compile (27) (push) Has been cancelled
Container / build (arm64, -arm) (push) Has been cancelled
Installers / binaries (arm64, -arm) (push) Has been cancelled
Runtime / rebars (25, rebar) (push) Has been cancelled
Runtime / rebars (25, rebar3) (push) Has been cancelled
Runtime / rebars (26, rebar) (push) Has been cancelled
Runtime / rebars (26, rebar3) (push) Has been cancelled
Runtime / rebars (27, rebar3) (push) Has been cancelled
Runtime / rebars (28, rebar3) (push) Has been cancelled
Runtime / rebar3-elixir (1.14) (push) Has been cancelled
Runtime / rebar3-elixir (1.18) (push) Has been cancelled
Runtime / rebar3-elixir (1.19) (push) Has been cancelled
Runtime / mix (1.14) (push) Has been cancelled
Runtime / mix (1.18) (push) Has been cancelled
Runtime / mix (1.19) (push) Has been cancelled
CI / static (27) (push) Has been cancelled
CI / dynamic (27) (push) Has been cancelled
CI / ct (agnostic, 27, multi) (push) Has been cancelled
CI / ct (extauth, 27, multi) (push) Has been cancelled
CI / ct (ldap, 27, multi) (push) Has been cancelled
CI / ct (mnesia, 27, multi) (push) Has been cancelled
CI / ct (mysql, 27, multi) (push) Has been cancelled
CI / ct (mysql, 27, single) (push) Has been cancelled
CI / ct (pgsql, 27, multi) (push) Has been cancelled
CI / ct (pgsql, 27, single) (push) Has been cancelled
CI / ct (redis, 27, multi) (push) Has been cancelled
CI / ct (sqlite, 27, multi) (push) Has been cancelled
CI / ct (sqlite, 27, single) (push) Has been cancelled
CI / cover (push) Has been cancelled
CI / schema (27) (push) Has been cancelled
Container / merge (push) Has been cancelled
Installers / Release (push) Has been cancelled
2025-10-28 13:56:01 +01:00
Badlop 0258195682 Update mix.lock 2025-10-28 13:52:35 +01:00
Badlop 7805241296 Installers: Fix paths to the downloaded installers 2025-10-28 13:46:31 +01:00
Badlop 33ea1823de Set version to 25.10 2025-10-28 13:39:19 +01:00
Badlop 038444773b Container: Try to push resulting image tags properly 2025-10-28 13:39:14 +01:00
Badlop 85b614e77b CHANGELOG.md: Update to 25.10 2025-10-28 12:02:01 +01:00
Badlop 02aa256c59 Copy recent changes to the container template files 2025-10-28 12:01:57 +01:00
Badlop 21c6cc8fd1 Update man page to 25.10 2025-10-28 10:29:17 +01:00
Badlop 5728db746d Update version notes to 25.10 2025-10-28 10:29:16 +01:00
Badlop 5083217fce Update doap file 2025-10-28 10:29:15 +01:00
dependabot[bot] 527c000441 Bump ex_doc from 0.38.3 to 0.39.1
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.38.3 to 0.39.1.
- [Release notes](https://github.com/elixir-lang/ex_doc/releases)
- [Changelog](https://github.com/elixir-lang/ex_doc/blob/v0.39.1/CHANGELOG.md)
- [Commits](https://github.com/elixir-lang/ex_doc/compare/v0.38.3...v0.39.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-28 10:29:13 +01:00
Badlop 48af6467ea mod_announce: Fix API commands descriptions 2025-10-28 10:29:11 +01:00
Badlop b051bcd983 Weekly: No need to test XMPP interop also on the weekly workflow 2025-10-27 12:45:38 +01:00
dependabot[bot] 11a6d3659e Bump actions/upload-artifact from 4 to 5
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 12:40:23 +01:00
Badlop 412489d31b Update Spanish and Catalan translations 2025-10-27 12:37:12 +01:00
Badlop b75e08edf7 Update Russian translation (thanks to Yurt Page) 2025-10-27 12:02:29 +01:00
Badlop ff83eb960a Fix text and capitalization of some translatable strings 2025-10-27 11:50:53 +01:00
Badlop 67208fad9d mod_announce: Add API commands, reusing existing ad-hoc functions 2025-10-23 20:51:03 +02:00
Badlop e02864bf6c mod_announce: Add comments for Vim folding to help module reading 2025-10-23 20:51:01 +02:00
Badlop 45abd38d09 mod_muc_admin: Use in WebAdmin the new API commands that get nick registers 2025-10-23 20:51:00 +02:00
Badlop e7cf1d0b87 mod_muc_admin: New API commands muc_get_registered_nick and nicks (#4468) 2025-10-23 20:50:58 +02:00
Badlop b7aa7dc64c mod_muc: New functions to get registered nick/nicks 2025-10-23 20:50:57 +02:00
Badlop d10d7aa8cc WebAdmin: Respect newline and whitespace characters in results 2025-10-23 20:50:55 +02:00
Badlop 6b3333c3ff Runtime: Test with new Elixir 1.19 2025-10-23 20:50:53 +02:00
Badlop 3ba6a8e039 Fix typo introduced in recent commit 5575d4e78 2025-10-23 20:50:50 +02:00
Pawel Chmielowski c27a3a02fe Tag dependences 2025-10-23 13:48:49 +02:00
Pawel Chmielowski ca05bbd652 Don't catch exit:{aborted, _} inside mnesia transactions
This is used by mnesia internally to retry deadlocked transaction,
so we should allow it to propagate.

This could be triggered by calling create_node concurrently from
multiple processes and did lead to {cyclic, ...} errors.
2025-10-22 16:12:58 +02:00
Pawel Chmielowski 357988b662 Check if room is hibernated before calling mod_muc process
This moves fetching hibernation data from mod_muc process
to caller process, and makes us call mod_muc only
if we have something to unhibernate.
2025-10-21 18:37:22 +02:00
Paweł Chmielowski c40df92263 Merge pull request #4471 from pouriya/pass-HTTP-headers-from-WS-to-C2S-connection
ref: pass HTTP headers from WS to C2S
2025-10-21 12:09:42 +02:00
Pouriya cbe30c1fcb ref: pass HTTP headers from WS to C2S connection 2025-10-21 13:13:08 +03:30
Badlop f77b55c073 mod_configure: New ad-hoc commands that were missing from XEP-0133 2025-10-20 13:04:36 +02:00
Badlop f9ab175a79 ejabberd_admin: New API command restart_kindly, improve stop_kindly 2025-10-20 13:04:28 +02:00
Badlop fb0097a6e0 mod_admin_extra: New API commands: list_banned and count_banned 2025-10-20 13:04:25 +02:00
Badlop d247003038 mod_admin_extra: Improve API command status_list: support for status to be a list
This is used by mod_configure for some ad-hoc commands
2025-10-20 13:04:24 +02:00
Badlop 0f2d64c10d mod_adhoc_api: Add support for async command calling 2025-10-20 13:04:22 +02:00
Badlop d49ccbf031 mod_adhoc_api: If argument is a list of jids, type is jid-multi 2025-10-20 13:04:20 +02:00
Badlop 6d5065ae3a mod_adhoc_api: If field has several values, type is text-multi 2025-10-20 13:04:19 +02:00
Badlop 803e6d743a Fix small typo 2025-10-20 13:04:17 +02:00
Badlop 2bf4a5970a CI: Fix updating ubuntu packages 2025-10-20 10:53:47 +02:00
Holger Weiss 9e985e3e79 mod_push: Apply cosmetic changes 2025-10-18 00:47:09 +02:00
Holger Weiss 72661acb43 Merge remote-tracking branch 'processone/pr/4383'
* processone/pr/4383:
  feat: fire new `push_send_notification` hook
2025-10-18 00:43:01 +02:00
badlop eace76b16e Merge pull request #4460 from badlop/arm_runner
Use ARM native runner and parallelization in workflows to reduce perceived run time
2025-10-17 09:30:12 +02:00
badlop ca03a97ca2 Merge pull request #4469 from guusdk/xmpp-interop-testing-v1.7.2
CI: bump XMPP-Interop-Testing/xmpp-interop-tests-action
2025-10-16 15:07:17 +02:00
Pawel Chmielowski 95d54f9568 Fix formating 2025-10-14 15:13:34 +02:00
Pawel Chmielowski 62185c8d30 Remove dialyzer warnings 2025-10-14 15:01:34 +02:00
Pawel Chmielowski ef94ee66fd Use mod_private:del_data in unban_account command 2025-10-14 14:10:23 +02:00
Pawel Chmielowski f666cd4643 Fix dialyzer warning 2025-10-14 13:53:15 +02:00
Pawel Chmielowski 12989ba5eb Add del_data/3, get_users_with_data/2, count_users_with_data/2 in mod_private 2025-10-14 11:38:21 +02:00
Guus der Kinderen 63f3b4f7af CI: bump XMPP-Interop-Testing/xmpp-interop-tests-action
Updates this GitHub Action that's used to execute XMPP-based interop tests from v1.7.1 to v1.7.2.

This bugfix release introduces some changes that improve the stability of the tests. Highlights include:

- No longer includes tests that verify client, instead of server behavior
- Add prerequisite checks for various tests, to prevent them from failing if the server under test doesn't support the feature
- Remove prerequisite checks for other tests where they needlessly prevent a test from executing
2025-10-13 22:04:06 +02:00
Pawel Chmielowski 7a4ea0eba2 Add config transformer from use_new_schema -> sql_multihost_schema 2025-10-13 11:36:52 +02:00
Badlop ad4876821b Installers: Generate ARM installers in native runner 2025-10-09 13:54:14 +02:00
Badlop cf2b2d5e85 Container: Build ARM in native runner instead of QEMU, merge and clean 2025-10-09 13:54:13 +02:00
Badlop a0c5df0c5b Weekly: New workflow that condenses CI, test all erlang without caching 2025-10-09 13:54:11 +02:00
Badlop ae36405466 CI and Runtime: Reorganize steps to run in parallel, and ARM runner 2025-10-09 13:54:10 +02:00
Badlop e7eb116d93 Add local composite actions to manage ejabberd and databases 2025-10-09 13:54:08 +02:00
Badlop 10a82afd46 Tests: Run agnostic-database tests only once, not for every backend 2025-10-09 13:54:06 +02:00
Badlop bba9563525 Tests: The odbc backend is not actually used in Commont Tests 2025-10-09 13:54:04 +02:00
Badlop 558cabd860 Tests: Fix typo when commenting CT_BACKENDS environment variable 2025-10-09 13:54:02 +02:00
Badlop 2118c3028f mod_admin_update_sql: Use same index name than when creating database 2025-10-09 13:54:00 +02:00
badlop 4a7238afea Merge pull request #4459 from badlop/maybe
Enable maybe expression for Erlang 25 and 26
2025-10-09 12:47:30 +02:00
badlop 127c909f0f Merge pull request #4456 from badlop/multihost
Rename New SQL schema to Multihost, and Default to Singlehost
2025-10-09 12:15:10 +02:00
Badlop 1a7c1c5c06 mod_mam: Mention ejabberd version of the new option 2025-10-09 11:17:36 +02:00
Badlop dd5d2aeee0 make-binaries: Bump Expat 2.7.3, OpenSSL 3.5.4, unixODBC 2.3.14 2025-10-09 11:17:34 +02:00
Badlop 1d99c5cb60 Revert "make-binaries: Bump crosstool to 1.28.0"
This reverts commit 4e909fc50d.
2025-10-09 11:17:32 +02:00
badlop b9e4bbc070 Merge pull request #4463 from guusdk/xmpp-interop-testing-disable-XEP-0421
CI: Disable XEP-0421 testing that consistently fails
2025-10-08 19:07:17 +02:00
badlop 41fab88ee5 Merge pull request #4462 from guusdk/xmpp-interop-testing-v1.7.1
CI: bump XMPP-Interop-Testing/xmpp-interop-tests-action
2025-10-08 19:06:52 +02:00
Pawel Chmielowski 0ca877f925 make misc:json_encode always call json with our filter 2025-10-07 14:42:13 +02:00
Pawel Chmielowski b480f125ee Add commands argument type binary_or_list
This allow commands accepting list of binary, that will also
accept single binary that will be converted to list
2025-10-07 13:30:05 +02:00
Pawel Chmielowski 7ee5f81923 Format sub elements for tuples from maps 2025-10-07 13:21:36 +02:00
Guus der Kinderen 3d43b98d42 CI: Disable XEP-0421 testing that consistently fails
The XMPP Interop Framework tests for XEP-0421 consistently report test failures. These tests should be disabled, until appropriate fixes are applied to ejabberd.
2025-10-02 15:41:52 +02:00
Guus der Kinderen 1636c202a7 CI: bump XMPP-Interop-Testing/xmpp-interop-tests-action
Updates this GitHub Action that's used to execute XMPP-based interop tests from v1.6.1 to v1.7.1.

This does not bring a significant amount of new tests (although some early tests for XEP-0060: 'Publish/Subscribe' was added), but does improve the stability of the existing tests (meaning: less false positives and less 'flacky' tests).

Additional configuration options have been added:

- there now are three different ways to provision test accounts on the server-under-test. That should make it easier for some to embed our tests to their pipeline
- the failOnImpossibleTest option fails the test run if any configured tests were impossible to execute, ensuring all intended tests actually ran.
2025-10-02 15:05:14 +02:00
Jérôme Sautret 060992bafa Improve roster API commands documentation 2025-09-30 16:38:23 +02:00
Pawel Chmielowski c0c69394b9 Make mod_muc_sql properly handle new hats data (#4380) 2025-09-30 10:00:11 +02:00
Badlop 2b7285e0b2 Update implementation of XEP-0317 Hats to version 0.3.1 (#4380) 2025-09-30 10:00:05 +02:00
Badlop c3a24ffdf8 Revert "mod_muc_room.hrl: Work around old Dialyzer bug"
This reverts commit c4f6c9dfe7.
2025-09-30 09:58:14 +02:00
Pawel Chmielowski 48fb446f8c Properly pass send_timeout option to listener sockets 2025-09-26 10:44:38 +02:00
Pawel Chmielowski 0283a501fa Add archive_muc_as_mucsub option in mod_mam
This option can be used to enable archiving of
incoming groupchat messages as mucsub events
if user is subscribed to a room.
2025-09-25 10:06:26 +02:00
Badlop fb572bf901 ejabberdctl: When ping returns pang, return also status code 1 (#4327) 2025-09-24 13:27:04 +02:00
Badlop 7eb09295a3 mod_block_strangers: Clarify access and catpcha documentation (#4221) 2025-09-24 13:27:02 +02:00
Badlop e0eae52eae mod_muc_room: Don't require password if user is owner of room 2025-09-24 13:27:00 +02:00
Badlop dd270f99fc container.md: Update versions used in ecs container image 2025-09-24 13:26:59 +02:00
Badlop 1472caab50 make-binaries: Bump OpenSSL 3.5.3 and Expat 2.7.2 2025-09-24 13:26:57 +02:00
Badlop ef2e62a01c Bump Erlang/OTP version to 27.3.4.3 in installers and container 2025-09-24 13:26:55 +02:00
Badlop 4e909fc50d make-binaries: Bump crosstool to 1.28.0 2025-09-24 13:26:53 +02:00
Pawel Chmielowski 19b7106124 Remove EX_RULE and EX_STACK macros
As we no longer targer R19, we no longer need to carry those.
2025-09-23 11:25:17 +02:00
Badlop ccd9fa6561 Enable feature maybe_expr also in the runtime for Erlang/OTP 25
As explained in https://erlangforums.com/t/how-to-enable-maybe-expr/2154
- Erlang/OTP 27 and newer has already the feature enabled by default
- Erlang/OTP 26 requires enabling the feature in the compiler
- Erlang/OTP 25 requires enabling also in the runtime system
2025-09-22 16:04:42 +02:00
Badlop 1ddd72ffe7 Enable feature maybe_expr in the compiler for Erlang/OTP 26
Documentation:
https://www.erlang.org/doc/system/expressions.html#maybe
https://www.erlang.org/eeps/eep-0049
https://www.erlang.org/eeps/eep-0060
2025-09-22 16:04:42 +02:00
Badlop b759acdcea Runtime: Remove Erlang 24 which won't work anymore with maybe_expr 2025-09-22 16:04:42 +02:00
Badlop 4eee6d7cec CI: Don't care to include commit details in the CT logs HTML page 2025-09-18 12:02:04 +02:00
Badlop 5575d4e78e Rename New SQL schema to Multihost, and Default to Singlehost
Right now all names are supported, the previous (obsolete)
and the renamed (preferred). The changes relevant to the usage are:

When preparing configuration, the arguments:
  ./configure --enable-new-sql-schema
  ./configure --enable-multihost-sql-schema

When configuring ejabberd, the toplevel options:
  new_sql_schema: true
  sql_schema_multihost: true

When developing source code, the functions:
  ejabberd_sql:use_new_schema()
  ejabberd_sql:use_multihost_schema()
2025-09-17 11:12:38 +02:00
Badlop 4dea2f1eb6 Fix some Elvis reports 2025-09-03 12:20:42 +02:00
Badlop 1d5b9bba15 Get yconf that fixes problem introduced in recent commit (#4444) 2025-08-29 17:18:06 +02:00
Badlop 2951281115 mod_http_upload: Encode URL before parsing, as done before bba1a1e3c (#4450) 2025-08-29 17:17:39 +02:00
Badlop fd8aba6d41 ext_mod: Print module status message after installation 2025-08-29 17:17:37 +02:00
Badlop 066e0a8101 No need to test intermediate XML, and delete after conversion 2025-08-29 17:17:35 +02:00
Badlop bf262a6051 Fix markdown link to a command 2025-08-29 17:17:33 +02:00
badlop 7840924b17 Merge pull request #4443 from guusdk/xmpp-interop-testing-v1.6.1
CI: bump XMPP-Interop-Testing/xmpp-interop-tests-action
2025-08-26 17:21:46 +02:00
Guus der Kinderen 60bdab4e52 CI: bump XMPP-Interop-Testing/xmpp-interop-tests-action
Updates this GitHub Action that's used to execute XMPP-based interop tests from v1.6.0 to v1.6.1.

This is a bugfix release that should increase the stability / predictability of test execution.

A notable change is that the file structure in which XMPP stanzas are generated (which is provided as debug output) has changed. They are still stored in the directory denoted by the logDir argument, but the file structure in that directory has changed somewhat.
2025-08-25 10:43:31 +02:00
Alexey Shchepin 3a36a722c5 Fix a bug in mod_matrix_gw_room:check_event_power_level/3
CI / Tests (25) (push) Failing after 1s
CI / Tests (26) (push) Failing after 0s
CI / Tests (27) (push) Failing after 0s
CI / Tests (28) (push) Failing after 1s
Container / Container (push) Failing after 50s
Installers / Binaries (push) Failing after 49s
Runtime / Rebars (24, rebar3) (push) Failing after 6s
Runtime / Rebars (25, rebar) (push) Failing after 5s
Runtime / Rebars (25, rebar3) (push) Failing after 4s
Runtime / Rebars (26, rebar) (push) Failing after 4s
Runtime / Rebars (26, rebar3) (push) Failing after 4s
Runtime / Rebars (27, rebar3) (push) Failing after 5s
Runtime / Rebars (28, rebar3) (push) Failing after 5s
Runtime / Rebar3+Elixir (1.14) (push) Failing after 4s
Runtime / Rebar3+Elixir (1.15) (push) Failing after 4s
Runtime / Rebar3+Elixir (1.16) (push) Failing after 5s
Runtime / Rebar3+Elixir (1.17) (push) Failing after 4s
Runtime / Rebar3+Elixir (1.18) (push) Failing after 5s
Runtime / Mix (1.14) (push) Failing after 5s
Runtime / Mix (1.15) (push) Failing after 5s
Runtime / Mix (1.16) (push) Failing after 4s
Runtime / Mix (1.17) (push) Failing after 5s
Runtime / Mix (1.18) (push) Failing after 5s
Installers / Release (push) Has been skipped
2025-08-22 14:46:59 +03:00
Badlop 00c75c3dc9 Set version to 25.08 2025-08-22 11:15:33 +02:00
Badlop cae7850a70 CHANGELOG.md: Update to 25.08 2025-08-22 10:56:06 +02:00
Badlop ce668bef14 Container: Apply some improvements from ejabberd source code
Applied:
- ejabberd.yml.example: Use HOST_URL_ENCODE to handle case when vhost is non-latin1
- ejabberdctl: Improve explanation how to stop ejabberd in live mode
- ejabberdctl: New "mnesia_change" command, a frontend to mnesia_change_nodename
2025-08-22 10:56:03 +02:00
Badlop 3887b6d930 Update man page to 25.08 2025-08-21 17:12:55 +02:00
Badlop b7bd0e196d Update rebar.lock too 2025-08-21 17:12:09 +02:00
Badlop 6d63842ad3 Fix typo in hu.msg string 2025-08-21 16:24:58 +02:00
Badlop 2f3b9015e9 Update module and options version notes 2025-08-21 16:24:55 +02:00
Badlop 6ae48eb991 Result of running "make options" 2025-08-21 16:24:50 +02:00
dependabot[bot] c508795ad4 build(deps): bump golang in /.github/container
Bumps golang from 1.24-alpine to 1.25-alpine.

---
updated-dependencies:
- dependency-name: golang
  dependency-version: 1.25-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-21 16:24:48 +02:00
Badlop 4a053807e0 build(deps-dev): bump dialyxir from 1.4.5 to 1.4.6
Bumps [dialyxir](https://github.com/jeremyjh/dialyxir) from 1.4.5 to 1.4.6.
- [Release notes](https://github.com/jeremyjh/dialyxir/releases)
- [Changelog](https://github.com/jeremyjh/dialyxir/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jeremyjh/dialyxir/compare/1.4.5...1.4.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-21 16:24:46 +02:00
dependabot[bot] dd5bbda2dc build(deps): bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [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/v4...v5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-21 16:24:44 +02:00
Badlop 98469678a0 ejabberd_listener: Add secret in temporary unix domain socket path (#4422) 2025-08-21 16:24:42 +02:00
Badlop b8550e087e mod_conversejs: Ensure plugins URL is separated with / (#4413) 2025-08-21 16:24:39 +02:00
Holger Weiss 644d468b4f Update registration test
Adjust test case for commit 654d4b81b1.
2025-08-21 09:51:24 +02:00
Pawel Chmielowski 74c810eeaa Tag dependencies 2025-08-20 13:46:55 +02:00
Holger Weiss a46325166a mod_register: Don't duplicate welcome subject
Don't include the configured welcome message subject with the body.  If
that's desired, the admin can simply configure it that way.  But if it's
undesired, there would be no way to avoid the subject duplication.
2025-08-19 20:09:17 +02:00
Holger Weiss 654d4b81b1 mod_register: Don't duplicate welcome message
Originally, the welcome message was sent as type 'normal'.  Apparently,
some clients don't display 'normal' messages as expected (see #4246).
To address that issue, commit 9a0ff13cc2
duplicated the welcome message as type 'chat'.  However, we shouldn't
send both formats.  The 'normal' message is either ignored by the
client, in which case it serves no purpose, or displayed, in which case
the user would see the message twice.
2025-08-19 20:03:01 +02:00
Holger Weiss ff3d33dde4 Bump xmpp version
Allow for adding HTTP File Upload purposes support to ejabberd.
2025-08-18 16:23:33 +02:00
Badlop 3183e2f733 Fix dialyzer warnings in recent commit 2025-08-15 16:33:05 +02:00
Badlop e1dc686ae7 mod_conversejs: Ensure assets_path ends in / as required by Converse (#4414) 2025-08-15 15:20:35 +02:00
Badlop 38b203feb1 ejabberd_listener: Use init_fail for errors as recommended by init_ack
That is recommended since OTP 26, see
 https://www.erlang.org/doc/apps/stdlib/proc_lib.html#init_ack/2
 Warning
 Do not use this function to return an error indicating that the process
 start failed. When doing so the start function can return before the
 failing process has exited, which may block VM resources required for a
 new start attempt to succeed. Use init_fail/2,3 for that purpose.
2025-08-15 15:20:33 +02:00
Alexey Shchepin 8b61cf0742 Don't send empty direct Matrix messages (thanks to snoopcatt) (#4420) 2025-08-15 04:52:07 +03:00
Alexey Shchepin a02c75aa08 Add support for null values in is_canonical_json (thanks to snoopcatt) (#4421) 2025-08-15 04:52:07 +03:00
Alexey Shchepin 51af393baa Add leave_timeout mod_matrix_gw option (#4386) 2025-08-15 04:52:07 +03:00
Badlop 41318e45a5 mod_conversejs: Add option conversejs_plugins (#4413) 2025-08-14 19:05:12 +02:00
badlop a94f227103 Merge pull request #4425 from guusdk/xmpp-interop-testing-v1.6.0
CI: bump XMPP-Interop-Testing/xmpp-interop-tests-action
2025-08-14 11:37:51 +02:00
Badlop 517776acd4 COMPILE.md: Mention dependencies and add link to Docs (#4431) 2025-08-13 18:17:26 +02:00
dependabot[bot] 212a5ded6e build(deps): bump actions/download-artifact from 4 to 5
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4...v5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-13 18:17:05 +02:00
Badlop fd9c929e37 Bump OpenSSL version to 3.5.2 2025-08-13 16:50:18 +02:00
Badlop ce828163af Bump Erlang/OTP version to 27.3.4.2 2025-08-13 16:50:14 +02:00
Badlop 97e1b419a0 mod_providers: New module to serve easily XMPP Providers files 2025-08-13 16:49:42 +02:00
Badlop d70ac7f7c5 ejabberd_logger: Print log lines colorized in console when using rebar3 2025-08-13 16:49:42 +02:00
Badlop 7065cb69f1 ejabberdctl: New "mnesia_change" command, a frontend to mnesia_change_nodename 2025-08-13 16:49:42 +02:00
Badlop 7815463ba0 ejabberd.yml.example: Use HOST_URL_ENCODE to handle case when vhost is non-latin1 2025-08-13 16:49:42 +02:00
Badlop 48e6631751 mod_muc_room: Fix warning about unused variable 2025-08-13 16:49:37 +02:00
Badlop 903e6b70b4 mod_matrix_gw: Document what room versions are supported since when 2025-08-13 16:48:01 +02:00
Alexey Shchepin 5edba59b24 Fix dialyzer errors 2025-08-11 20:24:59 +03:00
Alexey Shchepin 31cb4b06e4 Matrix gateway updates
- Partially rewritten state resolution
- Support for Hydra rooms
- Use double colon for separating a matrix server from a room ID in JID
  with Hydra rooms
- Partially rewritten mod_matrix_gw_s2s
- Add notary_servers option
2025-08-11 19:44:50 +03:00
Kirill A. Korinsky 5de3bacf35 ejabberdctl: support NetBSD su
Co-authored-by: Greg Troxel <gdt@lexort.com>
2025-08-08 19:18:43 +02:00
Kirill A. Korinsky 8aae7424e9 ejabberdctl: support OpenBSD su
OpenBSD has a different than Linux su:
 1. `-c` before username is treated as login class;
 2. it doesn't require `--` as arguments separator.

Without (1) it complains as:

    su: no such login class: exec "$0" "$@"

and without (2):

    -: --: not found

Here, I've added detection of OS via `uname -s` which routes to the
right `su`. I really think that other BSD may need it as well.
2025-08-08 19:18:20 +02:00
Pawel Chmielowski 10f6723f00 Prevent loops in xml_compress:decode with corrupted data 2025-08-07 13:49:10 +02:00
Pawel Chmielowski f594620c68 Only offer upgrades to methods that aren't already stored 2025-08-05 11:06:17 +02:00
Pawel Chmielowski dacfad61d8 Fix format of passwords updates triggered by mod_scram_upgrade 2025-08-05 11:02:33 +02:00
badlop 7c1da7e0cf Merge pull request #4412 from marc0s/issue-4410
fix: unsubscribe users from members-only rooms when expelled
2025-08-01 12:38:37 +02:00
marc0s e709f99b47 fix: unsubscribe users from members-only rooms when expelled
Fixes #4410
2025-07-31 08:05:32 +02:00
Guus der Kinderen f150419891 CI: bump XMPP-Interop-Testing/xmpp-interop-tests-action
Updates this GitHub Action that's used to execute XMPP-based interop tests from v1.5.0 to v1.6.0.

In this update, 524 new tests were added (more than doubling the amount of tests that previously existed).
2025-07-30 22:44:54 +02:00
Badlop 053fd26994 econf: If a host in configuration is encoded IDNA, decode it (#3519)
For example:

hosts:
  - localhost
  - locälhost3
  - xn--loclhost4-x2a

all them are converted to utf8:

ejabberd_option:hosts().
[<<"localhost">>,
 <<"locälhost3"/utf8>>,
 <<"locälhost4"/utf8>>]
2025-07-26 00:43:25 +02:00
Badlop bba1a1e3ca mod_http_upload: Encode URLs into IDNA when showing to XMPP client (#3519) 2025-07-25 19:54:28 +02:00
Badlop e5da1efea4 misc: Move uri_parse/1 to yconf and merge with yconf:parse_uri/1 2025-07-25 19:54:26 +02:00
Badlop fbfd41c16e misc: uri_decode/1 moved here from ejabberd_http and prosody2ejabberd 2025-07-25 19:54:25 +02:00
Badlop 4391921727 ejabberd_config: New predefined keyword HOST_URL_ENCODE 2025-07-25 19:54:23 +02:00
Badlop 4cd3c657e2 ejabberd_listener: Try to create provisional socket in final directory (#4422)
and if that path is too long, then try HOME directory,
if that's too long too, throw error explaining the problem.

By the way, cutting the base64 string to 107 is a bad idea,
as it encodes the final path, which would get lost and crash.
2025-07-25 11:15:37 +02:00
Badlop 7647b77225 Runtime: Raise the minimum Erlang tested to Erlang/OTP 24
The Erlang containers from versions 20-23 use Debian Buster,
and require the debian repositories to install some development libraries.
The Debian Buster repositories are no longer available,
which means that we can no longer perform any test with Erlang 20-23.
2025-07-25 11:15:34 +02:00
Pawel Chmielowski fe8710fe00 Rename auth_password_types_hidden_in_scram1 option to auth_password_types_hidden_in_sasl1
Also add migration code from old name
2025-07-25 09:39:21 +02:00
Pawel Chmielowski 1a9b147baf Report db failures in mod_muc_mnesia:restore_room 2025-07-23 20:27:19 +02:00
Pawel Chmielowski 6214e0385d Report db failures from mod_muc:restore_room 2025-07-23 19:59:32 +02:00
Badlop f7002c31f0 Fix some typos in previous commit (#4422) 2025-07-22 13:30:54 +02:00
Badlop 99b75396ad ejabberd_listener: Log error when cannot set definitive unix socket (#4422) 2025-07-22 10:48:17 +02:00
Badlop b1c3baa7bd Bump p1_acme to fix 'AttributePKCS-10' and OTP 28 (processone/p1_acme#4) 2025-07-22 10:47:38 +02:00
Badlop 355eb5dfde Improve documentation of toplevel options default_db and default_ram_db 2025-07-22 10:47:36 +02:00
Badlop d269e32c3a ejabberd_config: Improve warning message about unsupported ram_db type 2025-07-22 10:47:33 +02:00
Badlop 214b76f763 ejabberd_doc: Document commands tags for modules 2025-07-22 10:47:30 +02:00
Holger Weiss 73a8fbdfb5 make-binaries: Re-add executable bit 2025-07-21 13:42:07 +02:00
Holger Weiss 9b6f0aeb3c make-binaries: Disable Linux-PAM's logind support
Make sure Linux-PAM doesn't attempt to include logind support.  This
avoids a build failure in case the host system has systemd's
development headers installed.
2025-07-21 13:38:11 +02:00
Badlop 45a6aed57f mod_admin_extra: Run sm_kick_user event when kicking account (#4415)
This is important when running the ban_account command and mod_auth_fast
is enabled, as the client may store auth tokens that bypass
the banning stored in private storage and enforced by ejabberd_auth.
2025-07-16 18:09:14 +02:00
Badlop 9d17a160b6 mod_admin_extra: No need to change password in ban_account (#4415)
When ban details are stored in private storage,
ejabberd_auth reads them and prevents user login,
so there's no need to modify the account password.
2025-07-16 13:33:40 +02:00
Badlop 850d097660 ejabberd_auth: Handle case running check_password when account is banned 2025-07-16 13:33:36 +02:00
Badlop 8ce8f67c06 misc: Add workaround for Json library not able to handle empty list 2025-07-16 13:33:33 +02:00
Pawel Chmielowski a17c2c166d Fix issue with filtering duplicates in auth_mnesia:get_users()
Previous version was only correct when data to process
was sorted, which was not always the case.

This add common implementation of lists:uniq in misc that works
also on <R25, and switches get_users to use it.
2025-07-16 12:43:25 +02:00
Badlop a64aa9e280 Set version to 25.07
CI / Tests (25) (push) Failing after 0s
CI / Tests (26) (push) Failing after 0s
CI / Tests (27) (push) Failing after 1s
CI / Tests (28) (push) Failing after 0s
Container / Container (push) Failing after 46s
Installers / Binaries (push) Failing after 1m7s
Runtime / Rebars (20, rebar) (push) Failing after 5s
Runtime / Rebars (20, rebar3) (push) Failing after 5s
Runtime / Rebars (25, rebar) (push) Failing after 4s
Runtime / Rebars (25, rebar3) (push) Failing after 5s
Runtime / Rebars (26, rebar) (push) Failing after 5s
Runtime / Rebars (26, rebar3) (push) Failing after 5s
Runtime / Rebars (27, rebar3) (push) Failing after 4s
Runtime / Rebars (28, rebar3) (push) Failing after 13s
Runtime / Rebar3+Elixir (1.14) (push) Failing after 5s
Runtime / Rebar3+Elixir (1.15) (push) Failing after 5s
Runtime / Rebar3+Elixir (1.16) (push) Failing after 5s
Runtime / Rebar3+Elixir (1.17) (push) Failing after 5s
Runtime / Rebar3+Elixir (1.18) (push) Failing after 4s
Runtime / Mix (1.14) (push) Failing after 4s
Runtime / Mix (1.15) (push) Failing after 4s
Runtime / Mix (1.16) (push) Failing after 5s
Runtime / Mix (1.17) (push) Failing after 5s
Runtime / Mix (1.18) (push) Failing after 5s
Installers / Release (push) Has been skipped
2025-07-11 13:15:26 +02:00
Badlop 3834a47a39 CHANGELOG.md: Update to 25.07 2025-07-11 13:15:26 +02:00
Badlop 9f6ff515ff Fix documentation for commands implemented in modules with several behaviours 2025-07-11 13:10:08 +02:00
Pawel Chmielowski 64a210842e Use tagged dependencies 2025-07-11 12:55:25 +02:00
Badlop c0de52c967 Update man page to 25.07 2025-07-11 12:10:58 +02:00
Badlop 67c3df05b3 ext_mod: Add temporary workaround for zip including absolute path 2025-07-11 12:10:57 +02:00
Badlop 4a66616756 mod_antispam: Mention usage of CONFIG_PATH predefined keyword 2025-07-11 12:10:54 +02:00
Pawel Chmielowski e4d424bf56 Add auth_password_types_hidden_in_scram1 option
This option allows disabling some auth mechanisms
to be offered in SASL1 features. This makes adding
new password types easier, by ensuring that new
password use will be offered only to clients that
have new type stored (SASL2 clients that send us
user info before features need to be sent), but
not to clients where we don't know if they have
new passwords.
2025-07-10 16:52:13 +02:00
Badlop c0fc6091b1 Annotate ejabberd version of new modules, options, commands 2025-07-10 10:58:17 +02:00
Badlop ef35d19ff1 Update Ukrainian translation (thanks to Максим Горпиніч) 2025-07-10 10:58:15 +02:00
Badlop cfa787c4b6 Update Tamil translation (thanks to TamilNeram) 2025-07-10 10:58:14 +02:00
Badlop 611ebce0d2 Update Greek translation (thanks to GiannosOB) 2025-07-10 10:58:13 +02:00
Badlop 1e0b8cb547 Bump Erlang/OTP 27.3.4.1 for container image too 2025-07-10 10:58:10 +02:00
Pawel Chmielowski 99d323b1dd Update fast_tls with updated deps 2025-07-09 17:13:17 +02:00
Pawel Chmielowski 72bc9b6c7f Allow s2s connections to accept client certificates that have only server purpose
Due to Google Chrome certification requirements we can expect
that in near future there will be no certificate authority
that will issue certifcates that have both server and client auth
purposes.

This change makes s2s listeners ignore cert purposes, and should
allow servers that have those new certificate to use it, to
authenticate new s2s connections.

This fixes issue #4392
2025-07-09 14:16:02 +02:00
Pawel Chmielowski 4694a482f4 Update doap with info about xep-0486 2025-07-08 20:13:56 +02:00
Badlop 443f39bfdb Result of running "make format doap options" 2025-07-08 12:43:43 +02:00
Badlop b118dd8fc6 Update reference to XEP-0485 support 2025-07-08 12:43:43 +02:00
Badlop bf39da7b8b mod_pubsub_serverinfo: Rephrase documentation and improve markdown 2025-07-08 12:42:52 +02:00
Badlop ad3eee059e mod_antispam: Annotate ejabberd version of the new commands 2025-07-08 12:42:50 +02:00
Badlop e94ccabcf0 mod_antispam: Move commands to a new "spam" API tag 2025-07-08 12:42:48 +02:00
Badlop 427a29c74e Bump Erlang/OTP 27.3.4.1, Elixir 1.18.4, libexpat 2.7.1, OpenSSL 3.5.1
Notice:
- installers use OTP 27.3.4.1, the latest available right now
- containers use OTP 27.3.4, because container for 27.3.4.1 was not published,
  see https://hub.docker.com/_/erlang
2025-07-08 12:42:44 +02:00
badlop 1d79edbae0 Merge pull request #4408 from sstrigler/mod_pubsub_serverinfo
mod_pubsub_serverinfo
2025-07-08 10:55:14 +02:00
badlop 9e4a6d09df Merge pull request #4373 from sstrigler/mod_antispam
mod_antispam: port from ejabberd-contrib/mod_spam_filter
2025-07-08 10:19:34 +02:00
Stefan Strigler 7b08289799 Merge pull request #6 from badlop/antispam_services
Replace options rtbl_host and rtbl_domains_node with rtbl_services
2025-07-08 08:23:22 +02:00
Paweł Chmielowski bc937546ec Merge pull request #4409 from Britaliope/patch-1
missing comma in postgres schema
2025-07-07 19:03:10 +02:00
Stefan Strigler 3b972fe4a3 update p1/xmpp to latest 2025-07-07 17:58:56 +02:00
Badlop 5e93725044 Replace options rtbl_host and rtbl_domains_node with rtbl_services 2025-07-07 17:42:05 +02:00
Stefan Strigler 500af47b79 mod_pubsub_serverinfo: codec spec moved to p1/xmpp 2025-07-07 17:40:34 +02:00
Stefan Strigler d862e04186 Merge pull request #5 from badlop/antispam_options
Fix crashes, improve options, complete documentation
2025-07-07 15:29:06 +02:00
Badlop 5f293cb1e0 Document more options 2025-07-07 14:28:14 +02:00
Bruno MATEU c93ea2c22f missing comma in postgres schema 2025-07-07 08:28:23 +02:00
Stefan Strigler c567005241 mod_pubsub_serverinfo: get pubsub host from server state 2025-07-05 14:54:11 +02:00
Stefan Strigler a6823d157c mod_pubsub_serverinfo: add documentation 2025-07-05 14:38:55 +02:00
Stefan Strigler bf54cc59e1 mod_pubsub_serverinfo: apply make format 2025-07-05 14:23:03 +02:00
Stefan Strigler 740b0c7dd7 mod_pubsub_serverinfo: initial import as found on ejabberd-contrib 2025-07-05 14:19:20 +02:00
Badlop c3f5083f15 Use the new gen_mod:prep_stop/1 feature
This fixes the problem when stopping the module with multiple vhosts:
unsubscribing from a local pubsub requires mod_pubsub in that vhost running,
but ejabberd stops mod_pubsub from a vhost before stopping mod_antispam
in other vhost.
2025-06-30 18:21:19 +02:00
Badlop b65c11daf6 New predefined keyword: CONFIG_PATH 2025-06-30 18:21:19 +02:00
Badlop 263e1f59f7 Fix problem calling get_log_path when ejabberd is stopping
When ejabberd is being stopped
and some module calls ejabberd_logger:get_log_path(),
application:load/1 crashes with error:

** Reason for termination ==
** {terminating,
       [{application_controller,call,2,
            [{file,"application_controller.erl"},{line,511}]},
        {application,load1,2,[{file,"application.erl"},{line,274}]},
        {ejabberd_config,env_binary_to_list,2,
            [{file,"/home/git/ejabberd/src/ejabberd_config.erl"},
             {line,343}]},
        {ejabberd_logger,get_log_path,0,
            [{file,"/home/git/ejabberd/src/ejabberd_logger.erl"},
             {line,55}]},
2025-06-30 18:21:19 +02:00
Badlop 3d89c9199c gen_mod: Add support to prepare module stopping before actually stopping any module
Follows the reasoning of application:prep_stop, but applied to gen_mod:
  https://www.erlang.org/docs/28/apps/kernel/application.html#c:prep_stop/1
2025-06-30 18:21:19 +02:00
Stefan Strigler 4a51bf90ab Merge pull request #3 from badlop/antispam_files
Move spam file management to a submodule
2025-06-25 15:45:15 +02:00
Badlop a77c7e36b0 Move spam files parsing to a submodule 2025-06-23 09:44:33 +02:00
Badlop 88ae3fddf3 mod_antispam: Sort and document files options 2025-06-23 09:44:33 +02:00
Badlop bddcf0624e mod_antispam: Move some definitions to a header file 2025-06-23 09:44:33 +02:00
Badlop 6b47d3eb0d mod_auth_fast: Clear tokens on kick, change pass and unregister (#4397)(#4398)(#4399) 2025-06-20 16:55:59 +02:00
Badlop a0c97b33e0 CONTAINER.md: Move ejabberd-contrib content from Docs website 2025-06-20 12:45:35 +02:00
Badlop 5def9cef9f ext_mod: When upgrading module, clean also the compiled directories 2025-06-20 12:45:31 +02:00
Badlop c20d745028 New option hosts_alias and function resolve_host_alias/1 (4400) 2025-06-19 12:40:16 +02:00
Badlop e099435cd6 ejabberd_http: Remove unused default_host option and state element
The option 'default_host' for ejabberd_http was added years ago
in commit 7d623d5. However it was problematic and the usage was
removed in commit 83c291c. It's time to remove its last forgotten bits.
2025-06-19 12:40:15 +02:00
Badlop d6a00f5151 mod_conversejs: Add link in WebAdmin to local Converse if configured 2025-06-19 12:40:14 +02:00
Badlop 653413e912 Run new webadmin hooks to add items to system menu 2025-06-19 12:40:12 +02:00
Badlop 288eecc23d Use misc:encode_pid/1 in ejabberd_sm_sql 2025-06-19 12:40:10 +02:00
Stefan Strigler b55b6f3d26 Merge pull request #2 from badlop/antispam_filter
Move filtering actual implementation to a submodule
2025-06-18 14:15:39 +02:00
Badlop d00561b58c Move filtering implementation to a submodule 2025-06-18 11:52:28 +02:00
Badlop 432810db89 Fix minor typos 2025-06-18 11:52:28 +02:00
Badlop f3b1b5d419 Result of running "make format" 2025-06-18 11:52:28 +02:00
Stefan Strigler d9a7b67f0e mod_antispam: increase timeout when waiting for dump file 2025-06-17 17:21:58 +02:00
Badlop 85f05192c8 Move spam_dump_file implementation to a submodule 2025-06-17 13:20:43 +02:00
Badlop 149b715b4f New predefined keyword: LOG_PATH 2025-06-17 13:20:43 +02:00
Stefan Strigler bae345b92b mod_antispam: test dump file 2025-06-17 13:18:13 +02:00
Stefan Strigler 10ec128b94 mod_antispam: test whitelisted domain 2025-06-17 13:18:13 +02:00
Stefan Strigler 7a6e409879 mod_antispam: use message/3 in test 2025-06-17 13:18:13 +02:00
Stefan Strigler ea19e4bc7f mod_antispam: remove unnecessary check in test
this was left over from debugging issues with fixtures
2025-06-17 13:18:13 +02:00
Stefan Strigler 6122a525d2 mod_antispam: fix config types 2025-06-17 13:18:13 +02:00
Badlop b607d95a93 Refactorize each individual test case in individual functions 2025-06-17 13:18:13 +02:00
Stefan Strigler ee46333def add make target test-<group>
Eg. invoke common test for specific test group only like

$ CT_BACKEND=mnesia,redis make test-antispam_single
2025-06-17 13:18:13 +02:00
Stefan Strigler 34b40aec66 mod_antispam: add format instructions 2025-06-17 13:18:13 +02:00
Stefan Strigler 639147be41 fix pubsub retract items being a list of ids 2025-06-17 13:18:11 +02:00
Stefan Strigler c48aa38c39 mod_antispam: add test suite 2025-06-17 13:10:27 +02:00
Stefan Strigler 70bec7b714 tests: update readme and compose to work with current sw versions 2025-06-17 13:10:27 +02:00
Stefan Strigler a7c15eaccf mod_antispam: initial import from ejabberd-contrib/mod_spam_filter 2025-06-17 13:10:27 +02:00
Badlop c78e99dd54 Use auxiliary function to get HOME, use Mnesia directory when not set (#4402) 2025-06-17 13:02:01 +02:00
dependabot[bot] 3196779308 build(deps-dev): bump ex_doc from 0.37.3 to 0.38.2
Bumps [ex_doc](https://github.com/elixir-lang/ex_doc) from 0.37.3 to 0.38.2.
- [Release notes](https://github.com/elixir-lang/ex_doc/releases)
- [Changelog](https://github.com/elixir-lang/ex_doc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/elixir-lang/ex_doc/compare/v0.37.3...v0.38.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-17 13:02:01 +02:00
Badlop 064b005ec5 Define some example glossary terms 2025-06-17 13:02:01 +02:00
Badlop 2d2b98e525 Update Elvis to 4.1.1, fix some warnings and enable their tests 2025-06-16 16:59:43 +02:00
Badlop 71f623ddbf Fix previous commits 2025-06-16 13:14:07 +02:00
Badlop f03b5f4c44 Support list of IDs in pubsub-items-retract (processone/xmpp#100) 2025-06-16 13:09:52 +02:00
Badlop aff8b47b6c Add dialyzer spec to try to dix warnings 2025-06-16 12:48:34 +02:00
Badlop 6c1452435d Bump xmpp to get: Add Unified Push support (via Conversations/up) (processone/xmpp#101) 2025-06-16 12:24:06 +02:00
Badlop 38f365ffeb Move ecPrivkeyVer1 workaround for Jose from ejabberd to p1_acme
Revert "Add workaround for Jose 1.11.10 not supporting OTP 28 ecPrivkeyVer1 (#4393)"
This reverts commit 363351b18c.
2025-06-16 12:24:01 +02:00
Badlop ed846c4a88 ext_mod: Recommend to write README.md instead txt (processone/ejabberd-contrib#363) 2025-06-09 18:02:40 +02:00
Badlop 8855a304cc ext_mod: Support library path installed from Debian (processone/ejabberd-contrib#363) 2025-06-09 17:53:25 +02:00
Paweł Chmielowski 95a083a6f4 Replace csplit with perl in rebar3-format.sh
Bsd csplit doesn't offer some options that we require, so let's use perl
that should work everywhere
2025-06-06 16:52:28 +02:00
Jérôme Sautret 0bb99bb371 Fix supported version of XEP-0485 2025-06-06 11:57:27 +02:00
Badlop 38cc3ccb1e Avoid using the "else" conditional compilation macro directive
Even if "-else." is a valid directive:
  https://www.erlang.org/docs/28/system/macros.html#conditional-compilation
there is a bug in rebar3_format that annoyingly rewrites it as "- else ."
  https://github.com/AdRoll/rebar3_format/issues/337
as a quick workaround, rewrite directives to not use "-else."
2025-06-05 17:02:41 +02:00
Jérôme Sautret c51b044b3f Fix macro used in string options when defined in env var
Configuration macro defined as EJABBERD_MACRO_* environment variable
couldn't be used inside string options, like this:

captcha_cmd: "tools/@SCRIPT@"
2025-06-05 14:20:11 +02:00
Badlop 363351b18c Add workaround for Jose 1.11.10 not supporting OTP 28 ecPrivkeyVer1 (#4393) 2025-06-04 11:00:00 +02:00
Paweł Chmielowski 167bbc768a Remove unused function 2025-06-02 18:39:51 +02:00
Paweł Chmielowski 591e15f0f6 Fix mnesia to sql exporter after changes to auth tables
Conversion functions used by ej2sql module was not updated after change
that did allow storing multiple passwords per user, which made us skip
passwords that were updated to new format, this fixes this problem.

This fixes issue #4391
2025-06-02 18:19:03 +02:00
Badlop b4a917db09 Runtime: Fix step name 2025-05-30 17:17:32 +02:00
Badlop 7755fcc846 Bump fast_xml and xmpp for improved Erlang/OTP 28 support 2025-05-30 17:17:32 +02:00
Badlop 250af8f06a Fix "make options" in Erlang/OTP 28 (thanks to Alexey Shchepin)(#4352) 2025-05-30 17:17:32 +02:00
Alexey Shchepin 9569e407b5 Don't send empty messages in Matrix rooms (#4385) 2025-05-30 17:27:30 +03:00
Alexey Shchepin 573d5525ec Fix key validation in mod_matrix_gw_s2s:check_signature 2025-05-30 17:27:30 +03:00
Badlop f1de7b008b Use xmpp and p1_acme patched with Erlang/OTP 28 support 2025-05-28 17:36:39 +02:00
Badlop c10e6ded78 Runtime: Use --with-min-erlang to bypass Erlang 25 soft requirement 2025-05-28 17:36:39 +02:00
Badlop 9bc991cb7d CI and Runtime: Add Erlang/OTP 28 to the versions matrix 2025-05-28 17:36:39 +02:00
Badlop ffa7c32d80 Rebar/Rebar3: Update binaries to work with Erlang/OTP 25-28 (#4354)
They are compiled from their git repositories, main branches,
using erlang:25-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

To compile ejabberd using rebar/rebar3 and Erlang 24.0 up to 24.3,
you can download the old binaries from ejabberd 24.12, available at:
  https://github.com/processone/ejabberd/raw/24.12/rebar
  https://github.com/processone/ejabberd/raw/24.12/rebar3
2025-05-28 17:36:07 +02:00
Alexey Shchepin 038491d2ec Support older Matrix rooms versions starting from version 4 2025-05-28 13:30:00 +03:00
Paweł Chmielowski 9d1d57cd82 Fix typo in last commit 2025-05-21 15:53:13 +02:00
Paweł Chmielowski c38b2bfc21 Add options that allow to configure proxy used by rest module 2025-05-21 15:37:49 +02:00
Paweł Chmielowski 18e7805ef5 Present mam full text search in xep-431 compatible way
Also offer those fields only on mysql, where full text search is available
2025-05-16 13:33:24 +02:00
Badlop 010eab6e30 When encoding JSON, handle term that is key-value list (#4379) 2025-05-13 12:37:26 +02:00
Badlop 30c8088d73 Fix crash in "rebar3 cover" with Erlang/OTP 28 (#4353) 2025-05-13 12:37:26 +02:00
Badlop 354009033a CI: Don't run "make options" with Erlang/OTP 28 yet because it crashes (#4352) 2025-05-13 12:37:26 +02:00
Badlop bf3f904fe9 Runtime: Don't test rebar2 + OTP 28 because "make rel" fails
When running "make rel":

./rebar  generate
==> rel (generate)
ERROR: generate failed while processing /__w/ejabberd/ejabberd/rel:
{'EXIT',{{badmatch,{error,"Application et is used in release \"ejabberd\" and cannot be excluded"}},
         [{rebar_reltool,generate,2,
                         [{file,"src/rebar_reltool.erl"},{line,53}]},
          {rebar_core,run_modules,4,[{file,"src/rebar_core.erl"},{line,493}]},
          {rebar_core,execute,6,[{file,"src/rebar_core.erl"},{line,418}]},
          {rebar_core,maybe_execute,8,
                      [{file,"src/rebar_core.erl"},{line,302}]},
          {rebar_core,process_dir1,7,[{file,"src/rebar_core.erl"},{line,261}]},
          {rebar_core,process_each,5,[{file,"src/rebar_core.erl"},{line,351}]},
          {rebar_core,process_dir1,7,[{file,"src/rebar_core.erl"},{line,253}]},
          {rebar_core,process_commands,2,
                      [{file,"src/rebar_core.erl"},{line,93}]}]}}
make: *** [Makefile:570: prod] Error 1
2025-05-13 12:37:14 +02:00
Paweł Chmielowski d65cafae64 Update code for switching to new schema type to users table changes 2025-05-12 18:47:18 +02:00
Marcos de Vera Piquero cda1d4ce7f feat: fire new push_send_notification hook
Do not route XEP-357 IQ notification directly but run it through
registered hooks that will ultimately decide whether or not send it
and, if needed, customize the notification contents.

Hooks can return:

  - a modified IQ packet, as per their business logic
	- the atom `drop`, to effectively cancel the push notification
2025-05-09 14:14:51 +02:00
Paweł Chmielowski 128103b7b2 Typo 2025-04-30 14:44:19 +02:00
Paweł Chmielowski cbb88638d2 Add mssql specific implementation of delete_old_mam_messages 2025-04-30 14:31:05 +02:00
Paweł Chmielowski f046aeeaa2 Fix dialyzer warning in last commit 2025-04-29 12:20:13 +02:00
Paweł Chmielowski bd5f9537c5 Normalize username when determining if user want to change pass in mod_register
Should fix issue #4377
2025-04-29 11:43:17 +02:00
Paweł Chmielowski 838bbd70ef Strip query data when returning errors in mod_register 2025-04-29 10:33:17 +02:00
Paweł Chmielowski e7997244af Allow to specify minimal erlang version using --with-min-erlang in configure 2025-04-28 13:58:40 +02:00
Paweł Chmielowski 3874e71971 Better lists:uniq substitute in ejabberd_config
Original version didn't keep original order of modules, which could break
ability to override of options by external modules.
2025-04-28 12:59:17 +02:00
Paweł Chmielowski 67cc0c5286 Handle objects that don't need conversion in mod_mam_mnesia:transform()
This should fix issue #4374
2025-04-22 12:31:08 +02:00
Badlop 826123db56 Bump Erlang/OTP version to 27.3.3 2025-04-22 12:27:10 +02:00
Badlop 05b0037462 Raise the minimum Elixir tested version to 1.14.0 (#4281)
Cannot test with Elixir 1.13.4 because its container image includes
Erlang/OTP 24.3 that ejabberd does not support anymore.
2025-04-22 12:27:10 +02:00
Badlop 54796f888e Raise Erlang/OTP minimum requirement to 25.0 (#4281) 2025-04-22 12:27:10 +02:00
Badlop 82ec0a4837 Remove unused MyNick variables 2025-04-22 12:27:09 +02:00
Badlop 7167df7979 mysql.sql: Fix typo in commit 7862c6a when creating users table 2025-04-22 12:25:04 +02:00
Paweł Chmielowski 45e7d8426d Make delete_old_mam_messages_batch work with sqlite 2025-04-17 14:21:25 +02:00
Badlop ef754939c4 Set version to 25.04
CI / Tests (25) (push) Failing after 9s
CI / Tests (26) (push) Failing after 0s
CI / Tests (27) (push) Failing after 0s
Container / Container (push) Failing after 45s
Installers / Binaries (push) Failing after 50s
Runtime / Rebars (20, rebar) (push) Failing after 6s
Runtime / Rebars (20, rebar3) (push) Failing after 5s
Runtime / Rebars (25, rebar) (push) Failing after 6s
Runtime / Rebars (25, rebar3) (push) Failing after 4s
Runtime / Rebars (26, rebar) (push) Failing after 7s
Runtime / Rebars (26, rebar3) (push) Failing after 4s
Runtime / Rebars (27, rebar3) (push) Failing after 6s
Runtime / Rebar3+Elixir (1.13) (push) Failing after 7s
Runtime / Rebar3+Elixir (1.14) (push) Failing after 6s
Runtime / Rebar3+Elixir (1.15) (push) Failing after 6s
Runtime / Rebar3+Elixir (1.16) (push) Failing after 6s
Runtime / Rebar3+Elixir (1.17) (push) Failing after 7s
Runtime / Rebar3+Elixir (1.18) (push) Failing after 7s
Runtime / Mix (1.13) (push) Failing after 5s
Runtime / Mix (1.14) (push) Failing after 5s
Runtime / Mix (1.15) (push) Failing after 5s
Runtime / Mix (1.16) (push) Failing after 4s
Runtime / Mix (1.17) (push) Failing after 4s
Runtime / Mix (1.18) (push) Failing after 4s
Installers / Release (push) Has been skipped
2025-04-16 17:58:37 +02:00
Badlop ee3a0b8b1a Bump Erlang/OTP version to 27.3.2
27.3.3 was just release, but image is not yet published in
https://hub.docker.com/_/erlang/tags?name=27.3
2025-04-16 17:20:28 +02:00
Badlop 2182cb60ae CHANGELOG: Fix typos 2025-04-16 13:44:13 +02:00
Badlop 4da8278e66 Update other translations 2025-04-16 13:44:13 +02:00
Badlop 629db496b5 Update Chinese (Simplified) translation (thanks to Sketch6580) 2025-04-16 13:44:13 +02:00
Badlop f79b8e166a Update Ukrainian translation (thanks to Максим Горпиніч) 2025-04-16 13:44:13 +02:00
Badlop fae4ab97fd Update Albanian translation (thanks to Besnik Bleta) 2025-04-16 13:44:13 +02:00
Badlop da8d04a654 Update Portuguese translation (thanks to Silvério Santos) 2025-04-16 13:44:13 +02:00
Badlop ce02fc485f Update Portuguese (Brazil) translation (thanks to Wellington Uemura) 2025-04-16 13:44:13 +02:00
Badlop 69695ffe27 Update German translation (thanks to Nautilusx) 2025-04-16 13:44:13 +02:00
Badlop 6fdb467484 Update man page to 25.04 2025-04-16 13:44:13 +02:00
Badlop d8016a6477 Result of running "make format" 2025-04-16 13:44:13 +02:00
Badlop e43d864184 CI: Bump ubuntu-24.04, and Erlang 25+ (#4281)
Update postgresql preparation:
- ubuntu-20.04 included PostgreSQL 14.13
- ubuntu-24.04 includes PostgreSQL 16.4
and in the meantime, PostgreSQL 15.0 revoked
"the CREATE permission from all users except a database owner from the public (or default) schema."
See https://www.postgresql.org/about/news/postgresql-15-released-2526/
2025-04-16 13:44:07 +02:00
Badlop 4d3681aba1 Annotate kick_users version 2025-04-16 13:43:13 +02:00
Paweł Chmielowski d791f6ceaa Update changelog 2025-04-16 12:56:04 +02:00
Paweł Chmielowski 602a42f5ce Add tests for duplicate occupant-id handling 2025-04-16 11:39:30 +02:00
Paweł Chmielowski c98739d5b5 Replace all occupand_id tags 2025-04-14 16:42:00 +02:00
Paweł Chmielowski 425504454c Allow passing multiple paths in external_beams 2025-04-08 14:21:18 +02:00
Paweł Chmielowski 780031847c Relax limits of shared groups names
We want to normalize it, but we don't need to limit it to what nodeprep
allows (like for example ':' that we see in use)
2025-04-04 11:07:51 +02:00
Paweł Chmielowski c3af613db1 Catch errors from mod_shared_roster:create_group in srg_* commands 2025-04-04 11:07:51 +02:00
Badlop babd01a87f Container: Improve explanation of CTL_ON ignore prefix 2025-04-03 13:43:15 +02:00
Badlop 17b605a32b kick_users command: Move to "Online Users" page, disable auto-execution
kick_users can be considered a "modifier" command with "informative" result
as described in include/ejabberd_commands.hrl

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

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

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

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

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

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

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

This is fix for issue #4365
2025-03-31 11:49:30 +02:00
Marcos de Vera Piquero 0827a5116f ejabberdctl: add new kick_users host command
This new command accepts a host name and will kick all user sessions
found for that given host. The result is the number of kicked
sessions.
2025-03-28 17:45:54 +01:00
454 changed files with 21077 additions and 4705 deletions
+155
View File
@@ -0,0 +1,155 @@
name: 'Manage Database'
inputs:
for:
default: ""
description: 'One or more databases to manage:
mysql, pgsql, redis, mssql'
do:
default: ""
description: 'One or more tasks to do:
install, start, user, create, drop, dump'
dump-suffix:
default: ""
description: 'Suffix to append to the dump file name'
mssql-schema:
default: ""
description: 'SQL schema for the MSSQL database:
singlehost or multihost'
runs:
using: "composite"
steps:
############################################################# Install #####
- if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'install')
shell: sh
run: |
sudo sed -i 's/yes/no/g' /etc/initramfs-tools/update-initramfs.conf
sudo rm -f /var/lib/man-db/auto-update || echo ok
sudo apt-get -q update
sudo apt-get -q -y install postgresql
- if: contains(inputs.for, 'redis') && contains(inputs.do, 'install')
shell: sh
run: |
sudo sed -i 's/yes/no/g' /etc/initramfs-tools/update-initramfs.conf
sudo rm -f /var/lib/man-db/auto-update || echo ok
sudo apt-get -q update
sudo apt-get -q -y install redis-server
- if: contains(inputs.for, 'mssql') && contains(inputs.do, 'install')
uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: tdsodbc
- if: contains(inputs.for, 'mssql') && contains(inputs.do, 'install')
shell: sh
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
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd \
-C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
- if: contains(inputs.for, 'mssql') && contains(inputs.do, 'install')
&& inputs.mssql-schema == 'singlehost'
shell: sh
run: |
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd \
-C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test \
-i /mssql.sql
- if: contains(inputs.for, 'mssql') && contains(inputs.do, 'install')
&& inputs.mssql-schema == 'multihost'
shell: sh
run: |
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd \
-C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test \
-i /mssql.new.sql
############################################################### Start #####
- if: contains(inputs.for, 'mysql') && contains(inputs.do, 'start')
shell: sh
run: |
sudo systemctl start mysql.service
- if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'start')
shell: sh
run: |
sudo systemctl start postgresql.service
pg_isready
################################################################ User #####
- if: contains(inputs.for, 'mysql') && contains(inputs.do, 'user')
shell: sh
run: |
mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost'
IDENTIFIED BY 'ejabberd_test';"
- if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'user')
shell: sh
run: |
sudo -u postgres psql -c "CREATE USER ejabberd_test
WITH PASSWORD 'ejabberd_test';"
################################################################ Dump #####
- if: contains(inputs.for, 'mysql') && contains(inputs.do, 'dump')
shell: sh
run: |
sudo mysqldump -u root -proot ejabberd_test \
> mysql-${{ inputs.dump-suffix }}.sql
- if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'dump')
shell: sh
run: |
sudo -u postgres pg_dump ejabberd_test \
> pgsql-${{ inputs.dump-suffix }}.sql
################################################################ Drop #####
- if: contains(inputs.for, 'mysql') && contains(inputs.do, 'drop')
shell: sh
run: |
mysql -u root -proot -e "DROP DATABASE ejabberd_test;"
- if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'drop')
shell: sh
run: |
sudo -u postgres psql -c "DROP DATABASE ejabberd_test;"
############################################################## Create #####
- if: contains(inputs.for, 'mysql') && contains(inputs.do, 'create')
shell: sh
run: |
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
TO 'ejabberd_test'@'localhost';"
- if: contains(inputs.for, 'pgsql') && contains(inputs.do, 'create')
shell: sh
run: |
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
ON DATABASE ejabberd_test TO ejabberd_test;"
sudo -u postgres psql -c "GRANT ALL ON SCHEMA public TO ejabberd_test;"
sudo -u postgres psql -c "ALTER DATABASE ejabberd_test
OWNER TO ejabberd_test;"
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
TABLES IN SCHEMA public
TO ejabberd_test;"
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
SEQUENCES IN SCHEMA public
TO ejabberd_test;"
+195
View File
@@ -0,0 +1,195 @@
name: 'Manage ejabberd'
inputs:
for:
default: ""
description: 'Release method, one of:
prod, dev, install, run, deb'
do:
default: ""
description: 'One or more tasks to perform:
deploy, no_acme, no_tls,
start, register, update_sql, stop,
check, logs'
username:
default: "user1"
description: 'Username part of the account JID'
host:
default: "localhost"
description: 'Host part of the account JID'
tool:
default: "rebar3"
description: 'Build tool to use:
rebar or rebar3 (only relevant to make rebar2)'
rel_name_vsn:
default: ""
description: 'Base name of installer files'
configure:
default: ""
description: 'Options to append to ./configure'
runs:
using: "composite"
steps:
- name: Path Definitions
id: path
shell: bash
run: |
case ${{ inputs.for }} in
'prod')
BASE="_build/prod/rel/ejabberd"
echo "conf=$BASE/conf" >> $GITHUB_OUTPUT
echo "logs=$BASE/logs" >> $GITHUB_OUTPUT
echo "ectl=$BASE/bin/ejabberdctl" >> $GITHUB_OUTPUT
;;
'dev')
BASE="_build/dev/rel/ejabberd"
echo "conf=$BASE/conf" >> $GITHUB_OUTPUT
echo "logs=$BASE/logs" >> $GITHUB_OUTPUT
echo "ectl=$BASE/bin/ejabberdctl" >> $GITHUB_OUTPUT
;;
'install')
BASE="/tmp/ejabberd"
echo "conf=$BASE/etc/ejabberd" >> $GITHUB_OUTPUT
echo "logs=$BASE/var/log/ejabberd" >> $GITHUB_OUTPUT
echo "ectl=$BASE/sbin/ejabberdctl" >> $GITHUB_OUTPUT
;;
'deb')
BASE="/opt/ejabberd"
echo "base=$BASE" >> $GITHUB_OUTPUT
echo "conf=$BASE/conf" >> $GITHUB_OUTPUT
echo "logs=$BASE/logs" >> $GITHUB_OUTPUT
echo "ectl=sudo /opt/${{ inputs.rel_name_vsn }}/bin/ejabberdctl" >> $GITHUB_OUTPUT
;;
'run')
BASE="$HOME/opt/ejabberd"
echo "base=$BASE" >> $GITHUB_OUTPUT
echo "conf=$BASE/conf" >> $GITHUB_OUTPUT
echo "logs=$BASE/logs" >> $GITHUB_OUTPUT
echo "ectl=$HOME/opt/${{ inputs.rel_name_vsn }}/bin/ejabberdctl" >> $GITHUB_OUTPUT
;;
esac
############################################################# Compile #####
- if: contains(inputs.do, 'compile')
shell: sh
run: |
TOOL=${{ inputs.tool }}
[ "${TOOL%3}" = "rebar" ] && TOOL="./$TOOL"
./autogen.sh
./configure --with-rebar=$TOOL \
--prefix=/tmp/ejabberd \
--enable-all ${{ inputs.configure }}
sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
REBAR_PROFILE=test make
############################################################## Deploy #####
- if: contains(inputs.do, 'deploy') &&
inputs.for == 'prod' && inputs.tool == 'rebar'
shell: sh
run: |
mkdir -p _build/prod && ln -s `pwd`/rel/ _build/prod/rel
- if: contains(inputs.do, 'deploy') &&
inputs.for == 'dev' && inputs.tool == 'rebar'
shell: sh
run: |
mkdir -p _build/dev && ln -s `pwd`/rel/ _build/dev/rel
- if: contains(inputs.do, 'deploy') &&
(inputs.for == 'prod' ||
inputs.for == 'dev' ||
inputs.for == 'install')
shell: sh
run: |
make ${{ inputs.for }}
- if: contains(inputs.do, 'deploy') &&
inputs.for == 'deb'
shell: sh
run: |
sudo dpkg -i $(ls -1 *.deb)
- if: contains(inputs.do, 'deploy') &&
inputs.for == 'run'
shell: sh
run: |
./$(ls -1 *.run)
################################################################ ACME #####
- if: contains(inputs.do, 'no_acme')
shell: sh
run: |
sed -i 's/loglevel/acme:\n auto: false\nloglevel/g' \
${{ steps.path.outputs.conf }}/ejabberd.yml
################################################################# TLS #####
- if: contains(inputs.do, 'no_tls') &&
inputs.for == 'dev'
shell: sh
run: |
sed -i 's/starttls_required: true/starttls_required: false/g' \
${{ steps.path.outputs.conf }}/ejabberd.yml
############################################################### Start #####
- if: contains(inputs.do, 'start')
shell: sh
run: |
${{ steps.path.outputs.ectl }} start
${{ steps.path.outputs.ectl }} started
############################################################ Register #####
- if: contains(inputs.do, 'register')
shell: sh
run: |
${{ steps.path.outputs.ectl }} \
register ${{ inputs.username }} ${{ inputs.host }} s0mePass
${{ steps.path.outputs.ectl }} \
registered_users ${{ inputs.host }} >> registered.log
grep -q '${{ inputs.username }}' registered.log
########################################################### UpdateSQL #####
- if: contains(inputs.do, 'update_sql')
shell: sh
run: |
${{ steps.path.outputs.ectl }} \
update_sql
################################################################ Stop #####
- if: contains(inputs.do, 'stop')
shell: sh
run: |
${{ steps.path.outputs.ectl }} stop
${{ steps.path.outputs.ectl }} stopped
############################################################### Check #####
- if: contains(inputs.do, 'check')
shell: sh
run: |
grep -q 'is started' ${{ steps.path.outputs.logs }}/ejabberd.log
grep -q 'is stopped' ${{ steps.path.outputs.logs }}/ejabberd.log
test $(find ${{ steps.path.outputs.logs }}/ -empty -name error.log)
################################################################ Logs #####
- if: contains(inputs.do, 'logs') || failure()
shell: sh
run: |
SUDO=sudo
[ "${{ inputs.for }}" = "deb" ] || SUDO=""
echo "::group::View ejabberd.log"
$SUDO cat ${{ steps.path.outputs.logs }}/ejabberd.log
echo "::endgroup::"
echo "::group::View error.log"
$SUDO cat ${{ steps.path.outputs.logs }}/error.log
echo "::endgroup::"
+10 -8
View File
@@ -1,6 +1,6 @@
#' Define default build variables
ARG OTP_VSN='27.3'
ARG ELIXIR_VSN='1.18.3'
ARG OTP_VSN='28.4.1.0'
ARG ELIXIR_VSN='1.19.5'
ARG UID='9000'
ARG USER='ejabberd'
ARG HOME="opt/$USER"
@@ -9,7 +9,7 @@ ARG VERSION='master'
################################################################################
#' Compile ejabberdapi
FROM docker.io/golang:1.24-alpine AS api
FROM docker.io/golang:1.25-alpine AS api
RUN go install -v \
github.com/processone/ejabberd-api/cmd/ejabberd@master \
&& mv bin/ejabberd bin/ejabberdapi
@@ -19,6 +19,7 @@ RUN go install -v \
FROM docker.io/erlang:${OTP_VSN}-alpine AS ejabberd
RUN apk -U add --no-cache \
ca-certificates \
autoconf \
automake \
bash \
@@ -32,6 +33,7 @@ RUN apk -U add --no-cache \
libpng-dev \
libwebp-dev \
linux-pam-dev \
npm \
openssl-dev \
sqlite-dev \
yaml-dev \
@@ -52,12 +54,13 @@ ARG BUILD_DIR
COPY / $BUILD_DIR/
WORKDIR $BUILD_DIR
RUN mv .github/container/ejabberdctl.template . \
&& mv .github/container/ejabberd.yml.example . \
&& ./autogen.sh \
&& ./configure --with-rebar=mix --enable-all \
&& make deps \
&& make rel
&& make prod
WORKDIR /rootfs
ARG VERSION
@@ -165,11 +168,10 @@ RUN apk -U upgrade --available --no-cache \
&& apk add --no-cache \
$(cat /tmp/runDeps) \
so:libcap.so.2 \
so:libtdsodbc.so.0 \
so:libtdsodbc.so \
curl \
tini \
&& rm /tmp/runDeps \
&& ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so
&& rm /tmp/runDeps
ARG USER
ARG UID
@@ -200,7 +202,7 @@ HEALTHCHECK \
WORKDIR /$HOME
USER $USER
VOLUME ["/$HOME"]
EXPOSE 1880 1883 4369-4399 5210 5222 5269 5280 5443
EXPOSE 1880 1883 4369-4399 5210 5222 5269 5280 5443 5478 7777 50000-50099
ENTRYPOINT ["/sbin/tini","--","ejabberdctl"]
CMD ["foreground"]
+15 -4
View File
@@ -24,8 +24,11 @@ define_macro:
PORT_HTTP: 5280
PORT_BROWSER: 1880
PORT_STUN: 5478
PORT_TURN_MIN: 50000
PORT_TURN_MAX: 50099
PORT_MQTT: 1883
PORT_PROXY65: 7777
STARTTLS_REQUIRED: true
hosts:
- HOST
@@ -49,7 +52,7 @@ listen:
max_stanza_size: 262144
shaper: c2s_shaper
access: c2s
starttls_required: true
starttls_required: STARTTLS_REQUIRED
-
port: PORT_C2S_TLS
ip: "::"
@@ -75,7 +78,7 @@ listen:
/bosh: mod_bosh
/captcha: ejabberd_captcha
/upload: mod_http_upload
/ws: ejabberd_http_ws
/websocket: ejabberd_http_ws
-
port: PORT_HTTP
ip: "::"
@@ -102,6 +105,8 @@ listen:
transport: udp
module: ejabberd_stun
use_turn: true
turn_min_port: PORT_TURN_MIN
turn_max_port: PORT_TURN_MAX
## The server's public IPv4 address:
# turn_ipv4_address: "203.0.113.3"
## The server's public IPv6 address:
@@ -151,7 +156,12 @@ api_permissions:
from: ejabberd_web_admin
who: admin
what: "*"
"admin access":
"adhoc commands":
from: mod_adhoc_api
who: admin
what: "*"
"http access":
from: mod_http_api
who:
access:
allow:
@@ -192,6 +202,7 @@ shaper_rules:
modules:
mod_adhoc: {}
mod_adhoc_api: {}
mod_admin_extra: {}
mod_announce:
access: announce
@@ -206,7 +217,7 @@ modules:
mod_fail2ban: {}
mod_http_api: {}
mod_http_upload:
put_url: https://@HOST@:5443/upload
put_url: https://@HOST_URL_ENCODE@:5443/upload
custom_headers:
"Access-Control-Allow-Origin": "https://@HOST@"
"Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
+156 -11
View File
@@ -67,10 +67,15 @@ done
# shellcheck source=ejabberdctl.cfg.example
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
[ "$ERLANG_NODE" = "${ERLANG_NODE%@*}" ] && ERLANG_NODE="$ERLANG_NODE@$(hostname -s)"
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
: "${SPOOL_DIR:="{{spool_dir}}"}"
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
# backward support for old mnesia spool dir path
: "${SPOOL_DIR_OLD:="$SPOOL_DIR/$ERLANG_NODE"}"
[ -r "$SPOOL_DIR_OLD/schema.DAT" ] && [ ! -r "$SPOOL_DIR/schema.DAT" ] && SPOOL_DIR="$SPOOL_DIR_OLD"
# define erl parameters
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
if [ -n "$FIREWALL_WINDOW" ] ; then
@@ -117,6 +122,9 @@ export CONTRIB_MODULES_CONF_DIR
export ERL_LIBS
export SCRIPT_DIR
# Only required for Erlang/OTP 25:
export ERL_FLAGS="$ERL_FLAGS -enable-feature maybe_expr"
set_dist_client()
{
[ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -dist_listen false"
@@ -132,9 +140,19 @@ run_cmd()
}
exec_cmd()
{
case $EXEC_CMD in
as_current_user) exec "$@" ;;
as_install_user) su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@" ;;
case $EXEC_CMD,$(uname -s) in
as_install_user,OpenBSD)
su -s /bin/sh "$INSTALLUSER" -c 'exec "$0" "$@"' "$@"
;;
as_install_user,NetBSD)
su "$INSTALLUSER" -c 'exec "$0" "$@"' -- "$@"
;;
as_install_user,*)
su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@"
;;
as_current_user,*)
"$@"
;;
esac
}
run_erl()
@@ -191,7 +209,9 @@ livewarning()
echo "Please be extremely cautious with your actions,"
echo "and exit immediately if you are not completely sure."
echo ""
echo "To exit and detach this shell from ejabberd, press:"
echo "To stop ejabberd gracefully:"
echo " ejabberd:stop()."
echo "To quit erlang immediately, press:"
echo " control+g and then q"
echo ""
echo "--------------------------------------------------------------------"
@@ -307,7 +327,17 @@ check_start()
{
ECSIMAGE_DBPATH=$HOME/database/$ERLANG_NODE
[ ! -d "$ECSIMAGE_DBPATH" ] && ln -s $HOME/database $HOME/database/$ERLANG_NODE
[ -n "$ERL_DIST_PORT" ] && return
[ -n "$ERL_DIST_PORT" ] && {
netstat -nl | grep ":5210" >/dev/null && {
echo "Error: The file ejabberdctl.cfg has configured ERL_DIST_PORT=$ERL_DIST_PORT"
echo " but the port 5210 is already in use."
echo " Stop that program or configure a different ERL_DIST_PORT"
echo ""
netstat -nlp | grep ":5210"
echo ""
}
return
}
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
pgrep -f "$ERLANG_NODE" >/dev/null && {
echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running."
@@ -359,6 +389,13 @@ post_waiter_loop()
# allow sync calls
wait_status()
{
wait_status_node "$ERLANG_NODE" $1 $2 $3
}
wait_status_node()
{
CONNECT_NODE=$1
shift
# args: status try delay
# return: 0 OK, 1 KO
timeout="$2"
@@ -370,9 +407,9 @@ wait_status()
status="$1"
else
run_erl "$(uid ctl)" -hidden -noinput \
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
-eval 'net_kernel:connect_node('"'$CONNECT_NODE'"')' \
-s ejabberd_ctl \
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
-extra "$CONNECT_NODE" $NO_TIMEOUT status > /dev/null
status="$?"
fi
done
@@ -381,19 +418,26 @@ wait_status()
exec_other_command()
{
exec_other_command_node $ERLANG_NODE "$@"
}
exec_other_command_node()
{
CONNECT_NODE=$1
shift
if [ -z "$CTL_OVER_HTTP" ] || [ ! -S "$CTL_OVER_HTTP" ] \
|| [ ! -x "$(command -v curl)" ] || [ -z "$1" ] || [ "$1" = "help" ] \
|| [ "$1" = "mnesia_info_ctl" ]|| [ "$1" = "print_sql_schema" ] ; then
run_erl "$(uid ctl)" -hidden -noinput \
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
-eval 'net_kernel:connect_node('"'$CONNECT_NODE'"')' \
-s ejabberd_ctl \
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
-extra "$CONNECT_NODE" $NO_TIMEOUT "$@"
result=$?
case $result in
3) help;;
*) :;;
esac
exit $result
return $result
else
exec_ctl_over_http_socket "$@"
fi
@@ -435,6 +479,103 @@ cd "$SPOOL_DIR" || {
exit 6
}
printe()
{
printf "\n"
printf "\e[1;40;32m==> %s\e[0m\n" "$1"
}
## Function copied from tools/make-installers
user_agrees()
{
question="$*"
if [ -t 0 ]
then
printe "$question (y/n) [n]"
read -r response
case "$response" in
[Yy]|[Yy][Ee][Ss])
return 0
;;
[Nn]|[Nn][Oo]|'')
return 1
;;
*)
echo 'Please respond with "yes" or "no".'
user_agrees "$question"
;;
esac
else # Assume 'yes' if not running interactively.
return 0
fi
}
mnesia_change()
{
ERLANG_NODE_OLD="$1"
[ "$ERLANG_NODE_OLD" = "" ] \
&& echo "Error: Please provide the old erlang node name, for example:" \
&& echo " ejabberdctl mnesia_change ejabberd@oldmachine" \
&& exit 1
SPOOL_DIR_BACKUP=$SPOOL_DIR/$ERLANG_NODE_OLD-backup/
OLDFILE=$SPOOL_DIR_BACKUP/$ERLANG_NODE_OLD.backup
NEWFILE=$SPOOL_DIR_BACKUP/$ERLANG_NODE.backup
printe "This changes your mnesia database from node name '$ERLANG_NODE_OLD' to '$ERLANG_NODE'"
[ -d "$SPOOL_DIR_BACKUP" ] && printe "WARNING! A backup of old node already exists in $SPOOL_DIR_BACKUP"
if ! user_agrees "Do you want to proceed?"
then
echo 'Operation aborted.'
exit 1
fi
printe "Starting ejabberd with old node name $ERLANG_NODE_OLD ..."
exec_erl "$ERLANG_NODE_OLD" $EJABBERD_OPTS -detached
wait_status_node $ERLANG_NODE_OLD 0 30 2
result=$?
case $result in
1) echo "There was a problem starting ejabberd with the old erlang node name. " \
&& echo "Check for log errors in $EJABBERD_LOG_PATH" \
&& exit $result;;
*) :;;
esac
exec_other_command_node $ERLANG_NODE_OLD "status"
printe "Making backup of old database to file $OLDFILE ..."
mkdir $SPOOL_DIR_BACKUP
exec_other_command_node $ERLANG_NODE_OLD backup "$OLDFILE"
printe "Changing node name in new backup file $NEWFILE ..."
exec_other_command_node $ERLANG_NODE_OLD mnesia_change_nodename "$ERLANG_NODE_OLD" "$ERLANG_NODE" "$OLDFILE" "$NEWFILE"
printe "Stopping old ejabberd..."
exec_other_command_node $ERLANG_NODE_OLD "stop"
wait_status_node $ERLANG_NODE_OLD 3 30 2 && stop_epmd
printe "Moving old mnesia spool files to backup subdirectory $SPOOL_DIR_BACKUP ..."
mv $SPOOL_DIR/*.DAT $SPOOL_DIR_BACKUP
mv $SPOOL_DIR/*.DCD $SPOOL_DIR_BACKUP
mv $SPOOL_DIR/*.LOG $SPOOL_DIR_BACKUP
printe "Starting ejabberd with new node name $ERLANG_NODE ..."
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -detached
wait_status 0 30 2
exec_other_command "status"
printe "Installing fallback of new mnesia..."
exec_other_command install_fallback "$NEWFILE"
printe "Stopping new ejabberd..."
exec_other_command "stop"
wait_status 3 30 2 && stop_epmd
printe "Finished, now you can start ejabberd normally"
}
# main
case $1 in
start)
@@ -487,7 +628,8 @@ case $1 in
-noinput -hidden \
-eval 'net_kernel:connect_node('"'$PEER'"')' \
-eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
-s erlang halt -output text
-eval 'halt(case net_adm:ping('"'$PEER'"') of pong -> 0; pang -> 1 end).' \
-output text
;;
started)
set_dist_client
@@ -497,6 +639,9 @@ case $1 in
set_dist_client
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
;;
mnesia_change)
mnesia_change $2
;;
post_waiter)
post_waiter_waiting
;;
+335 -226
View File
@@ -4,7 +4,6 @@ on:
push:
paths-ignore:
- '.devcontainer/**'
- 'examples/**'
- 'lib/**'
- 'man/**'
- 'priv/**'
@@ -12,177 +11,234 @@ on:
pull_request:
paths-ignore:
- '.devcontainer/**'
- 'examples/**'
- 'lib/**'
- 'man/**'
- 'priv/**'
- '**.md'
env:
DEV: _build/dev/rel/ejabberd
jobs:
tests:
name: Tests
############################################################### Compile #####
compile:
runs-on: ubuntu-24.04-arm
strategy:
fail-fast: false
matrix:
otp: ['20.0', '25', '26', '27']
runs-on: ubuntu-20.04
services:
redis:
image: redis
ports:
- 6379:6379
otp: ['28']
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Test shell scripts
if: matrix.otp == '27'
run: |
shellcheck test/ejabberd_SUITE_data/gencerts.sh
shellcheck tools/captcha.sh
shellcheck ejabberd.init.template
shellcheck -x ejabberdctl.template
- name: Get specific Erlang/OTP
uses: erlef/setup-beam@v1
- uses: erlef/setup-beam@v1
with:
otp-version: ${{ matrix.otp }}
- name: Get a compatible Rebar3
if: matrix.otp < 24
run: |
rm rebar3
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
chmod +x rebar3
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: libexpat1-dev libgd-dev libpam0g-dev
libsqlite3-dev libwebp-dev libyaml-dev
- 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-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.sql
sudo systemctl start mysql.service
sudo systemctl start postgresql.service
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost'
IDENTIFIED BY 'ejabberd_test';"
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
TO 'ejabberd_test'@'localhost';"
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 "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: Remove syntax_tools from release
run: sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
- name: Cache Hex.pm
uses: actions/cache@v4
- name: Cache rebar3
uses: actions/cache@v5
with:
path: |
~/.cache/rebar3/
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
- name: Get old eredis for old Erlang
if: matrix.otp < 21
run: ./rebar3 unlock eredis
_build/default/lib/
key: ci-${{ matrix.otp }}-${{hashFiles('rebar.*')}}
- name: Compile
run: |
./autogen.sh
./configure --with-rebar=./rebar3 \
--prefix=/tmp/ejabberd \
--enable-all \
--disable-elixir \
--disable-mssql \
--disable-odbc
make
uses: ./.github/actions/manage-ejabberd
with:
for: prod
do: compile
tool: rebar3
configure: --disable-elixir
- name: Compress compiled.tar
run: |
tar -cvf /tmp/compiled.tar .
- uses: actions/upload-artifact@v6
with:
name: compiled-${{ matrix.otp }}
path: /tmp/compiled.tar
retention-days: 1
########################################################## Static Tests #####
static:
needs: compile
runs-on: ubuntu-24.04-arm
strategy:
matrix:
otp: ['28']
steps:
- uses: erlef/setup-beam@v1
with:
otp-version: ${{ matrix.otp }}
- uses: actions/download-artifact@v7
with:
name: compiled-${{ matrix.otp }}
- run: tar -xf compiled.tar
- name: Test shell scripts
run: |
shellcheck ejabberd.init.template
shellcheck -x ejabberdctl.template
shellcheck .vscode/relive.sh
shellcheck rel/setup-dev.sh
shellcheck rel/setup-relive.sh
shellcheck test/ejabberd_SUITE_data/gencerts.sh
shellcheck tools/captcha.sh
shellcheck tools/emacs-indent.sh
shellcheck tools/generate-doap.sh
shellcheck tools/prepare-tr.sh
shellcheck tools/rebar3-format.sh
- run: make install -s
- run: make hooks
- run: make options
- run: make xref
- run: make dialyzer
- run: make test-eunit
- run: make testeunit
- run: make elvis
if: matrix.otp >= 23
if: matrix.otp > '25'
- 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
- run: make install -s
- name: Start Development Release
run: |
make dev
RE=_build/dev/rel/ejabberd
sed -i 's/starttls_required: true/starttls_required: false/g' $RE/conf/ejabberd.yml
$RE/bin/ejabberdctl start
$RE/bin/ejabberdctl started
$RE/bin/ejabberdctl register admin localhost admin
grep -q "is started in" $RE/logs/ejabberd.log
######################################################### Dynamic Tests #####
- name: Run XMPP Interoperability Tests against CI server.
if: matrix.otp == '27'
dynamic:
needs: compile
runs-on: ubuntu-24.04-arm
strategy:
matrix:
otp: ['28']
steps:
- uses: erlef/setup-beam@v1
with:
otp-version: ${{ matrix.otp }}
- uses: awalsh128/cache-apt-pkgs-action@latest
if: matrix.otp < '28'
with:
packages: libexpat1-dev libgd-dev libpam0g-dev
libsqlite3-dev libwebp-dev libyaml-dev
- uses: actions/download-artifact@v7
with:
name: compiled-${{ matrix.otp }}
- run: tar -xf compiled.tar
- name: Check production release
uses: ./.github/actions/manage-ejabberd
with:
for: prod
do: deploy, start, stop, check
- name: Start development release
uses: ./.github/actions/manage-ejabberd
with:
for: dev
do: deploy, no_tls, start, register
username: user123
- name: Run XMPP Interoperability Tests against CI server
if: matrix.otp == '28'
continue-on-error: true
uses: XMPP-Interop-Testing/xmpp-interop-tests-action@v1.4.0
uses: XMPP-Interop-Testing/xmpp-interop-tests-action@v1.7.2
with:
domain: 'localhost'
adminAccountUsername: 'admin'
adminAccountPassword: 'admin'
disabledSpecifications: RFC6121,XEP-0030,XEP-0045,XEP-0054,XEP-0060,XEP-0080,XEP-0115,XEP-0118,XEP-0215,XEP-0347,XEP-0363,XEP-0384
adminAccountUsername: 'user123'
adminAccountPassword: 's0mePass'
disabledSpecifications: RFC6121,XEP-0030,XEP-0045,XEP-0054,XEP-0060,
XEP-0080,XEP-0115,XEP-0118,XEP-0215,XEP-0347,
XEP-0363,XEP-0384,XEP-0421
- name: Stop Development Release
- name: Stop development release
if: always()
uses: ./.github/actions/manage-ejabberd
with:
for: dev
do: stop, check
- name: View production logs
if: always()
uses: ./.github/actions/manage-ejabberd
with:
for: prod
do: logs
- name: View development logs
if: always()
uses: ./.github/actions/manage-ejabberd
with:
for: dev
do: logs
##################################################### Common Test Suite #####
ct:
needs: compile
runs-on: ubuntu-24.04-arm
strategy:
matrix:
otp: ['28']
backend: [agnostic, extauth, ldap, mnesia, mysql, pgsql, redis, sqlite]
schema: [single, multi]
exclude:
- backend: agnostic
schema: single
- backend: extauth
schema: single
- backend: ldap
schema: single
- backend: mnesia
schema: single
- backend: redis
schema: single
steps:
- uses: erlef/setup-beam@v1
with:
otp-version: ${{ matrix.otp }}
- uses: actions/download-artifact@v7
with:
name: compiled-${{ matrix.otp }}
- run: tar -xf compiled.tar
- name: Prepare database
uses: ./.github/actions/manage-database
with:
for: ${{ matrix.backend }}
do: install, start, user, create
- name: Setup multihost SQL schema
if: matrix.schema == 'multi'
run: |
RE=_build/dev/rel/ejabberd
$RE/bin/ejabberdctl stop
$RE/bin/ejabberdctl stopped
cat $RE/logs/ejabberd.log
grep -q "is stopped in" $RE/logs/ejabberd.log
sed -i 's|multihost_schema, false|multihost_schema, true|g' \
test/suite.erl
- name: Run tests
id: ct
run: CT_BACKENDS=${{ matrix.backend }} make test
- name: Send to coveralls
continue-on-error: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
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 "/" "_"`
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
DIAGNOSTIC=1 ./rebar3 as test coveralls send
- name: Check results
if: always() && (steps.ct.outcome != 'skipped')
@@ -194,20 +250,44 @@ jobs:
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'
- name: View logs
if: always()
run: |
echo "::group::ejabberd.log"
find logs/ -name ejabberd.log -exec cat '{}' ';'
echo "::endgroup::"
echo "::group::error.log"
find logs/ -name error.log -exec cat '{}' ';'
echo "::endgroup::"
echo "::group::exunit.log"
find logs/ -name exunit.log -exec cat '{}' ';'
echo "::endgroup::"
echo "::group::suite.log (only failures)"
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 '{}' ';'
echo "::endgroup::"
echo "::group::suite.log (complete)"
cat logs/suite.log
echo "::endgroup::"
- name: Send to coveralls
if: matrix.otp == '27'
- name: Upload CT logs
if: failure()
uses: actions/upload-artifact@v6
with:
name: ct-logs-${{ matrix.otp }}-${{ matrix.backend }}-${{ matrix.schema }}
path: _build/test/logs
retention-days: 14
############################################################# Coveralls #####
cover:
needs: ct
runs-on: ubuntu-24.04-arm
steps:
- name: Finish parallel upload to coveralls
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
DIAGNOSTIC=1 ./rebar3 as test coveralls send
curl -v -k https://coveralls.io/webhook \
--header "Content-Type: application/json" \
--data '{"repo_name":"$GITHUB_REPOSITORY",
@@ -215,94 +295,123 @@ jobs:
"payload":{"build_num":$GITHUB_RUN_ID,
"status":"done"}}'
- name: Check for changes to trigger schema upgrade test
uses: dorny/paths-filter@v3
id: filter
################################################################ Schema #####
schema:
needs: compile
runs-on: ubuntu-24.04-arm
strategy:
matrix:
otp: ['28']
steps:
- uses: erlef/setup-beam@v1
with:
filters: |
sql:
- 'sql/**'
- 'src/mod_admin_update_sql.erl'
otp-version: ${{ matrix.otp }}
- 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-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -Q "drop database [ejabberd_test];"
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -Q "drop login [ejabberd_test];"
mysql -u root -proot -e "DROP DATABASE ejabberd_test;"
sudo -u postgres psql -c "DROP DATABASE ejabberd_test;"
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.new.sql
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
TO 'ejabberd_test'@'localhost';"
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
ON DATABASE ejabberd_test TO ejabberd_test;"
sudo -u postgres psql 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
- 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'
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 '{}' ';'
- name: Upload CT logs
if: failure()
uses: actions/upload-artifact@v4
- uses: actions/download-artifact@v7
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
name: compiled-${{ matrix.otp }}
- run: tar -xf compiled.tar
###################################### multi-changed ##
- name: Prepare databases
uses: ./.github/actions/manage-database
with:
for: mysql, pgsql
do: install, start, user, create
- name: Prepare configuration
run: |
CT_BACKENDS=mysql,pgsql ./rebar3 ct \
--suite=test/ejabberd_SUITE --group=configtest_single
make dev
cp test/ejabberd_SUITE_data/ejabberd.yml ${{ env.DEV }}/conf/
cp _build/test/logs/last/*.yml ${{ env.DEV }}/database/
echo "define_macro: [CONFIGTEST_CONFIG: {modules: {mod_muc: {}}}]" \
> ${{ env.DEV }}/database/configtest.yml
cp _build/test/logs/last/*.pem ${{ env.DEV }}/conf/
cp _build/test/logs/last/*.pem ${{ env.DEV }}/database/
- name: Run ejabberd
uses: ./.github/actions/manage-ejabberd
with:
for: dev
do: start, update_sql, stop, check, logs
username: user2
- name: Dump multihost databases
uses: ./.github/actions/manage-database
with:
for: mysql, pgsql
do: dump
dump-suffix: multi-changed
######################################### multi-auto ##
- name: Prepare databases
uses: ./.github/actions/manage-database
with:
for: mysql, pgsql
do: drop, create
- name: Configure multihost schema
run: |
sed -i 's|MULTIHOST_SCHEMA|true|g' ${{ env.DEV }}/conf/ejabberd.yml
- name: Run ejabberd for multihost
uses: ./.github/actions/manage-ejabberd
with:
for: dev
do: start, stop, check, logs
username: user2
- name: Dump multihost databases
uses: ./.github/actions/manage-database
with:
for: mysql, pgsql
do: dump
dump-suffix: multi-auto
############################################ compare ##
- name: View SQL schemas (mysql)
run: |
perl test/ejabberd_SUITE_data/sql_sort.pl \
<mysql-multi-auto.sql >mysql-multi2.sql
perl test/ejabberd_SUITE_data/sql_sort.pl \
<mysql-multi-changed.sql >mysql-changed2.sql
echo "::group::differences multi-auto > multi-changed"
diff -u mysql-multi2.sql mysql-changed2.sql || echo ok
echo "::endgroup::"
echo "::group::multi-auto.sql"
cat mysql-multi-auto.sql
echo "::endgroup::"
echo "::group::multi-changed.sql"
cat mysql-multi-changed.sql
echo "::endgroup::"
- name: View SQL schemas (pgsql)
run: |
perl test/ejabberd_SUITE_data/sql_sort.pl \
<pgsql-multi-auto.sql >pgsql-multi2.sql
perl test/ejabberd_SUITE_data/sql_sort.pl \
<pgsql-multi-changed.sql >pgsql-changed2.sql
echo "::group::differences (multi-auto > multi-changed)"
diff -u pgsql-multi2.sql pgsql-changed2.sql || echo ok
echo "::endgroup::"
echo "::group::multi-auto.sql"
cat pgsql-multi-auto.sql
echo "::endgroup::"
echo "::group::multi-changed.sql"
cat pgsql-multi-changed.sql
echo "::endgroup::"
- name: View ejabberd logs
if: always()
uses: ./.github/actions/manage-ejabberd
with:
for: dev
do: logs
+63 -18
View File
@@ -4,7 +4,6 @@ on:
push:
paths-ignore:
- '.devcontainer/**'
- 'examples/**'
- 'lib/**'
- 'man/**'
- 'priv/**'
@@ -15,25 +14,32 @@ env:
IMAGE_NAME: ${{ github.repository }}
jobs:
container:
name: Container
runs-on: ubuntu-22.04
build:
runs-on: ubuntu-24.04${{ matrix.suffix }}
strategy:
matrix:
platform: [amd64, arm64]
include:
- platform: amd64
suffix:
- platform: arm64
suffix: -arm
permissions:
packages: write
steps:
- name: Check out repository code
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Checkout ejabberd-contrib
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
repository: processone/ejabberd-contrib
path: .ejabberd-modules/sources/ejabberd-contrib
- name: Log in to the Container registry
uses: docker/login-action@v3
- uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
@@ -43,24 +49,19 @@ jobs:
id: gitdescribe
run: echo "ver=$(git describe --tags)" >> $GITHUB_OUTPUT
- name: Extract metadata (tags, labels) for Docker
- uses: docker/metadata-action@v5
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
flavor: suffix=--${{ matrix.platform }}
labels: |
org.opencontainers.image.revision=${{ steps.gitdescribe.outputs.ver }}
org.opencontainers.image.licenses=GPL-2.0
org.opencontainers.image.vendor=ProcessOne
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push Docker image
uses: docker/build-push-action@v6
- uses: docker/build-push-action@v6
with:
build-args: |
VERSION=${{ steps.gitdescribe.outputs.ver }}
@@ -69,6 +70,50 @@ jobs:
context: .
file: .github/container/Dockerfile
labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64,linux/arm64
platforms: linux/${{ matrix.platform }}
push: true
tags: ${{ steps.meta.outputs.tags }}
merge:
needs: [build]
runs-on: ubuntu-24.04
outputs:
image-uri: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}@${{ steps.merge.outputs.digest }}
steps:
- uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/metadata-action@v5
id: meta-amd
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
flavor: suffix=--amd64
- uses: docker/metadata-action@v5
id: meta-arm
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
flavor: suffix=--arm64
- uses: docker/metadata-action@v5
id: meta-result
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- uses: int128/docker-manifest-create-action@v2
id: merge
with:
index-annotations: ${{ steps.metadata.outputs.labels }}
tags: ${{ steps.meta-result.outputs.tags }}
sources: |
${{ steps.meta-amd.outputs.tags }}
${{ steps.meta-arm.outputs.tags }}
#- uses: dataaxiom/ghcr-cleanup-action@v1
# with:
# dry-run: true
# delete-tags: '*--a??64'
# delete-untagged: true
# delete-ghost-images: true
# delete-partial-images: true
# delete-orphaned-images: true
+39 -14
View File
@@ -4,7 +4,6 @@ on:
push:
paths-ignore:
- '.devcontainer/**'
- 'examples/**'
- 'lib/**'
- 'man/**'
- 'priv/**'
@@ -12,7 +11,6 @@ on:
pull_request:
paths-ignore:
- '.devcontainer/**'
- 'examples/**'
- 'lib/**'
- 'man/**'
- 'priv/**'
@@ -20,14 +18,25 @@ on:
jobs:
binaries:
name: Binaries
runs-on: ubuntu-22.04
runs-on: ubuntu-22.04${{ matrix.suffix }}
strategy:
matrix:
platform: [amd64, arm64]
include:
- platform: amd64
suffix:
- platform: arm64
suffix: -arm
steps:
- name: Check out repository code
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Cache build directory
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ~/build/
key: ${{runner.os}}-ct-ng-1.27.0
key: installers-ubuntu-22.04-${{runner.arch}}-${{hashFiles('tools/make-binaries')}}
- name: Install prerequisites
run: |
sudo apt-get -qq update
@@ -40,24 +49,40 @@ jobs:
run: |
gem install --no-document --user-install fpm
echo $HOME/.local/share/gem/ruby/*/bin >> $GITHUB_PATH
- name: Check out repository code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Build binary archives
run: CHECK_DEPS=false tools/make-binaries
- name: Build DEB and RPM packages
run: tools/make-packages
- name: Build installers
run: tools/make-installers
- run: echo "rel_name_vsn=$(ls *.run | sed 's/-1-linux.*//g')" >> $GITHUB_OUTPUT
id: vsn
- name: Test RUN
uses: ./.github/actions/manage-ejabberd
with:
for: run
do: deploy, no_acme, start, register, stop, check, logs
username: user1
host: $(hostname --fqdn)
rel_name_vsn: ${{ steps.vsn.outputs.rel_name_vsn }}
- name: Test DEB
uses: ./.github/actions/manage-ejabberd
with:
for: deb
do: deploy, register, stop, logs
username: user1
host: $(hostname --fqdn)
rel_name_vsn: ${{ steps.vsn.outputs.rel_name_vsn }}
- name: Collect packages
run: |
mkdir ejabberd-packages
mv ejabberd_*.deb ejabberd-*.rpm ejabberd-*.run ejabberd-packages
- name: Upload packages
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: ejabberd-packages
name: ejabberd-packages-${{ matrix.platform }}
#
# Appending the wildcard character ("*") is a trick to make
# "ejabberd-packages" the root directory of the uploaded ZIP file:
@@ -74,9 +99,9 @@ jobs:
if: github.ref_type == 'tag'
steps:
- name: Download packages
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
name: ejabberd-packages
merge-multiple: true
- name: Draft Release
uses: softprops/action-gh-release@v2
with:
+135 -283
View File
@@ -26,284 +26,184 @@ on:
jobs:
################################################################ Rebars #####
rebars:
name: Rebars
runs-on: ubuntu-24.04-arm
strategy:
fail-fast: false
matrix:
otp: ['20', '25', '26', '27']
otp: ['25', '26', '27', '28', '29']
rebar: ['rebar', 'rebar3']
exclude:
- otp: '27'
rebar: 'rebar'
runs-on: ubuntu-24.04
- otp: '28'
rebar: 'rebar'
- otp: '29'
rebar: 'rebar'
container:
image: erlang:${{ matrix.otp }}
image: public.ecr.aws/docker/library/erlang:${{ matrix.otp }}
steps:
- 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
- uses: actions/checkout@v6
- name: Prepare libraries
run: |
apt-get -qq update
apt-get purge -y libgd3 nginx
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
apt-get -q -y install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
- name: Cache Hex.pm
uses: actions/cache@v4
- name: Cache rebar3
if: matrix.rebar == 'rebar3'
uses: actions/cache@v5
with:
path: |
~/.cache/rebar3/
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
- name: Get compatible Rebar binaries
if: matrix.rebar == 'rebar3' && matrix.otp < 21
run: rebar3 unlock eredis
_build/default/lib/
key: runtime-${{ matrix.otp }}-${{matrix.rebar}}-${{hashFiles('rebar.*')}}
- name: Compile
run: |
./autogen.sh
./configure --with-rebar=./${{ matrix.rebar }} \
--prefix=/tmp/ejabberd \
--enable-all \
--disable-elixir \
--disable-tools \
--disable-odbc
make
uses: ./.github/actions/manage-ejabberd
with:
for: prod
do: compile
tool: ${{ matrix.rebar }}
configure: --disable-elixir
- run: make hooks
- run: make options
- run: make xref
- run: make dialyzer
- run: make elvis
if: matrix.otp > '25' && matrix.rebar == 'rebar3'
- name: Prepare rel (rebar2)
if: matrix.rebar == 'rebar'
run: |
mkdir -p _build/prod && ln -s `pwd`/rel/ _build/prod/rel
mkdir -p _build/dev && ln -s `pwd`/rel/ _build/dev/rel
- name: Production
uses: ./.github/actions/manage-ejabberd
with:
for: prod
do: deploy, start, register, stop, check, logs
tool: ${{ matrix.rebar }}
username: user1
- 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: Development
uses: ./.github/actions/manage-ejabberd
with:
for: dev
do: deploy, start, register, stop, check, logs
tool: ${{ matrix.rebar }}
username: user2
- 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: Installed
uses: ./.github/actions/manage-ejabberd
with:
for: install
do: deploy, start, register, stop, check, logs
tool: ${{ matrix.rebar }}
username: user3
- 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 #####
rebar3-elixir:
name: Rebar3+Elixir
runs-on: ubuntu-24.04-arm
strategy:
fail-fast: false
matrix:
elixir: ['1.13', '1.14', '1.15', '1.16', '1.17', '1.18']
runs-on: ubuntu-24.04
elixir: ['1.14', '1.18', '1.19']
container:
image: elixir:${{ matrix.elixir }}
image: public.ecr.aws/docker/library/elixir:${{ matrix.elixir }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Prepare libraries
run: |
apt-get -qq update
apt-get -y purge libgd3 nginx
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
apt-get -q -y install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
- name: Enable Module.Example and an Elixir dependency
run: |
sed -i "s|^modules:|modules:\n 'Ejabberd.Module.Example': {}|g" ejabberd.yml.example
sed -i "s|^modules:|modules:\n 'Ejabberd.Module.Example': {}|g" \
ejabberd.yml.example
cat ejabberd.yml.example
sed -i 's|^{deps, \[\(.*\)|{deps, [{decimal, ".*", {git, "https://github.com/ericmj/decimal", {branch, "main"}}},\n \1|g' rebar.config
cat rebar.config
- name: Cache Hex.pm
uses: actions/cache@v4
- name: Cache hex.pm
uses: actions/cache@v5
with:
path: |
~/.cache/rebar3/
key: ${{matrix.elixir}}-${{hashFiles('rebar.config')}}
key: runtime-${{matrix.elixir}}-${{hashFiles('rebar.*')}}
- name: Install Hex and Rebar3 manually on older Elixir
if: matrix.elixir <= '1.14'
if: matrix.elixir < '1.15'
run: |
mix local.hex --force
mix local.rebar --force
- name: Compile
run: |
./autogen.sh
./configure --with-rebar=./rebar3 \
--prefix=/tmp/ejabberd \
--enable-all \
--disable-odbc
make
uses: ./.github/actions/manage-ejabberd
with:
for: prod
do: compile
tool: ./rebar3
- name: Test scripts, deps, eunit
run: |
make scripts deps
./rebar3 eunit --verbose
- run: make hooks
- run: make options
- run: make xref
#- run: make dialyzer
- run: make elvis
if: matrix.otp > '25'
- 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: Production
uses: ./.github/actions/manage-ejabberd
with:
for: prod
do: deploy, start, register, stop, check, logs
username: user1
- 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: Release
uses: ./.github/actions/manage-ejabberd
with:
for: dev
do: deploy, start, register, stop, check, logs
username: user2
- 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: Installed
uses: ./.github/actions/manage-ejabberd
with:
for: install
do: deploy, start, register, stop, check, logs
username: user3
- 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 'Stopping Ejabberd.Module.Example' _build/prod/rel/ejabberd/logs/ejabberd.log
test $(find _build/prod/ -empty -name error.log)
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
grep -q 'Stopping Ejabberd.Module.Example' _build/dev/rel/ejabberd/logs/ejabberd.log
test $(find _build/dev/ -empty -name error.log)
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
grep -q 'Stopping Ejabberd.Module.Example' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
- name: View logs failures
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
################################################################### Mix #####
mix:
name: Mix
runs-on: ubuntu-24.04-arm
strategy:
fail-fast: false
matrix:
elixir: ['1.13', '1.14', '1.15', '1.16', '1.17', '1.18']
runs-on: ubuntu-24.04
elixir: ['1.14', '1.18', '1.19']
container:
image: elixir:${{ matrix.elixir }}
image: public.ecr.aws/docker/library/elixir:${{ matrix.elixir }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Prepare libraries
run: |
apt-get -qq update
apt-get -y purge libgd3 nginx
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
apt-get -q -y install libexpat1-dev libgd-dev libpam0g-dev \
libsqlite3-dev libwebp-dev libyaml-dev
- name: Remove Elixir Matchers
- name: Remove Elixir matchers
run: |
echo "::remove-matcher owner=elixir-mixCompileWarning::"
echo "::remove-matcher owner=elixir-credoOutputDefault::"
@@ -313,106 +213,58 @@ jobs:
- name: Enable Module.Example and an Elixir dependency
run: |
sed -i "s|^modules:|modules:\n 'Ejabberd.Module.Example': {}|g" ejabberd.yml.example
sed -i "s|^modules:|modules:\n 'Ejabberd.Module.Example': {}|g" \
ejabberd.yml.example
cat ejabberd.yml.example
sed -i 's|^{deps, \(.*\)|{deps, \1\n {decimal, ".*", {git, "https://github.com/ericmj/decimal", {branch, "main"}}}, |g' rebar.config
cat rebar.config
- name: Cache Hex.pm
uses: actions/cache@v4
- name: Cache hex.pm
uses: actions/cache@v5
with:
path: |
~/.hex/
key: ${{matrix.elixir}}-${{hashFiles('mix.exs')}}
key: runtime-${{matrix.elixir}}-${{hashFiles('mix.*')}}
- name: Install Hex and Rebar3 manually on older Elixir
if: matrix.elixir <= '1.14'
if: matrix.elixir < '1.15'
run: |
mix local.hex --force
mix local.rebar --force
- name: Compile
run: |
./autogen.sh
./configure --with-rebar=mix \
--prefix=/tmp/ejabberd \
--enable-all
make
uses: ./.github/actions/manage-ejabberd
with:
for: prod
do: compile
tool: mix
- run: make hooks
- run: make options
- run: make xref
- run: make dialyzer
- run: make elvis
if: matrix.otp > '25'
- run: make edoc
if: matrix.elixir >= '1.14'
- 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: Production
uses: ./.github/actions/manage-ejabberd
with:
for: prod
do: deploy, start, register, stop, check, logs
username: user1
- 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: Development
uses: ./.github/actions/manage-ejabberd
with:
for: dev
do: deploy, start, register, stop, check, logs
username: user2
- 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 'Stopping Ejabberd.Module.Example' _build/prod/rel/ejabberd/logs/ejabberd.log
test $(find _build/prod/ -empty -name error.log)
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
grep -q 'Stopping Ejabberd.Module.Example' _build/dev/rel/ejabberd/logs/ejabberd.log
test $(find _build/dev/ -empty -name error.log)
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
grep -q 'Stopping Ejabberd.Module.Example' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
- name: View logs failures
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
- name: Installed
uses: ./.github/actions/manage-ejabberd
with:
for: install
do: deploy, start, register, stop, check, logs
username: user3
+177
View File
@@ -0,0 +1,177 @@
name: Weekly
on:
schedule:
- cron: '30 9 * * 0'
jobs:
############################################################### Compile #####
test:
runs-on: ubuntu-24.04-arm
strategy:
matrix:
otp: ['25', '26', '27', '28', '29.0-rc1']
steps:
- uses: actions/checkout@v6
- uses: erlef/setup-beam@v1
with:
otp-version: ${{ matrix.otp }}
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: libexpat1-dev libgd-dev libpam0g-dev
libsqlite3-dev libwebp-dev libyaml-dev
- name: Compile
uses: ./.github/actions/manage-ejabberd
with:
for: prod
do: compile
tool: rebar3
configure: --disable-elixir --disable-mssql
########################################################## Static Tests #####
- name: Test shell scripts
run: |
shellcheck ejabberd.init.template
shellcheck -x ejabberdctl.template
shellcheck .vscode/relive.sh
shellcheck rel/setup-dev.sh
shellcheck rel/setup-relive.sh
shellcheck test/ejabberd_SUITE_data/gencerts.sh
shellcheck tools/captcha.sh
shellcheck tools/emacs-indent.sh
shellcheck tools/generate-doap.sh
shellcheck tools/prepare-tr.sh
shellcheck tools/rebar3-format.sh
- run: make hooks
- run: make options
- run: make xref
- run: make dialyzer
- run: make testeunit
- run: make elvis
if: matrix.otp > '25'
- run: make install -s
######################################################### Dynamic Tests #####
- name: Check production release
uses: ./.github/actions/manage-ejabberd
with:
for: prod
do: deploy, start, stop, check
- name: Start development release
uses: ./.github/actions/manage-ejabberd
with:
for: dev
do: deploy, no_tls, start, register
username: user123
- name: Stop development release
if: always()
uses: ./.github/actions/manage-ejabberd
with:
for: dev
do: stop, check
- name: View production logs
if: always()
uses: ./.github/actions/manage-ejabberd
with:
for: prod
do: logs
- name: View development logs
if: always()
uses: ./.github/actions/manage-ejabberd
with:
for: dev
do: logs
##################################################### Common Test Suite #####
- name: Prepare database
uses: ./.github/actions/manage-database
with:
for: mysql, pgsql, redis
do: install, start, user, create
- name: Setup multihost SQL schema
run: |
sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl
- name: Run tests
id: ct
run: make test
- name: Send to coveralls
continue-on-error: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
DIAGNOSTIC=1 ./rebar3 as test coveralls send
- name: Check results
if: always() && (steps.ct.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
if: always()
run: |
echo "::group::ejabberd.log"
find logs/ -name ejabberd.log -exec cat '{}' ';'
echo "::endgroup::"
echo "::group::error.log"
find logs/ -name error.log -exec cat '{}' ';'
echo "::endgroup::"
echo "::group::exunit.log"
find logs/ -name exunit.log -exec cat '{}' ';'
echo "::endgroup::"
echo "::group::suite.log (only failures)"
cat logs/suite.log | awk \
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
echo "::endgroup::"
echo "::group::suite.log (complete)"
cat logs/suite.log
echo "::endgroup::"
- name: Upload CT logs
if: failure()
uses: actions/upload-artifact@v6
with:
name: ct-logs-${{ matrix.otp }}
path: _build/test/logs
retention-days: 14
############################################################# Coveralls #####
cover:
needs: test
if: always()
runs-on: ubuntu-24.04-arm
steps:
- name: Finish parallel upload to coveralls
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
curl -v -k https://coveralls.io/webhook \
--header "Content-Type: application/json" \
--data '{"repo_name":"$GITHUB_REPOSITORY",
"repo_token":"$GITHUB_TOKEN",
"payload":{"build_num":$GITHUB_RUN_ID,
"status":"done"}}'
+3
View File
@@ -47,3 +47,6 @@ Mnesia.nonode@nohost/
/ejabberd-*.rpm
/ejabberd-*.run
/ejabberd-*.tar.gz
/priv/mod_invites/static/bootstrap/
/priv/mod_invites/static/jquery/
/node_modules/
+392
View File
@@ -1,3 +1,395 @@
## Version 26.03
#### Core
- Fix mysql authentication for tls connections that required auth plugin switch
- Improve handling of scram "wanted to use channel-bindings but was not offered one" flag
- Add ability for mod_options values to depend on other options
- Don't fail to classify stand-alone chat states
- Fix some warnings compiling with Erlang/OTP 29 ([#4527](https://github.com/processone/ejabberd/issues/4527))
- `ejabberd_ctl`: Document how to set empty lists in ejabberdctl and WebAdmin
- `ejabberd_http`: Add handling of `Etag` and `If-Modified-Since` headers to files served by `mod_http_upload`
- `ejabberd_http`: Ignore whitespaces at end of host header
- SQL: Add ability to mark that column can be null in e_sql_schema
- Tests: Add tests for sasl2
- Tests: Make table cleanup in test more robust
#### Modules
- `mod_fast_auth`: Offered methods are based on available channel bindings
- `mod_http_api`: Always hide password in log entries
- `mod_mam`: Call `store_mam_message` hook for messages that `user_mucsub_from_muc_archive` was filtering out
- `mod_mam_sql`: Only provide the new XEP-0431 `fulltext` field, not old custom `withtext`
- `mod_muc_room`: Fix duplicate stanza-id in muc mam responses generated from local history ([#4544](https://github.com/processone/ejabberd/issues/4544))
- `mod_muc_room`: Fix hook name in commit 7732984 ([#4526](https://github.com/processone/ejabberd/issues/4526))
- `mod_pubsub_serverinfo`: Don't use `gen_server:call` for resolving pubsub host
- `mod_roster`: Add support for roster pre-approval ([#4512](https://github.com/processone/ejabberd/issues/4512))
- `mod_roster`: Fix display of groups in WebAdmin when it's a list
- `mod_roster`: in WebAdmin page, first execute SET actions, later GET
- `mod_roster_mnesia`: Improve transformation code
#### mod_invites
- Makefile: Run invites-deps only when files are missing
- Fix path to bootstrap files
- Check at start time the syntax of landing_page option ([#4525](https://github.com/processone/ejabberd/issues/4525))
- Send 'Link' http header ([#4531](https://github.com/processone/ejabberd/issues/4531))
- Set meta.pre-auth to skip redirect_url if token validated ([#4535](https://github.com/processone/ejabberd/issues/4535))
- Many security fixes ([#4539](https://github.com/processone/ejabberd/issues/4539))
- Add favicon and change color to match ejabberd branding
- Enable dark mode
- Add support for webchat_url
- Migrate to bootstrap5 and update jquery
- No inline scripts
- Make format csrf token
- Add csrf token to failed post
- Include js/css deps in static dir
- Correct hashes for bootstrap 4.6.2
- Hint at type for landing_page opt
- Many more security fixes ([#4538](https://github.com/processone/ejabberd/issues/4538))
- Check CSRF token in register form
- Add integrity hashes to scripts and css
- Comment unused resources
- Add security headers
- Remove debug log of whole query parameters (including pw)
- Don't crash on unknown host from http host header
- Make creating invite transactional
- Set overuse limits ([#4540](https://github.com/processone/ejabberd/issues/4540))
- Fix broken path when behind proxy with prefix ([#4547](https://github.com/processone/ejabberd/issues/4547))
#### Container and Installers
- Bump Erlang/OTP 28.4.1
- `make-binaries`: Bump libexpat to 2.7.5
- `make-binaries`: Bump zlib to 1.3.2
- `make-binaries`: Enable missing crypto features ([#4542](https://github.com/processone/ejabberd/issues/4542))
#### Translations
- Update Bulgarian translation
- Update Catalan and Spanish translations
- Update Chinese Simplified translation
- Update Czech translation
- Update French translation
- Update German translation
## Version 26.02
- Fixes issue with adding hats data in presences send by group chats ([#4516](https://github.com/processone/ejabberd/issues/4516))
- Removes `mod_muc_occupantid` modules, and integrates its functionality directly into `mod_muc` ([#4521](https://github.com/processone/ejabberd/issues/4521))
- Fixes issue with reset occupant-id values after restart of ejabberd ([#4521](https://github.com/processone/ejabberd/issues/4521))
- Improves handling of mediated group chat invitations in `mod_block_stranger` ([#4523](https://github.com/processone/ejabberd/issues/4523))
- Properly install `mod_invites` templates in `make install` call ([#4514](https://github.com/processone/ejabberd/issues/4514))
- Better errors in `mod_invites` ([#4515](https://github.com/processone/ejabberd/issues/4515))
- Accessibility improvements in `mod_invites` ([#4524](https://github.com/processone/ejabberd/issues/4524))
- Improves handling of request with invalid url encoded values in request handled by `ejabberd_http`
- Improves handling of invalid responses to disco queries in `mod_pubsub_serverinfo`
- Fixes conversion of MUC room configs from ejabberd older than 21.12
- Fixes to autologin in WebAdmin
## Version 26.01
#### Compile and Start
- Remove dependencies, macros and code for Erlang/OTP older than 25
- Require Elixir 1.14 or higher, that's the lowest we can test automatically
- `ejabberdctl`: Support NetBSD and OpenBSD `su` ([#4320](https://github.com/processone/ejabberd/issues/4320))
- `ejabberdctl.template`: Show meaningful error when `ERL_DIST_PORT` is in use
- `ejabberd_app`: Print address and port where listens for erlang node connections
- `Makefile.in`: Add `make relivectl` similar to `relive` but using `ejabberdctl`
#### Databases
- Add db_serialize support in mnesia modules
- Add db serialization to `mod_muc_sql`
- New database export/import infrastructure
- Add commands for new database export/import
- Apply timestamp pass in `?SQL_INSERT` queries
- Update p1_mysql to bring fix for timestamp decoding
- Extend timestamp type handling in sql macros
- Revert changes to conversion of pgsql `int` types
#### Installer and Container
- `make-binaries`: Bump Erlang/OTP 28.3.1 and Elixir 1.19.5
- `Dockerfile`: Bump Erlang/OTP 28.3.1 and Elixir 1.19.5
- `Dockerfile`: Expose also port 7777 for SOCKS5
- `Dockerfile`: Configure TURN ports and expose 5478 50000-50099
- `Dockerfile`: Try to fix error with recent `freetds` Alpine package
- Container: Setup new macro `STARTTLS_REQUIRED` to allow easy disabling
#### MUC
- Add `muc_online_rooms_count` API command
- Set `enable_hats` room option `true` by default
- Allow vcard queries even when IQ queries are disabled ([#4489](https://github.com/processone/ejabberd/issues/4489))
- Announce `stable-id` feature from XEP-0045 1.31, supported since long ago
- Fix `preload_rooms` in case of SQL database ([#4476](https://github.com/processone/ejabberd/issues/4476))
- Run new hooks: `registering_nickmuc` and `registered_nickmuc` ([#4478](https://github.com/processone/ejabberd/issues/4478))
- When deleting account, unregister account's nicks in all MUC hosts ([#4478](https://github.com/processone/ejabberd/issues/4478))
- `mod_muc_log`: Crash in `terminate/2` when stopping module ([#4486](https://github.com/processone/ejabberd/issues/4486))
- `mod_muc_occupantid`: Keep salt per MUC service, not individual rooms
- `mod_muc_room`: Rewrite hats code that gets xdata values
- `mod_muc_room`: Handle hats without definition ([#4503](https://github.com/processone/ejabberd/issues/4503))
- `mod_muc_room`: When user has no hats, don't store in hats_users
#### WebAdmin
- `ejabberd_http`: Run new `http_request_handlers_init` fold hook
- `ejabberd_http`: Add helper `get_auto_urls/2` that returns all URLs and TLS
- `ejabberd_web_admin`: Add helper functions `make_menu_system`
- `ejabberd_web_admin`: Show menu system only when can view vhosts
- `ejabberd_web_admin`: Pass Level in `webadmin_menu_system_post` and `inside` hooks
- `mod_conversejs`: Improve link to conversejs in WebAdmin ([#4495](https://github.com/processone/ejabberd/issues/4495))
- When epmd isn't running show explanation in Clustering WebAdmin page
- Use improved WebAdmin menu system in more modules
- When building WebAdmin menu system, `{URLPATH}` in link text is substituted
#### Web Services
- `rest`: Use separate `httpc` profile
- `ejabberd_captcha`: Use `mod_host_meta:get_auto_url/2`
- `ejabberd_http`: Support repeated module in request_handlers
- `ejabberd_http`: Get back handling when BOSH or WS are disabled
- `mod_host_meta`: Move `get_url` functions from `mod_host_meta` to `ejabberd_http`
- `mod_host_meta`: Allow calling `get_url/2` for other modules, not only WebSocket
- `mod_host_meta`: Cosmetic rename Module to Handler
- `mod_http_upload`: New `content_type` option similar to `mod_http_fileserver` ([#4488](https://github.com/processone/ejabberd/issues/4488))
- `mod_http_upload`: Pass ServerHost, not Host which may be `"upload.HOST"`
- `mod_http_upload`: Amend the fix for #4450 to support IDNA correctly ([#3519](https://github.com/processone/ejabberd/issues/3519))
- `mod_http_fileserver`: Support map of paths in `docroot` option
- `mod_conversejs`: Add new Conversejs Paths and ContentTypes ([#4511](https://github.com/processone/ejabberd/issues/4511))
- `mod_conversejs`: Use ContentType functions from `mod_http_fileserver` ([#4511](https://github.com/processone/ejabberd/issues/4511))
- Use `/websocket` URL in default configuration like `mod_conversejs`, it's more meaningful
#### Core and Modules
- Add `replaced_connection_timeout` toplevel option
- Fix nasty SSL warnings ([#4475](https://github.com/processon4475e/ejabberd/issues/))
- `ejabberd_commands`: Show meaningul error message when problem executing command ([#4506](https://github.com/processone/ejabberd/issues/4506))
- `ejabberd_logger`: Append "color clean" only in console template, not file
- `ejabberd_oauth`: Log error if `oauth_list_tokens` executed with unsupported DB ([#4506](https://github.com/processone/ejabberd/issues/4506))
- `misc`: Get back functions and mark them as deprecated
- `mod_adhoc_api`: Show nice command name, as WebAdmin already does
- `mod_pubsub`: Deliver pubsub notifications to remote servers for nodes with presence based delivery
- `mod_scram_update`: Don't hard-code iteration count
- Bump many XEPs versions that are already supported
- Improve documentation of `install_contrib_modules` ([#4487](https://github.com/processone/ejabberd/issues/4487))
## Version 25.10
#### Ad-hoc Commands
- `mod_configure`: New ad-hoc commands that were missing from XEP-0133
- `mod_adhoc_api`: Add support for asynchronous command calling
- `mod_adhoc_api`: If argument is a list of jids, type is `jid-multi`
- `mod_adhoc_api`: If field has several values, type is `text-multi`
#### API Commands
- Add commands argument type `binary_or_list`
- `mod_http_api`: Format sub elements for tuples from maps
- `mod_admin_extra`: Improve roster API commands documentation
- `mod_announce`: New API commands, reusing existing ad-hoc functions
- `ejabberd_admin`: New API command `restart_kindly`, improve `stop_kindly`
- `mod_admin_extra`: New API commands `list_banned` and `count_banned`
- `mod_admin_extra`: Improve API command `status_list`: support for status to be a list
- `mod_muc_admin`: New API commands `muc_get_registered_nick` and nicks ([#4468](https://github.com/processone/ejabberd/issues/4468))
- Use `mod_private:del_data` in `unban_account` API command
#### Configuration
- Rename `New` SQL schema to `Multihost`, and `Default` to `Singlehost` ([#4456](https://github.com/processone/ejabberd/issues/4456))
- Add config transformer from `use_new_schema` -> `sql_multihost_schema`
- `mod_sip`: Fix problem parsing `via` in `yconf` library ([#4444](https://github.com/processone/ejabberd/issues/4444))
#### Erlang/OTP support
- Enable feature `maybe_expr` in the compiler for Erlang/OTP 26 ([#4459](https://github.com/processone/ejabberd/issues/4459))
- Enable feature `maybe_expr` also in the runtime for Erlang/OTP 25
- Runtime: Remove Erlang 24 which won't work anymore with `maybe_expr`
- Remove `EX_RULE` and `EX_STACK` macros only used with ancient erlang
#### GitHub Workflows
- CI: Bump XMPP-Interop-Testing/xmpp-interop-tests-action ([#4469](https://github.com/processone/ejabberd/issues/4469))
- CI: Don't care to include commit details in the CT logs HTML page
- CI and Runtime: Reorganize steps to run in parallel, and ARM runner ([#4460](https://github.com/processone/ejabberd/issues/4460))
- Add local composite actions to manage ejabberd and databases
- Container: Build ARM in native runner instead of QEMU, merge and clean
- Installers: Generate ARM installers in native runner
- Tests: Run agnostic-database tests only once, not for every backend
- Tests: The odbc backend is not actually used in Commont Tests
- Weekly: New workflow that condenses CI, test all erlang without caching
#### Installers and Container
- Bump Erlang/OTP version to 27.3.4.3 in installers and container
- Bump Expat 2.7.3, OpenSSL 3.5.4, unixODBC 2.3.14 in installers
#### MUC
- `mod_mam`: New option `archive_muc_as_mucsub`
- `mod_muc`: Check if room is hibernated before calling mod_muc process
- `mod_muc`: Update implementation of XEP-0317 Hats to version 0.3.1 ([#4380](https://github.com/processone/ejabberd/issues/4380))
- `mod_muc`: Make mod_muc_sql properly handle new hats data ([#4380](https://github.com/processone/ejabberd/issues/4380))
- `mod_muc_room`: Don't require password if user is owner of room
- `mod_muc_admin`: Use in WebAdmin the new API commands that get nick registers
#### Core and Modules
- `ejabberd_http_ws`: Pass HTTP headers from WS to C2S connection ([#4471](https://github.com/processone/ejabberd/issues/4471))
- `ejabberd_listener`: Properly pass `send_timeout` option to listener sockets
- `ejabberdctl`: When ping returns pang, return also status code 1 ([#4327](https://github.com/processone/ejabberd/issues/4327))
- `ext_mod`: Print module status message after installation
- `misc`: json_encode should always call json with our filter
- `mod_admin_update_sql`: Use same index name than when creating database
- `mod_block_strangers`: Clarify `access` and `captcha` documentation ([#4221](https://github.com/processone/ejabberd/issues/4221))
- `mod_http_upload`: Encode URL before parsing, as done before `bba1a1e3c` ([#4450](https://github.com/processone/ejabberd/issues/4450))
- `mod_private`: Add `del_data/3`, `get_users_with_data/2`, `count_users_with_data/2`
- `mod_pubsub`: Don't catch `exit:{aborted, _}` inside mnesia transactions
- `mod_push`: Run new hook `push_send_notification` ([#4383](https://github.com/processone/ejabberd/issues/4383))
- WebAdmin: Respect newline and whitespace characters in results
## Version 25.08
#### API Commands
- `ban_account`: Run `sm_kick_user` event when kicking account ([#4415](https://github.com/processone/ejabberd/issues/4415))
- `ban_account`: No need to change password ([#4415](https://github.com/processone/ejabberd/issues/4415))
- `mnesia_change`: New command in `ejabberdctl` script that helps changing the mnesia node name
#### Configuration
- Rename `auth_password_types_hidden_in_scram1` option to `auth_password_types_hidden_in_sasl1`
- `econf`: If a host in configuration is encoded IDNA, decode it ([#3519](https://github.com/processone/ejabberd/issues/3519))
- `ejabberd_config`: New predefined keyword `HOST_URL_ENCODE`
- `ejabberd.yml.example`: Use `HOST_URL_ENCODE` to handle case when vhost is non-latin1
- `mod_conversejs`: Add option `conversejs_plugins` ([#4413](https://github.com/processone/ejabberd/issues/4413))
- `mod_matrix_gw`: Add `leave_timeout` option ([#4386](https://github.com/processone/ejabberd/issues/4386))
#### Documentation and Tests
- `COMPILE.md`: Mention dependencies and add link to Docs ([#4431](https://github.com/processone/ejabberd/issues/4431))
- `ejabberd_doc`: Document commands tags for modules
- CI: bump XMPP-Interop-Testing/xmpp-interop-tests-action ([#4425](https://github.com/processone/ejabberd/issues/4425))
- Runtime: Raise the minimum Erlang tested to Erlang/OTP 24
#### Installers and Container
- Bump Erlang/OTP version to 27.3.4.2
- Bump OpenSSL version to 3.5.2
- `make-binaries`: Disable Linux-PAM's `logind` support
#### Core and Modules
- Bump `p1_acme` to fix `'AttributePKCS-10'` and OTP 28 ([processone/p1_acme#4](https://github.com/processone/p1_acme/issues/4))
- Prevent loops in `xml_compress:decode` with corrupted data
- `ejabberd_auth_mnesia`: Fix issue with filtering duplicates in `get_users()`
- `ejabberd_listener`: Add secret in temporary unix domain socket path ([#4422](https://github.com/processone/ejabberd/issues/4422))
- `ejabberd_listener`: Log error when cannot set definitive unix socket ([#4422](https://github.com/processone/ejabberd/issues/4422))
- `ejabberd_listener`: Try to create provisional socket in final directory ([#4422](https://github.com/processone/ejabberd/issues/4422))
- `ejabberd_logger`: Print log lines colorized in console when using rebar3
- `mod_conversejs`: Ensure assets_path ends in `/` as required by Converse ([#4414](https://github.com/processone/ejabberd/issues/4414))
- `mod_conversejs`: Ensure plugins URL is separated with `/` ([#4413](https://github.com/processone/ejabberd/issues/4413))
- `mod_http_upload`: Encode URLs into IDNA when showing to XMPP client ([#3519](https://github.com/processone/ejabberd/issues/3519))
- `mod_matrix_gw`: Add support for null values in `is_canonical_json` ([#4421](https://github.com/processone/ejabberd/issues/4421))
- `mod_matrix_gw`: Don't send empty direct Matrix messages ([#4420](https://github.com/processone/ejabberd/issues/4420))
- `mod_matrix_gw`: Matrix gateway updates
- `mod_muc`: Report db failures when restoring rooms
- `mod_muc`: Unsubscribe users from members-only rooms when expelled ([#4412](https://github.com/processone/ejabberd/issues/4412))
- `mod_providers`: New module to serve easily XMPP Providers files
- `mod_register`: Don't duplicate welcome subject and message
- `mod_scram_upgrade`: Fix format of passwords updates
- `mod_scram_upgrade`: Only offer upgrades to methods that aren't already stored
## Version 25.07
#### Security fix
- `ext_mod`: Add temporary workaround for zip including absolute path
#### Compilation
- Raise the minimum Elixir tested version to 1.14.0 ([#4281](https://github.com/processone/ejabberd/issues/4281))
- Raise Erlang/OTP minimum requirement to 25.0 ([#4281](https://github.com/processone/ejabberd/issues/4281))
- `configure.ac`: Allow to specify minimal erlang version using `--with-min-erlang`
- `Makefile.in`: Add target `test-<group>`
- `rebar3-format.sh`: Replace csplit with perl
- Container: Bump Erlang/OTP 27.3.4.1, Elixir 1.18.4
- Installers: Bump Erlang/OTP 27.3.4.1, Elixir 1.18.4, libexpat 2.7.1, OpenSSL 3.5.1
#### Configuration and Tests
- Add `rest_proxy*` options to configure proxy used by rest module
- `ejabberd_c2s`: Add `auth_password_types_hidden_in_scram1` option
- `ejabberd_http`: Remove unused `default_host` option and state element
- `ejabberd_http`: New option `hosts_alias` and function `resolve_host_alias/1` ([#4400](https://github.com/processone/ejabberd/issues/4400))
- New predefined keywords: `CONFIG_PATH` and `LOG_PATH`
- Fix macro used in string options when defined in env var
- Use auxiliary function to get `$HOME`, use Mnesia directory when not set ([#4402](https://github.com/processone/ejabberd/issues/4402))
- `ejabberd_config`: Better `lists:uniq` substitute
- Tests: update readme and compose to work with current sw versions
- Update Elvis to 4.1.1, fix some warnings and enable their tests
#### Erlang/OTP 28 support
- Add workaround in `p1_acme` for Jose 1.11.10 not supporting OTP 28 `ecPrivkeyVer1` ([#4393](https://github.com/processone/ejabberd/issues/4393))
- Bump `fast_xml` and `xmpp` for improved Erlang/OTP 28 support
- Bump `xmpp` and `p1_acme` patched with Erlang/OTP 28 support
- Fix `make options` in Erlang/OTP 28 ([#4352](https://github.com/processone/ejabberd/issues/4352))
- Fix crash in `rebar3 cover` with Erlang/OTP 28 ([#4353](https://github.com/processone/ejabberd/issues/4353))
- Rebar/Rebar3: Update binaries to work with Erlang/OTP 25-28 ([#4354](https://github.com/processone/ejabberd/issues/4354))
- CI and Runtime: Add Erlang/OTP 28 to the versions matrix
#### SQL
- Fix mnesia to sql exporter after changes to auth tables
- Update code for switching to new schema type to users table changes
- Add mssql specific implementation of `delete_old_mam_messages`
- Make `delete_old_mam_messages_batch` work with sqlite
- `ejabberd_sm_sql`: Use misc:encode_pid/1
- `mysql.sql`: Fix typo in commit 7862c6a when creating users table
- `pg.sql`: Fix missing comma in postgres schema ([#4409](https://github.com/processone/ejabberd/issues/4409))
#### Core and Modules
- `ejabberd_s2s_in`: Allow S2S connections to accept client certificates that have only server purpose ([#4392](https://github.com/processone/ejabberd/issues/4392))
- `ext_mod`: Recommend to write README.md instead txt (processone/ejabberd-contrib#363)
- `ext_mod`: Support library path installed from Debian (processone/ejabberd-contrib#363)
- `ext_mod`: When upgrading module, clean also the compiled directories
- `gen_mod`: Add support to prepare module stopping before actually stopping any module
- `mod_antispam`: Imported from ejabberd-contrib and improved ([#4373](https://github.com/processone/ejabberd/issues/4373))
- `mod_auth_fast`: Clear tokens on kick, change pass and unregister ([#4397](https://github.com/processone/ejabberd/issues/4397))([#4398](https://github.com/processone/ejabberd/issues/4398))([#4399](https://github.com/processone/ejabberd/issues/4399))
- `mod_conversejs`: Add link in WebAdmin to local Converse if configured
- `mod_mam`: Present mam full text search in xep-431 compatible way
- `mod_mam_mnesia`: Handle objects that don't need conversion in `transform/0`
- `mod_matrix_gw`: Don't send empty messages in Matrix rooms ([#4385](https://github.com/processone/ejabberd/issues/4385))
- `mod_matrix_gw`: Support older Matrix rooms versions starting from version 4
- `mod_matrix_gw`: When encoding JSON, handle term that is key-value list ([#4379](https://github.com/processone/ejabberd/issues/4379))
- `mod_matrix_gw_s2s`: Fix key validation in `check_signature`
- `mod_mix` and `mod_muc_rtbl`: Support list of IDs in `pubsub-items-retract` (processone/xmpp#100)
- `mod_pubsub_serverinfo`: Imported module from ejabberd-contrib ([#4408](https://github.com/processone/ejabberd/issues/4408))
- `mod_register`: Normalize username when determining if user want to change pass
- `mod_register`: Strip query data when returning errors
- WebAdmin: New hooks `webadmin_menu_system` to add items to system menu
## Version 25.04
#### Security fixes
- Fixes issue with handling of user provided occupant-id in messages and presences sent to muc room. Server was replacing
just first instance of occupant-id with its own version, leaving other ones untouched. That would mean that depending
on order in which clients send occupant-id, they could see value provided by sender, and that could be used to spoof
as different sender.
#### Commands API
- `kick_users`: New command to kick all logged users for a given host
#### Bugfixes
- Fix issue with sql schema auto upgrade when using `sqlite` database
- Fix problem with container update, that could ignore previous data stored in `mnesia` database
- Revert limit of allowed characters in shared roster group names, that will again allow using symbols like `:`
## Version 25.03
#### Commands API
+7 -3
View File
@@ -19,7 +19,7 @@ To compile ejabberd you need:
- GCC
- Libexpat ≥ 1.95
- Libyaml ≥ 0.1.4
- Erlang/OTP ≥ 20.0
- Erlang/OTP ≥ 25.0
- OpenSSL ≥ 1.0.0
Other optional libraries are:
@@ -28,8 +28,7 @@ Other optional libraries are:
- 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.
- Elixir ≥ 1.14.0, for Elixir support
If your system splits packages in libraries and development headers,
install the development packages too.
@@ -66,6 +65,11 @@ To configure the compilation, features, install paths...
./configure --help
The build tool automatically downloads and compiles the
erlang libraries that [ejabberd depends on][docs-repo].
[docs-repo]: https://docs.ejabberd.im/developer/repositories/
Install in the System
---------------------
+232 -39
View File
@@ -105,7 +105,7 @@ Next steps
### Register admin account
#### [![ejabberd Container](https://img.shields.io/badge/ejabberd-grey?logo=opencontainersinitiative&logoColor=2094f3)](https://github.com/processone/ejabberd/pkgs/container/ejabberd) [:orange_circle:](#images-comparison)
#### [![ejabberd Container](https://img.shields.io/badge/ejabberd-grey?logo=opencontainersinitiative&logoColor=2094f3)](https://github.com/processone/ejabberd/pkgs/container/ejabberd) [🔅](#images-comparison)
If you set the `REGISTER_ADMIN_PASSWORD` environment variable,
an account is automatically registered with that password,
@@ -118,10 +118,19 @@ The account created depends on what variables you have set:
The account registration is shown in the container log:
```bash
$ podman run -it \
--env EJABBERD_MACRO_HOST=example.org \
--env EJABBERD_MACRO_ADMIN=juliet@example.org \
--env REGISTER_ADMIN_PASSWORD=somePassw0rd \
ghcr.io/processone/ejabberd
:> ejabberdctl register juliet example.org somePassw0rd
User juliet@example.org successfully registered
```
:> ejabberdctl register admin example.org somePassw0rd
User admin@example.org successfully registered
```
This is implemented internally by using
[Commands on start](#commands-on-start).
Alternatively, you can register the account manually yourself
and edit `conf/ejabberd.yml` and add the ACL as explained in
@@ -207,20 +216,21 @@ documentation section.
Advanced
--------
### Ports
### Ports 🟠
The container image exposes several ports
(check also [Docs: Firewall Settings](https://docs.ejabberd.im/admin/guide/security/#firewall-settings)):
- `5222`: The default port for XMPP clients.
- `5269`: For XMPP federation. Only needed if you want to communicate with users on other servers.
- `5280`: For admin interface (URL is `admin/`).
- `1880`: For admin interface (URL is `/`, useful for [podman-desktop](https://podman-desktop.io/) and [docker-desktop](https://www.docker.com/products/docker-desktop/)) [:orange_circle:](#images-comparison)
- `5443`: With encryption, used for admin interface, API, CAPTCHA, OAuth, Websockets and XMPP BOSH.
- `1880`: For admin interface (URL is `/`, useful for [podman-desktop](https://podman-desktop.io/) and [docker-desktop](https://www.docker.com/products/docker-desktop/)) [🔅](#images-comparison)
- `1883`: Used for MQTT
- `5478` UDP: STUN service 🟠
- `50000-50099` UDP: TURN service 🟠
- `7777`: SOCKS5 file transfer proxy 🟠
- `5210`: Erlang connectivity when `ERL_DIST_PORT` is set, alternative to EPMD [🔅](#images-comparison)
- `4369-4399`: EPMD and Erlang connectivity, used for `ejabberdctl` and clustering
- `5210`: Erlang connectivity when `ERL_DIST_PORT` is set, alternative to EPMD [:orange_circle:](#images-comparison)
### Volumes
@@ -266,20 +276,58 @@ and reads `CTL_ON_START` every time the container is started.
Those variables can contain one ejabberdctl command,
or several commands separated with the blankspace and `;` characters.
By default failure of any of commands executed that way would
abort start, this can be disabled by prefixing commands with `!`
If any of those commands returns a failure, the container starting gets aborted.
If there is a command with a result that can be ignored,
prefix that command with `!`
Example usage (or check the [full example](#customized-example)):
All this works when starting ejabberd with the default method `foreground`,
not when using `live`, `iexlive`, ...
This example registers an `admin@localhost` account when the container is first created.
Everytime the container starts, it shows the list of registered accounts,
checks that the admin account exists and password is valid,
changes the password of an account if it exists (ignoring any failure),
and shows the ejabberd starts (check also the [full example](#customized-example)):
```yaml
environment:
- CTL_ON_CREATE=! register admin localhost asd
- CTL_ON_CREATE=register admin localhost asd
- CTL_ON_START=stats registeredusers ;
check_password admin localhost asd ;
! change_password bot123 localhost qqq ;
status
```
Same example using Podman:
```bash
$ podman run -it \
--env CTL_ON_CREATE="register admin localhost asd" \
--env CTL_ON_START="stats registeredusers ; \
check_password admin localhost asd ; \
! change_password bot123 localhost qqq ; \
status" \
ghcr.io/processone/ejabberd
### Macros in environment [:high_brightness:](#images-comparison)
...
:> ejabberdctl register admin localhost asd
User admin@localhost successfully registered
:> ejabberdctl stats registeredusers
1
:> ejabberdctl check_password admin localhost asd
:> ejabberdctl change_password bot123 localhost qqq
{not_found,"unknown_user"}
:> FAILURE in command 'change_password bot123 localhost qqq' !!! Ignoring result
:> ejabberdctl status
The node ejabberd@localhost is started. Status: started
ejabberd 25.10.0 is running in that node
```
### Macros in environment
ejabberd reads `EJABBERD_MACRO_*` environment variables
and uses them to define the corresponding
@@ -304,6 +352,152 @@ now you can define the admin account JID using an environment variable:
Check the [full example](#customized-example) for other example.
### ejabberd-contrib
This section addresses those topics related to
[ejabberd-contrib](https://docs.ejabberd.im/admin/guide/modules/#ejabberd-contrib):
- [Download source code](#download-source-code)
- [Install a module](#install-a-module)
- [Install git for dependencies](#install-git-for-dependencies)
- [Install your module](#install-your-module)
---
#### Download source code
The `ejabberd` container image includes the ejabberd-contrib git repository source code,
but `ecs` does not, so first download it:
```bash
$ docker exec ejabberd ejabberdctl modules_update_specs
```
#### Install a module
Compile and install any of the contributed modules, for example:
```bash
docker exec ejabberd ejabberdctl module_install mod_statsdx
Module mod_statsdx has been installed and started.
It's configured in the file:
/opt/ejabberd/.ejabberd-modules/mod_statsdx/conf/mod_statsdx.yml
Configure the module in that file, or remove it
and configure in your main ejabberd.yml
```
#### Install git for dependencies
Some modules depend on erlang libraries,
but the container images do not include `git` or `mix` to download them.
Consequently, when you attempt to install such a module,
there will be error messages like:
```bash
docker exec ejabberd ejabberdctl module_install ejabberd_observer_cli
I'll download "recon" using git because I can't use Mix to fetch from hex.pm:
/bin/sh: mix: not found
Fetching dependency observer_cli:
/bin/sh: git: not found
...
```
the solution is to install `git` in the container image:
```bash
docker exec --user root ejabberd apk add git
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
(1/3) Installing pcre2 (10.43-r0)
(2/3) Installing git (2.47.2-r0)
(3/3) Installing git-init-template (2.47.2-r0)
Executing busybox-1.37.0-r12.trigger
OK: 27 MiB in 42 packages
```
and now you can upgrade the module:
```bash
docker exec ejabberd ejabberdctl module_upgrade ejabberd_observer_cli
I'll download "recon" using git because I can't use Mix to fetch from hex.pm:
/bin/sh: mix: not found
Fetching dependency observer_cli: Cloning into 'observer_cli'...
Fetching dependency os_stats: Cloning into 'os_stats'...
Fetching dependency recon: Cloning into 'recon'...
Inlining: inline_size=24 inline_effort=150
Old inliner: threshold=0 functions=[{insert,2},{merge,2}]
Module ejabberd_observer_cli has been installed.
Now you can configure it in your ejabberd.yml
I'll download "recon" using git because I can't use Mix to fetch from hex.pm:
/bin/sh: mix: not found
```
#### Install your module
If you [developed an ejabberd module](https://docs.ejabberd.im/developer/extending-ejabberd/modules/),
you can install it in your container image:
1. Create a local directory for `ejabberd-modules`:
``` sh
mkdir docker-modules
```
2. Then create the directory structure for your custom module:
``` sh
cd docker-modules
mkdir -p sources/mod_hello_world/
touch sources/mod_hello_world/mod_hello_world.spec
mkdir sources/mod_hello_world/src/
mv mod_hello_world.erl sources/mod_hello_world/src/
mkdir sources/mod_hello_world/conf/
echo -e "modules:\n mod_hello_world: {}" > sources/mod_hello_world/conf/mod_hello_world.yml
cd ..
```
3. Grant ownership of that directory to the UID that ejabberd will use inside the Docker image:
``` sh
sudo chown 9000 -R docker-modules/
```
4. Start ejabberd in the container:
``` sh
sudo docker run \
--name hellotest \
-d \
--volume "$(pwd)/docker-modules:/home/ejabberd/.ejabberd-modules/" \
-p 5222:5222 \
-p 5280:5280 \
ejabberd/ecs
```
5. Check the module is available for installing, and then install it:
``` sh
sudo docker exec -it hellotest ejabberdctl modules_available
mod_hello_world []
sudo docker exec -it hellotest ejabberdctl module_install mod_hello_world
```
6. If the module works correctly, you will see `Hello` in the ejabberd logs when it starts:
``` sh
sudo docker exec -it hellotest grep Hello logs/ejabberd.log
2020-10-06 13:40:13.154335+00:00 [info]
<0.492.0>@mod_hello_world:start/2:15 Hello, ejabberd world!
```
### ejabberdapi
When the container is running (and thus ejabberd), you can exec commands inside the container
@@ -412,12 +606,12 @@ it is necessary to change the old hostname stored in Mnesia.
This section is equivalent to the ejabberd Documentation
[Change Computer Hostname](https://docs.ejabberd.im/admin/guide/managing/#change-computer-hostname),
but particularized to containers that use this
ecs container image from ejabberd 23.01 or older.
`ecs` container image from ejabberd 23.01 or older.
#### Setup Old Container
Let's assume a container running ejabberd 23.01 (or older) from
this ecs container image, with the database directory binded
this `ecs` container image, with the database directory binded
and one registered account.
This can be produced with:
```bash
@@ -569,11 +763,10 @@ docker buildx build \
#### Podman build
To build the image using Podman, please notice:
Some minor remarks:
- `EXPOSE 4369-4399` port range is not supported, remove that in Dockerfile
- It mentions that `healthcheck` is not supported by the Open Container Initiative image format
- to start with command `live`, you may want to add environment variable `EJABBERD_BYPASS_WARNINGS=true`
- When building, it mentions that `healthcheck` is not supported by the Open Container Initiative image format
- To start with command `live`, you may want to add environment variable `EJABBERD_BYPASS_WARNINGS=true`
```bash
podman build \
@@ -909,10 +1102,10 @@ Images Comparison
Let's summarize the differences between both container images. Legend:
- :sparkle: is the recommended alternative
- :orange_circle: added in the latest release (ejabberd 25.03)
- :high_brightness: added in the previous release (ejabberd 24.12)
- :low_brightness: added in the pre-previous release (ejabberd 24.10)
- ❇️: is the recommended alternative
- 🟠: changed in ejabberd 26.01
- 🔆: changed in ...
- 🔅: changed in ejabberd 25.03
| | [![ejabberd Container](https://img.shields.io/badge/ejabberd-grey?logo=opencontainersinitiative&logoColor=2094f3)](https://github.com/processone/ejabberd/pkgs/container/ejabberd) | [![ecs Container](https://img.shields.io/badge/ecs-grey?logo=docker&logoColor=2094f3)](https://hub.docker.com/r/ejabberd/ecs/) |
|:----------------------|:------------------|:-----------------------|
@@ -920,24 +1113,24 @@ Let's summarize the differences between both container images. Legend:
| Generated by | [container.yml](https://github.com/processone/ejabberd/blob/master/.github/workflows/container.yml) | [tests.yml](https://github.com/processone/docker-ejabberd/blob/master/.github/workflows/tests.yml) |
| Built for | stable releases <br /> `master` branch | stable releases <br /> [`master` branch zip](https://github.com/processone/docker-ejabberd/actions/workflows/tests.yml) |
| Architectures | `linux/amd64` <br /> `linux/arm64` | `linux/amd64` |
| Software | Erlang/OTP 27.3-alpine <br /> Elixir 1.18.3 | Alpine 3.19 <br /> Erlang/OTP 26.2 <br /> Elixir 1.15.7 |
| Software | Erlang/OTP 28.4.1.0-alpine 🟠 <br /> Elixir 1.19.5 🟠 | Alpine 3.22 <br /> Erlang/OTP 26.2 <br /> Elixir 1.18.3 |
| Published in | [ghcr.io/processone/ejabberd](https://github.com/processone/ejabberd/pkgs/container/ejabberd) | [docker.io/ejabberd/ecs](https://hub.docker.com/r/ejabberd/ecs/) <br /> [ghcr.io/processone/ecs](https://github.com/processone/docker-ejabberd/pkgs/container/ecs) |
| :black_square_button: **Additional content** |
| [ejabberd-contrib](https://docs.ejabberd.im/admin/guide/modules/#ejabberd-contrib) | included | not included |
| [ejabberdapi](#ejabberdapi) | included :orange_circle: | included |
| [ejabberd-contrib](#ejabberd-contrib) | included | not included |
| [ejabberdapi](#ejabberdapi) | included 🔅 | included |
| :black_square_button: **Ports** |
| [1880](#ports) for WebAdmin | yes :orange_circle: | yes :orange_circle: |
| [5210](#ports) for `ERL_DIST_PORT` | supported | supported :orange_circle: |
| [1880](#ports) for WebAdmin | yes 🔅 | yes 🔅 |
| [5210](#ports) for `ERL_DIST_PORT` | supported | supported 🔅 |
| :black_square_button: **Paths** |
| `$HOME` | `/opt/ejabberd/` | `/home/ejabberd/` |
| User data | `$HOME` :sparkle: <br /> `/home/ejabberd/` :orange_circle: | `$HOME` <br /> `/opt/ejabberd/` :sparkle: :low_brightness: |
| `ejabberdctl` | `ejabberdctl` :sparkle: <br /> `bin/ejabberdctl` :orange_circle: | `bin/ejabberdctl` <br /> `ejabberdctl` :sparkle: :low_brightness: |
| [`captcha.sh`](#captcha) | `$HOME/bin/captcha.sh` :orange_circle: | `$HOME/bin/captcha.sh` :orange_circle: |
| `*.sql` files | `$HOME/sql/*.sql` :sparkle: :orange_circle: <br /> `$HOME/database/*.sql` :orange_circle: | `$HOME/database/*.sql` <br /> `$HOME/sql/*.sql` :sparkle: :orange_circle: |
| Mnesia spool files | `$HOME/database/` :sparkle: <br /> `$HOME/database/NODENAME/` :orange_circle: | `$HOME/database/NODENAME/` <br /> `$HOME/database/` :sparkle: :orange_circle: |
| User data | `$HOME` ❇️ <br /> `/home/ejabberd/` 🔅 | `$HOME` <br /> `/opt/ejabberd/` ❇️ |
| `ejabberdctl` | `ejabberdctl` ❇️ <br /> `bin/ejabberdctl` 🔅 | `bin/ejabberdctl` <br /> `ejabberdctl` ❇️ |
| [`captcha.sh`](#captcha) | `$HOME/bin/captcha.sh` 🔅 | `$HOME/bin/captcha.sh` 🔅 |
| `*.sql` files | `$HOME/sql/*.sql` ❇️ 🔅 <br /> `$HOME/database/*.sql` 🔅 | `$HOME/database/*.sql` <br /> `$HOME/sql/*.sql` ❇️ 🔅 |
| Mnesia spool files | `$HOME/database/` ❇️ <br /> `$HOME/database/NODENAME/` 🔅 | `$HOME/database/NODENAME/` <br /> `$HOME/database/` ❇️ 🔅 |
| :black_square_button: **Variables** |
| [`EJABBERD_MACRO_*`](#macros-in-environment) | supported :high_brightness: | supported :high_brightness: |
| Macros used in `ejabberd.yml` | yes :orange_circle: | yes :orange_circle: |
| [`EJABBERD_MACRO_ADMIN`](#register-admin-account) | Grant admin rights :orange_circle: <br /> (default `admin@localhost`) <br /> | Hardcoded `admin@localhost` |
| [`REGISTER_ADMIN_PASSWORD`](#register-admin-account) | Register admin account :orange_circle: | unsupported |
| `CTL_OVER_HTTP` | enabled :orange_circle: | unsupported |
| [`EJABBERD_MACRO_*`](#macros-in-environment) | supported | supported |
| Macros used in `ejabberd.yml` | yes 🔅 | yes 🔅 |
| [`EJABBERD_MACRO_ADMIN`](#register-admin-account) | Grant admin rights 🔅 <br /> (default `admin@localhost`) <br /> | Hardcoded `admin@localhost` |
| [`REGISTER_ADMIN_PASSWORD`](#register-admin-account) | Register admin account 🔅 | unsupported |
| `CTL_OVER_HTTP` | enabled 🔅 | unsupported |
+1
View File
@@ -26,6 +26,7 @@ We would like to thanks official ejabberd source code contributors:
- Sonny Scroggin
- Alexey Shchepin
- Shelley Shyan
- Stefan Strigler
- Radoslaw Szymczyszyn
- Stu Tomlinson
- Christian Ulrich
+62 -24
View File
@@ -2,8 +2,11 @@
#' definitions
#
# Only required for Erlang/OTP 25
MAYBE=ERL_FLAGS="-enable-feature maybe_expr"
ESCRIPT = @ESCRIPT@
REBAR = @rebar@ # rebar|rebar3|mix binary (or path to binary)
REBAR = $(MAYBE) @rebar@ # rebar|rebar3|mix binary (or path to binary)
REBAR3 = @REBAR3@ # path to rebar3 binary
MIX = @rebar@
AWK = @AWK@
@@ -123,7 +126,7 @@ REBAR_VER_318:=$(shell $(REBAR) --version | $(AWK) -F '[ .]' '/rebar / {print ($
endif
ifeq "$(REBAR_VER)" "6"
REBAR=$(MIX)
REBAR=$(MAYBE) $(MIX)
SKIPDEPS=
LISTDEPS=deps.tree
UPDATEDEPS=deps.update
@@ -141,7 +144,8 @@ ifeq "$(REBAR_VER)" "6"
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 $(MAYBE) $(IEX) --name ejabberd@localhost -S mix run
RELIVECTLCMD=$(ESCRIPT) rel/relive.escript ctl && _build/relivectl/ejabberdctl live
REL_LIB_DIR = _build/dev/rel/ejabberd/lib
COPY_REL_TARGET = dev
GET_DEPS_TRANSLATIONS=MIX_ENV=translations $(REBAR) $(GET_DEPS)
@@ -173,6 +177,7 @@ endif
REBARREL=$(REBAR) as prod tar
REBARDEV=$(REBAR) as dev release
RELIVECMD=$(REBAR) as dev relive
RELIVECTLCMD=$(ESCRIPT) rel/relive.escript ctl && _build/relivectl/ejabberdctl live
REL_LIB_DIR = _build/dev/rel/ejabberd/lib
COPY_REL_TARGET = dev
GET_DEPS_TRANSLATIONS=$(REBAR) as translations $(GET_DEPS)
@@ -190,9 +195,12 @@ else
XREFOPTIONS=
CLEANARG=
REBARREL=$(REBAR) generate
REBARDEV=
REBARDEV=@echo "Rebar2 detected... dev not supported.\
\nTry: make prod, or: ./configure --with-rebar=rebar3 ; make dev"
RELIVECMD=@echo "Rebar2 detected... relive not supported.\
\nTry: ./configure --with-rebar=rebar3 ; make relive"
\nTry: ./configure --with-rebar=rebar3 ; make relive"
RELIVECTLCMD=@echo "Rebar2 detected... relivectl not supported.\
\nTry: ./configure --with-rebar=rebar3 ; make relivectl"
REL_LIB_DIR = rel/ejabberd/lib
COPY_REL_TARGET = rel
endif
@@ -204,7 +212,7 @@ endif
all: scripts deps src
deps: $(DEPSDIR)/.got
deps: $(DEPSDIR)/.got invites-deps
$(DEPSDIR)/.got:
rm -rf $(DEPSDIR)/.got
@@ -216,6 +224,19 @@ $(DEPSDIR)/.got:
$(DEPSDIR)/.built: $(DEPSDIR)/.got
$(REBAR) compile && :> $(DEPSDIR)/.built
ifeq (, $(shell which npm))
INSTALL_INVITES_DEPS=tools/dl_invites_page_deps.sh priv/mod_invites/static
else
INSTALL_INVITES_DEPS=npm install
endif
invites-deps: priv/mod_invites/static/bootstrap/ priv/mod_invites/static/jquery/
priv/mod_invites/static/bootstrap/:
$(INSTALL_INVITES_DEPS)
priv/mod_invites/static/jquery/:
$(INSTALL_INVITES_DEPS)
src: $(DEPSDIR)/.built
$(REBAR) $(SKIPDEPS) compile
$(EXPLICIT_ELIXIR_COMPILE)
@@ -226,13 +247,13 @@ update:
$(REBAR) $(UPDATEDEPS) && :> $(DEPSDIR)/.got
$(CONFIGURE_DEPS)
xref: all
xref: src
$(REBAR) $(SKIPDEPS) xref $(XREFOPTIONS)
hooks: all
hooks: src
tools/hook_deps.sh $(EBINDIR)
options: all
options: src
tools/opt_types.sh ejabberd_option $(EBINDIR)
translations:
@@ -303,8 +324,9 @@ BINARIES=$(DEPSDIR)/epam/priv/bin/epam $(DEPSDIR)/eimp/priv/bin/eimp $(DEPSDIR)/
DEPS_FILES_FILTERED=$(filter-out $(BINARIES) $(DEPSDIR)/elixir/ebin/elixir.app,$(DEPS_FILES))
DEPS_DIRS=$(sort $(DEPSDIR)/ $(foreach DEP,$(DEPS),$(DEPSDIR)/$(DEP)/) $(dir $(DEPS_FILES)))
MAIN_FILES=$(filter-out %/configure.beam,$(call FILES_WILDCARD,$(EBINDIR)/*.beam $(EBINDIR)/*.app priv/msgs/*.msg priv/css/*.css priv/img/*.png priv/js/*.js priv/lib/* include/*.hrl COPYING))
MAIN_DIRS=$(sort $(dir $(MAIN_FILES)) priv/bin priv/sql priv/lua)
MAIN_FILES=$(filter-out %/configure.beam,$(call FILES_WILDCARD,$(EBINDIR)/*.beam $(EBINDIR)/*.app priv/msgs/*.msg priv/css/*.css priv/img/*.png priv/js/*.js priv/lib/* priv/mod_invites/* priv/mod_invites/static/* priv/mod_invites/static/bootstrap/css/bootstrap.min.css priv/mod_invites/static/bootstrap/js/bootstrap.min.js priv/mod_invites/static/jquery/jquery.min.js \
priv/mod_invites/static/logos/* include/*.hrl COPYING))
MAIN_DIRS=$(sort $(dir $(MAIN_FILES)) priv/bin priv/sql priv/lua priv/mod_invites)
define DEP_VERSION_template
DEP_$(1)_VERSION:=$(shell $(SED) -e '/vsn/!d;s/.*, *"/$(1)-/;s/".*//' $(2) 2>/dev/null)
@@ -392,28 +414,30 @@ relive:
$(EXPLICIT_ELIXIR_COMPILE_DEV)
$(RELIVECMD)
relivectl:
$(EXPLICIT_ELIXIR_COMPILE_DEV)
$(RELIVECTLCMD)
relivelibdir=$(shell pwd)/$(DEPSDIR)
relivedir=$(shell pwd)/_build/relive
CONFIG_DIR = ${relivedir}/conf
SPOOL_DIR = ${relivedir}/database
LOGS_DIR = ${relivedir}/logs
relivebase=$(shell pwd)/$(DEPSBASE)
#.
#' scripts
#
ejabberdctl.relive:
# Used for ejabberdctl.relive and ejabberdctl.relivectl
ejabberdctl.re%:
$(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*{{config_dir}}*${relivebase}/re${*}/conf*g" \
-e "s*{{logs_dir}}*${relivebase}/re${*}/logs*g" \
-e "s*{{spool_dir}}*${relivebase}/re${*}/database*g" \
-e "s*{{bindir}}*${BINDIR}*g" \
-e "s*{{libdir}}*${relivelibdir}${ELIXIR_LIBDIR}*g" \
-e "s*ERTS_VSN*# ERTS_VSN*g" \
-e "s*{{iexpath}}*${IEX}*g" \
-e "s*{{erl}}*${ERL}*g" \
-e "s*{{epmd}}*${EPMD}*g" ejabberdctl.template \
> ejabberdctl.relive
> ejabberdctl.re${*}
ejabberd.init:
$(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \
@@ -543,6 +567,7 @@ clean:
rm -rf test/*.beam
rm -f rebar.lock
rm -f ejabberdctl.example ejabberd.init ejabberd.service
rm -rf priv/mod_invites/static/{jquery,bootstrap4}
$(REBAR) clean $(CLEANARG)
clean-rel:
@@ -661,7 +686,18 @@ test:
@cd priv && ln -sf ../sql
$(REBAR) $(SKIPDEPS) ct
test-eunit:
.PHONY: test-%
define test-group-target
test-$1:
$(REBAR) $(SKIPDEPS) ct --suite=test/ejabberd_SUITE --group=$1
endef
ifneq ($(filter test-%,$(MAKECMDGOALS)),)
group_to_test := $(patsubst test-%,%,$(filter test-%,$(MAKECMDGOALS)))
$(eval $(call test-group-target,$(group_to_test)))
endif
testeunit:
$(REBAR) $(SKIPDEPS) eunit --verbose
#.
@@ -669,7 +705,7 @@ test-eunit:
#
.PHONY: src edoc dialyzer Makefile TAGS clean clean-rel distclean prod rel \
install uninstall uninstall-binary uninstall-all translations deps test test-eunit \
install uninstall uninstall-binary uninstall-all translations deps test testeunit \
all dev doap help install-rel relive scripts uninstall-rel update \
erlang_plt deps_plt ejabberd_plt xref hooks options format indent
@@ -695,7 +731,8 @@ help:
@echo ""
@echo " prod Build a production release"
@echo " dev Build a development release"
@echo " relive Start a live ejabberd in _build/relive/"
@echo " relive Start live using rebar3/mix tools"
@echo " relivectl Start live using ejabberdctl script"
@echo ""
@echo " doap Generate DOAP file"
@echo " edoc Generate EDoc documentation [mix]"
@@ -710,7 +747,8 @@ help:
@echo " elvis Run Elvis source code style reviewer [rebar3]"
@echo " hooks Run hooks validator"
@echo " test Run Common Tests suite [rebar3]"
@echo " test-eunit Run EUnit suite [rebar3]"
@echo " testeunit Run EUnit suite [rebar3]"
@echo " test-<group> Run Common Test suite for specific group only [rebar3]"
@echo " xref Run cross reference analysis [rebar3]"
#.
+25 -10
View File
@@ -2,8 +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 25.03` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
REQUIRE_ERLANG_MIN="9.0.5 (Erlang/OTP 20.0)"
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 26.03` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
AC_ARG_WITH(min-erlang,
AS_HELP_STRING([--with-min-erlang=version],[set minimal required erlang version, default to OTP25]),
[if test "X$withval" = "X"; then
REQUIRE_ERLANG_MIN="13.0 (Erlang/OTP 25.0)"
else
REQUIRE_ERLANG_MIN="$withval"
fi
], [REQUIRE_ERLANG_MIN="13.0 (Erlang/OTP 25.0)"])
REQUIRE_ERLANG_MAX="100.0.0 (No Max)"
AC_CONFIG_MACRO_DIR([m4])
@@ -183,12 +192,20 @@ AC_ARG_ENABLE(mysql,
esac],[if test "x$mysql" = "x"; then mysql=false; fi])
AC_ARG_ENABLE(new_sql_schema,
[AS_HELP_STRING([--enable-new-sql-schema],[use new SQL schema by default (default: no)])],
[AS_HELP_STRING([--enable-new-sql-schema],[obsolete, use --enable-multihost-sql-schema instead (default: no)])],
[case "${enableval}" in
yes) new_sql_schema=true ;;
no) new_sql_schema=false ;;
yes) multihost_sql_schema=true ;;
no) multihost_sql_schema=false ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-new-sql-schema) ;;
esac],[new_sql_schema=false])
esac],[multihost_sql_schema=false])
AC_ARG_ENABLE(multihost_sql_schema,
[AS_HELP_STRING([--enable-multihost-sql-schema],[use multihost SQL schema by default (default: no)])],
[case "${enableval}" in
yes) multihost_sql_schema=true ;;
no) multihost_sql_schema=false ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-multihost-sql-schema) ;;
esac],[multihost_sql_schema=false])
AC_ARG_ENABLE(odbc,
[AS_HELP_STRING([--enable-odbc],[enable pure ODBC support (default: no)])],
@@ -309,7 +326,7 @@ 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(multihost_sql_schema)
AC_SUBST(full_xml)
AC_SUBST(odbc)
AC_SUBST(mssql)
@@ -350,9 +367,7 @@ AS_CASE([$rebar],
$rebar unlock "$deps"])
deps=""
ERLANG_VERSION=m4_esyscmd([erl -noinput -noshell -eval 'erlang:display(list_to_integer(erlang:system_info(otp_release))), halt().'])
AS_IF([test "$ERLANG_VERSION" -lt "21"], [deps="luerl,$deps"])
AS_IF([test "$ERLANG_VERSION" -lt "22"], [deps="lager,$deps"])
AS_IF([test "$ERLANG_VERSION" -le "23"], [deps="jose,$deps"])
AS_IF([test "$ERLANG_VERSION" -le "26"], [deps="jose,$deps"])
AS_IF([test "$ERLANG_VERSION" -ge "27"], [deps="jiffy,$deps"])
AS_IF([test "x$deps" = "x"], [],
[AC_MSG_NOTICE([unlocking rebar3 dependencies for old Erlang/OTP: $deps])
+85 -40
View File
@@ -47,7 +47,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0004.html"/>
<xmpp:version>2.9</xmpp:version>
<xmpp:version>2.13.2</xmpp:version>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
@@ -65,7 +65,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0013.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:version>1.3</xmpp:version>
<xmpp:since>16.02</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_offline</xmpp:note>
@@ -74,7 +74,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0016.html"/>
<xmpp:version>1.6</xmpp:version>
<xmpp:version>1.7</xmpp:version>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_privacy</xmpp:note>
@@ -101,7 +101,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0030.html"/>
<xmpp:version>2.4</xmpp:version>
<xmpp:version>2.5.0</xmpp:version>
<xmpp:since>0.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_disco</xmpp:note>
@@ -128,7 +128,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0045.html"/>
<xmpp:version>1.25</xmpp:version>
<xmpp:version>1.35.3</xmpp:version>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_muc</xmpp:note>
@@ -155,7 +155,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0050.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:version>1.3.0</xmpp:version>
<xmpp:since>1.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_adhoc</xmpp:note>
@@ -164,7 +164,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0054.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:version>1.3.0</xmpp:version>
<xmpp:since>0.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_vcard</xmpp:note>
@@ -200,7 +200,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0065.html"/>
<xmpp:version>1.8</xmpp:version>
<xmpp:version>1.8.2</xmpp:version>
<xmpp:since>2.0.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_proxy65</xmpp:note>
@@ -263,7 +263,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0106.html"/>
<xmpp:version>1.1</xmpp:version>
<xmpp:version>1.1.1</xmpp:version>
<xmpp:since>0.5.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
@@ -281,7 +281,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0115.html"/>
<xmpp:version>1.5</xmpp:version>
<xmpp:version>1.6.0</xmpp:version>
<xmpp:since>2.1.4</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_caps</xmpp:note>
@@ -290,7 +290,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0124.html"/>
<xmpp:version>1.11</xmpp:version>
<xmpp:version>1.11.2</xmpp:version>
<xmpp:since>16.12</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>ejabberd_bosh</xmpp:note>
@@ -299,7 +299,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0133.html"/>
<xmpp:version>1.3.0</xmpp:version>
<xmpp:version>1.3.1</xmpp:version>
<xmpp:since>13.10</xmpp:since>
<xmpp:status>partial</xmpp:status>
<xmpp:note>mod_configure</xmpp:note>
@@ -317,7 +317,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0153.html"/>
<xmpp:version>1.1</xmpp:version>
<xmpp:version>1.1.1</xmpp:version>
<xmpp:since>17.09</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_vcard</xmpp:note>
@@ -335,7 +335,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0157.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:version>1.1.1</xmpp:version>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_disco</xmpp:note>
@@ -344,7 +344,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0158.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:version>1.0.1</xmpp:version>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>ejabberd_captcha</xmpp:note>
@@ -353,7 +353,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0160.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:version>1.0.1</xmpp:version>
<xmpp:since>16.01</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_offline</xmpp:note>
@@ -362,7 +362,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0163.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:version>1.2.2</xmpp:version>
<xmpp:since>2.0.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_pubsub</xmpp:note>
@@ -389,7 +389,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0178.html"/>
<xmpp:version>1.1</xmpp:version>
<xmpp:version>1.2</xmpp:version>
<xmpp:since>17.03</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
@@ -407,7 +407,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0191.html"/>
<xmpp:version>1.2</xmpp:version>
<xmpp:version>1.3</xmpp:version>
<xmpp:since>2.1.7</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_blocking</xmpp:note>
@@ -425,7 +425,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0199.html"/>
<xmpp:version>2.0</xmpp:version>
<xmpp:version>2.0.1</xmpp:version>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_ping</xmpp:note>
@@ -452,7 +452,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0205.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:version>1.0.2</xmpp:version>
<xmpp:since>1.1.2</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
@@ -470,7 +470,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0215.html"/>
<xmpp:version>0.7</xmpp:version>
<xmpp:version>1.0.0</xmpp:version>
<xmpp:since>20.04</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_stun_disco</xmpp:note>
@@ -506,7 +506,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0231.html"/>
<xmpp:version>1.0</xmpp:version>
<xmpp:version>1.1</xmpp:version>
<xmpp:since>2.1.0</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>ejabberd_captcha</xmpp:note>
@@ -578,10 +578,10 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0317.html"/>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:version>0.3.1</xmpp:version>
<xmpp:since>21.12</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_muc_room, 0.2.0 since 25.03</xmpp:note>
<xmpp:note>mod_muc_room, 0.3.1 since 25.10</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
@@ -596,7 +596,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0334.html"/>
<xmpp:version>0.2</xmpp:version>
<xmpp:version>1.0.0</xmpp:version>
<xmpp:since>16.01</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_mam, mod_muc_log, mod_offline</xmpp:note>
@@ -632,7 +632,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0357.html"/>
<xmpp:version>0.2</xmpp:version>
<xmpp:version>0.4.1</xmpp:version>
<xmpp:since>17.08</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_push</xmpp:note>
@@ -641,7 +641,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0359.html"/>
<xmpp:version>0.5.0</xmpp:version>
<xmpp:version>0.7.0</xmpp:version>
<xmpp:since>15.09</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_mam</xmpp:note>
@@ -674,10 +674,19 @@
<xmpp:note>mod_mix</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0379.html"/>
<xmpp:version>0.3.3</xmpp:version>
<xmpp:since>26.01</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_invites</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0384.html"/>
<xmpp:version>0.8.3</xmpp:version>
<xmpp:version>0.9.0</xmpp:version>
<xmpp:since>21.12</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>node_pep</xmpp:note>
@@ -695,7 +704,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0388.html"/>
<xmpp:version>0.4.0</xmpp:version>
<xmpp:version>1.0.4</xmpp:version>
<xmpp:since>24.02</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
@@ -704,16 +713,25 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0398.html"/>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:version>1.0.0</xmpp:version>
<xmpp:since>18.03</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_avatar</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0401.html"/>
<xmpp:version>0.5.0</xmpp:version>
<xmpp:since>26.01</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_invites</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:version>1.2.0</xmpp:version>
<xmpp:since>23.10</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_private</xmpp:note>
@@ -740,7 +758,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0411.html"/>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:version>1.1.0</xmpp:version>
<xmpp:since>18.12</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_private</xmpp:note>
@@ -749,10 +767,10 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0421.html"/>
<xmpp:version>0.1.0</xmpp:version>
<xmpp:version>1.0.1</xmpp:version>
<xmpp:since>23.10</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_muc_occupantid</xmpp:note>
<xmpp:note>mod_muc</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
@@ -773,10 +791,19 @@
<xmpp:note>mod_mam</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0431.html"/>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:since>24.12</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_mam</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0440.html"/>
<xmpp:version>0.4.0</xmpp:version>
<xmpp:version>1.0.0</xmpp:version>
<xmpp:since>24.02</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note></xmpp:note>
@@ -791,10 +818,19 @@
<xmpp:note>mod_mam</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0445.html"/>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:since>26.01</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_invites</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0474.html"/>
<xmpp:version>0.4.0</xmpp:version>
<xmpp:version>0.5.0</xmpp:version>
<xmpp:since>24.02</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>, 0.4.0 since 25.03</xmpp:note>
@@ -821,10 +857,19 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0485.html"/>
<xmpp:version>0.2.0</xmpp:version>
<xmpp:since>24.02</xmpp:since>
<xmpp:version>1.0.0</xmpp:version>
<xmpp:since>25.07</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>, mod_pubsub_serverinfo in ejabberd-contrib.git</xmpp:note>
<xmpp:note>mod_pubsub_serverinfo</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0486.html"/>
<xmpp:version>0.1.0</xmpp:version>
<xmpp:since>24.07</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_muc</xmpp:note>
</xmpp:SupportedXep>
</implements>
</Project>
+1 -2
View File
@@ -179,7 +179,7 @@ modules:
mod_fail2ban: {}
mod_http_api: {}
mod_http_upload:
put_url: https://@HOST@:5443/upload
put_url: https://@HOST_URL_ENCODE@:5443/upload
custom_headers:
"Access-Control-Allow-Origin": "https://@HOST@"
"Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
@@ -205,7 +205,6 @@ modules:
default_room_options:
mam: true
mod_muc_admin: {}
mod_muc_occupantid: {}
mod_offline:
access_max_user_messages: max_user_offline_messages
mod_ping: {}
+12 -12
View File
@@ -24,18 +24,6 @@
#
#ERL_MAX_PORTS=65536
#.
#' FIREWALL_WINDOW: Range of allowed ports to pass through a firewall
#
# If ejabberd is configured to run in cluster, and a firewall is blocking ports,
# it's possible to make Erlang use a defined range of port (instead of dynamic
# ports) for node communication.
#
# Default: not defined
# Example: 4200-4210
#
#FIREWALL_WINDOW=
#.
#' INET_DIST_INTERFACE: IP address where this Erlang node listens other nodes
#
@@ -64,6 +52,18 @@
#
#ERL_DIST_PORT=5210
#.
#' FIREWALL_WINDOW: Range of allowed ports to pass through a firewall
#
# If ejabberd is configured to run in cluster, and a firewall is blocking ports,
# it's possible to make Erlang use a defined range of port (instead of dynamic
# ports) for node communication.
#
# Default: not defined
# Example: 4200-4210
#
#FIREWALL_WINDOW=
#.
#' ERL_EPMD_ADDRESS: IP addresses where EPMD listens for connections
#
+155 -10
View File
@@ -71,6 +71,10 @@ done
: "${SPOOL_DIR:="{{spool_dir}}"}"
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
# backward support for old mnesia spool dir path
: "${SPOOL_DIR_OLD:="$SPOOL_DIR/$ERLANG_NODE"}"
[ -r "$SPOOL_DIR_OLD/schema.DAT" ] && [ ! -r "$SPOOL_DIR/schema.DAT" ] && SPOOL_DIR="$SPOOL_DIR_OLD"
# define erl parameters
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
if [ -n "$FIREWALL_WINDOW" ] ; then
@@ -117,6 +121,9 @@ export CONTRIB_MODULES_CONF_DIR
export ERL_LIBS
export SCRIPT_DIR
# Only required for Erlang/OTP 25:
export ERL_FLAGS="$ERL_FLAGS -enable-feature maybe_expr"
set_dist_client()
{
[ -n "$ERL_DIST_PORT" ] && ERLANG_OPTS="$ERLANG_OPTS -dist_listen false"
@@ -125,9 +132,19 @@ set_dist_client()
# run command either directly or via su $INSTALLUSER
exec_cmd()
{
case $EXEC_CMD in
as_install_user) su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@" ;;
as_current_user) "$@" ;;
case $EXEC_CMD,$(uname -s) in
as_install_user,OpenBSD)
su -s /bin/sh "$INSTALLUSER" -c 'exec "$0" "$@"' "$@"
;;
as_install_user,NetBSD)
su "$INSTALLUSER" -c 'exec "$0" "$@"' -- "$@"
;;
as_install_user,*)
su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@"
;;
as_current_user,*)
"$@"
;;
esac
}
exec_erl()
@@ -295,7 +312,20 @@ stop_epmd()
# if all ok, ensure runtime directory exists and make it current directory
check_start()
{
[ -n "$ERL_DIST_PORT" ] && return
[ -n "$ERL_DIST_PORT" ] && {
netstat -nl | grep ":$ERL_DIST_PORT" >/dev/null && {
echo ""
echo "NOTE: The file ejabberdctl.cfg has configured ERL_DIST_PORT=$ERL_DIST_PORT"
echo " and the port 5210 is already in use."
echo " If ejabberd fails to start with listen error eaddrinsuse,"
echo " try configuring in ejabberdctl.cfg a different"
echo " INET_DIST_INTERFACE, or different ERL_DIST_PORT"
echo ""
netstat -nlp 2>/dev/null | grep ":5210"
echo ""
}
return
}
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
pgrep -f "$ERLANG_NODE" >/dev/null && {
echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running."
@@ -314,6 +344,13 @@ check_start()
# allow sync calls
wait_status()
{
wait_status_node "$ERLANG_NODE" $1 $2 $3
}
wait_status_node()
{
CONNECT_NODE=$1
shift
# args: status try delay
# return: 0 OK, 1 KO
timeout="$2"
@@ -325,9 +362,9 @@ wait_status()
status="$1"
else
exec_erl "$(uid ctl)" -hidden -noinput \
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
-eval 'net_kernel:connect_node('"'$CONNECT_NODE'"')' \
-s ejabberd_ctl \
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
-extra "$CONNECT_NODE" $NO_TIMEOUT status > /dev/null
status="$?"
fi
done
@@ -336,19 +373,26 @@ wait_status()
exec_other_command()
{
exec_other_command_node $ERLANG_NODE "$@"
}
exec_other_command_node()
{
CONNECT_NODE=$1
shift
if [ -z "$CTL_OVER_HTTP" ] || [ ! -S "$CTL_OVER_HTTP" ] \
|| [ ! -x "$(command -v curl)" ] || [ -z "$1" ] || [ "$1" = "help" ] \
|| [ "$1" = "mnesia_info_ctl" ]|| [ "$1" = "print_sql_schema" ] ; then
exec_erl "$(uid ctl)" -hidden -noinput \
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
-eval 'net_kernel:connect_node('"'$CONNECT_NODE'"')' \
-s ejabberd_ctl \
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
-extra "$CONNECT_NODE" $NO_TIMEOUT "$@"
result=$?
case $result in
3) help;;
*) :;;
esac
exit $result
return $result
else
exec_ctl_over_http_socket "$@"
fi
@@ -389,6 +433,103 @@ cd "$SPOOL_DIR" || {
exit 6
}
printe()
{
printf "\n"
printf "\e[1;40;32m==> %s\e[0m\n" "$1"
}
## Function copied from tools/make-installers
user_agrees()
{
question="$*"
if [ -t 0 ]
then
printe "$question (y/n) [n]"
read -r response
case "$response" in
[Yy]|[Yy][Ee][Ss])
return 0
;;
[Nn]|[Nn][Oo]|'')
return 1
;;
*)
echo 'Please respond with "yes" or "no".'
user_agrees "$question"
;;
esac
else # Assume 'yes' if not running interactively.
return 0
fi
}
mnesia_change()
{
ERLANG_NODE_OLD="$1"
[ "$ERLANG_NODE_OLD" = "" ] \
&& echo "Error: Please provide the old erlang node name, for example:" \
&& echo " ejabberdctl mnesia_change ejabberd@oldmachine" \
&& exit 1
SPOOL_DIR_BACKUP=$SPOOL_DIR/$ERLANG_NODE_OLD-backup/
OLDFILE=$SPOOL_DIR_BACKUP/$ERLANG_NODE_OLD.backup
NEWFILE=$SPOOL_DIR_BACKUP/$ERLANG_NODE.backup
printe "This changes your mnesia database from node name '$ERLANG_NODE_OLD' to '$ERLANG_NODE'"
[ -d "$SPOOL_DIR_BACKUP" ] && printe "WARNING! A backup of old node already exists in $SPOOL_DIR_BACKUP"
if ! user_agrees "Do you want to proceed?"
then
echo 'Operation aborted.'
exit 1
fi
printe "Starting ejabberd with old node name $ERLANG_NODE_OLD ..."
exec_erl "$ERLANG_NODE_OLD" $EJABBERD_OPTS -detached
wait_status_node $ERLANG_NODE_OLD 0 30 2
result=$?
case $result in
1) echo "There was a problem starting ejabberd with the old erlang node name. " \
&& echo "Check for log errors in $EJABBERD_LOG_PATH" \
&& exit $result;;
*) :;;
esac
exec_other_command_node $ERLANG_NODE_OLD "status"
printe "Making backup of old database to file $OLDFILE ..."
mkdir $SPOOL_DIR_BACKUP
exec_other_command_node $ERLANG_NODE_OLD backup "$OLDFILE"
printe "Changing node name in new backup file $NEWFILE ..."
exec_other_command_node $ERLANG_NODE_OLD mnesia_change_nodename "$ERLANG_NODE_OLD" "$ERLANG_NODE" "$OLDFILE" "$NEWFILE"
printe "Stopping old ejabberd..."
exec_other_command_node $ERLANG_NODE_OLD "stop"
wait_status_node $ERLANG_NODE_OLD 3 30 2 && stop_epmd
printe "Moving old mnesia spool files to backup subdirectory $SPOOL_DIR_BACKUP ..."
mv $SPOOL_DIR/*.DAT $SPOOL_DIR_BACKUP
mv $SPOOL_DIR/*.DCD $SPOOL_DIR_BACKUP
mv $SPOOL_DIR/*.LOG $SPOOL_DIR_BACKUP
printe "Starting ejabberd with new node name $ERLANG_NODE ..."
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -detached
wait_status 0 30 2
exec_other_command "status"
printe "Installing fallback of new mnesia..."
exec_other_command install_fallback "$NEWFILE"
printe "Stopping new ejabberd..."
exec_other_command "stop"
wait_status 3 30 2 && stop_epmd
printe "Finished, now you can start ejabberd normally"
}
# main
case $1 in
start)
@@ -438,7 +579,8 @@ case $1 in
-noinput -hidden \
-eval 'net_kernel:connect_node('"'$PEER'"')' \
-eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
-s erlang halt -output text
-eval 'halt(case net_adm:ping('"'$PEER'"') of pong -> 0; pang -> 1 end).' \
-output text
;;
started)
set_dist_client
@@ -448,6 +590,9 @@ case $1 in
set_dist_client
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
;;
mnesia_change)
mnesia_change $2
;;
*)
set_dist_client
exec_other_command "$@"
+3 -2
View File
@@ -16,17 +16,18 @@
{elvis_style, function_naming_convention, disable},
{elvis_style, god_modules, #{limit => 300}},
{elvis_style, invalid_dynamic_call, disable},
{elvis_style, macro_module_names, disable},
{elvis_style, macro_names, disable},
{elvis_style, max_function_arity, disable}, % #{max_arity => 15}},
{elvis_style, nesting_level, disable},
{elvis_style, no_author, disable},
{elvis_style, no_boolean_in_comparison, disable},
{elvis_style, no_catch_expressions, disable},
{elvis_style, no_debug_call, disable},
{elvis_style, no_if_expression, disable},
{elvis_style, no_import, disable},
{elvis_style, no_match_in_condition, disable},
{elvis_style, no_nested_try_catch, disable},
{elvis_style, no_operation_on_same_value, disable},
{elvis_style, no_receive_without_timeout, disable},
{elvis_style, no_single_clause_case, disable},
{elvis_style, no_spec_with_records, disable},
{elvis_style, no_throw, disable},
-3
View File
@@ -11,9 +11,6 @@ include_dirs:
- "_build/default/lib/*/include"
- "include"
macros:
- name: DEPRECATED_GET_STACKTRACE
- name: HAVE_ERL_ERROR
- name: HAVE_URI_STRING
- name: OTP_BELOW_27
- name: SIP
- name: STUN
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+6 -2
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -27,10 +27,14 @@
rescode | restuple.
%% The 'any' and 'atom' argument types and 'any' result type
%% should only be used %% by commands with tag 'internal',
%% should only be used by commands with tag 'internal',
%% which are meant to be used only internally in ejabberd,
%% and not called using external frontends.
%% When a command with tag 'async' is called by mod_adhoc_api,
%% it is spawned in a new process for the command execution,
%% and the command immediately returns success.
%% The purpose of a command can either be:
%% - informative: its purpose is to obtain information
%% - modifier: its purpose is to produce some change in the server
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+70
View File
@@ -0,0 +1,70 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2026 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(serialize_mam_v1, {
serverhost :: binary(),
username :: binary(),
timestamp :: integer(),
peer :: binary(),
type :: chat | groupchat,
nick :: binary(),
origin_id :: binary(),
packet :: binary()
}).
-record(serialize_mam_prefs_v1, {
serverhost :: binary(),
username :: binary(),
default :: atom(),
always :: term(),
never :: term()
}).
-record(serialize_roster_v1, {
serverhost :: binary(),
username :: binary(),
version :: binary() | undefined,
entries :: [{binary(),
binary(),
[binary()],
both | from | to | none,
boolean(),
subscribe | unsubscribe | both | in | out | none,
binary()}]
}).
-record(serialize_auth_v1, {
serverhost :: binary(),
username :: binary(),
passwords :: [binary() | {sha | sha256 | sha512, binary(), binary(), binary(), integer()}]
}).
-record(serialize_muc_room_v1, {
serverhost :: binary(),
name :: binary(),
host :: binary(),
options:: [{atom(), term()}]
}).
-record(serialize_muc_registrations_v1, {
serverhost :: binary(),
host :: binary(),
jid :: binary(),
nick :: binary()
}).
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+11 -16
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -29,27 +29,21 @@
-define(SQL_INSERT_MARK, sql_insert__mark_).
-define(SQL_INSERT(Table, Fields), ?SQL_INSERT_MARK(Table, Fields)).
-ifdef(COMPILER_REPORTS_ONLY_LINES).
-record(sql_query, {hash :: binary(),
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.
-record(sql_escape, {string :: fun((binary()) -> binary()),
integer :: fun((integer()) -> binary()),
boolean :: fun((boolean()) -> binary()),
in_array_string :: fun((binary()) -> binary()),
like_escape :: fun(() -> binary())}).
-record(sql_escape, {
string :: fun((binary()) -> binary() | atom()),
integer :: fun((integer()) -> binary() | atom()),
boolean :: fun((boolean()) -> binary() | atom()),
timestamp :: fun((calendar:datetime()) -> binary() | atom()),
in_array_string :: fun((binary()) -> binary() | atom()),
like_escape :: fun(() -> binary() | atom())
}).
-record(sql_index, {columns,
@@ -57,6 +51,7 @@
meta = #{}}).
-record(sql_column, {name :: binary(),
type,
nullable = false,
default = false,
opts = []}).
-record(sql_table, {name :: binary(),
@@ -72,4 +67,4 @@
-record(sql_schema_info,
{db_type :: pgsql | mysql | sqlite,
db_version :: any(),
new_schema = true :: boolean()}).
multihost_schema = true :: boolean()}).
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+32 -25
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -19,41 +19,48 @@
%%%----------------------------------------------------------------------
-define(PRINT(Format, Args), io:format(Format, Args)).
-ifdef(LAGER).
-compile([{parse_transform, lager_transform}]).
-define(DEBUG(Format, Args),
begin lager:debug(Format, Args), ok end).
-define(INFO_MSG(Format, Args),
begin lager:info(Format, Args), ok end).
-define(WARNING_MSG(Format, Args),
begin lager:warning(Format, Args), ok end).
-define(ERROR_MSG(Format, Args),
begin lager:error(Format, Args), ok end).
-define(CRITICAL_MSG(Format, Args),
begin lager:critical(Format, Args), ok end).
-else.
-include_lib("kernel/include/logger.hrl").
-define(CLEAD, "\e[1"). % bold
-define(CMID, "\e[0"). % normal
-define(CCLEAN, "\e[0m"). % clean
-define(CDEFAULT, ";49;95m"). % light magenta
-define(CDEBUG, ";49;90m"). % dark gray
-define(CINFO, ";49;92m"). % green
-define(CWARNING, ";49;93m"). % light yellow
-define(CERROR, ";49;91m"). % light magenta
-define(CCRITICAL,";49;31m"). % light red
-define(DEBUG(Format, Args),
begin ?LOG_DEBUG(Format, Args), ok end).
begin ?LOG_DEBUG(Format, Args,
#{clevel => ?CLEAD ++ ?CDEBUG,
ctext => ?CMID ++ ?CDEBUG}),
ok end).
-define(INFO_MSG(Format, Args),
begin ?LOG_INFO(Format, Args), ok end).
begin ?LOG_INFO(Format, Args,
#{clevel => ?CLEAD ++ ?CINFO,
ctext => ?CCLEAN}),
ok end).
-define(WARNING_MSG(Format, Args),
begin ?LOG_WARNING(Format, Args), ok end).
begin ?LOG_WARNING(Format, Args,
#{clevel => ?CLEAD ++ ?CWARNING,
ctext => ?CMID ++ ?CWARNING}),
ok end).
-define(ERROR_MSG(Format, Args),
begin ?LOG_ERROR(Format, Args), ok end).
begin ?LOG_ERROR(Format, Args,
#{clevel => ?CLEAD ++ ?CERROR,
ctext => ?CMID ++ ?CERROR}),
ok end).
-define(CRITICAL_MSG(Format, Args),
begin ?LOG_CRITICAL(Format, Args), ok end).
-endif.
begin ?LOG_CRITICAL(Format, Args,
#{clevel => ?CLEAD++ ?CCRITICAL,
ctext => ?CMID ++ ?CCRITICAL}),
ok end).
%% Use only when trying to troubleshoot test problem with ExUnit
-define(EXUNIT_LOG(Format, Args),
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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,10 +18,19 @@
%%%
%%%----------------------------------------------------------------------
-ifdef(DEPRECATED_GET_STACKTRACE).
-define(EX_RULE(Class, Reason, Stack), Class:Reason:Stack).
-define(EX_STACK(Stack), Stack).
-else.
-define(EX_RULE(Class, Reason, _), Class:Reason).
-define(EX_STACK(_), erlang:get_stacktrace()).
-endif.
-define(MODULE_ANTISPAM, mod_antispam).
-type url() :: binary().
-type filename() :: binary() | none | false.
-type jid_set() :: sets:set(ljid()).
-type url_set() :: sets:set(url()).
-define(DEFAULT_RTBL_DOMAINS_NODE, <<"spam_source_domains">>).
-record(rtbl_service,
{host = none :: binary() | none,
node = ?DEFAULT_RTBL_DOMAINS_NODE :: binary(),
subscribed = false :: boolean(),
retry_timer = undefined :: reference() | undefined}).
-type rtbl_service() :: #rtbl_service{}.
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+23
View File
@@ -0,0 +1,23 @@
-define(INVITE_TOKEN_EXPIRE_SECONDS_DEFAULT, 5*86400).
-define(INVITE_TOKEN_LENGTH_DEFAULT, 24).
-define(NS_INVITE_INVITE, <<"urn:xmpp:invite#invite">>).
-define(NS_INVITE_CREATE_ACCOUNT, <<"urn:xmpp:invite#create-account">>).
-define(OVERUSE_LIMIT, 1000).
-define(SPEEDY_GOAT_LEVELS, 2).
-define(SPEEDY_GOAT_SECONDS, 300).
-record(invite_token, {token :: binary(),
inviter :: {binary(), binary()},
%% A non-empty value if `invitee` indicates the invite has been used.
invitee = <<>> :: binary(),
created_at = calendar:now_to_datetime(erlang:timestamp()) :: calendar:datetime(),
expires = calendar:gregorian_seconds_to_datetime(calendar:datetime_to_gregorian_seconds(calendar:now_to_datetime(erlang:timestamp())) + ?INVITE_TOKEN_EXPIRE_SECONDS_DEFAULT) :: calendar:datetime(),
type = roster_only :: roster_only | account_only | account_subscription,
%% If type is 'roster_only' then we indicate a token has been used to create
%% an account (if allowed) by setting `account_name` to the name of the user
%% (which should match `invitee`).
account_name = <<>> :: binary()
}).
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+10 -2
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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,8 +21,16 @@
-record(room_version,
{id :: binary(),
%% use the same field names as in Synapse
enforce_key_validity :: boolean(),
special_case_aliases_auth :: boolean(),
strict_canonicaljson :: boolean(),
limit_notifications_power_levels :: boolean(),
knock_join_rule :: boolean(),
restricted_join_rule :: boolean(),
restricted_join_rule_fix :: boolean(),
knock_restricted_join_rule :: boolean(),
enforce_int_power_levels :: boolean(),
implicit_room_creator :: boolean(),
updated_redaction_rules :: boolean()
updated_redaction_rules :: boolean(),
hydra :: boolean()
}).
+4 -3
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -23,8 +23,9 @@
opts = [] :: list() | '_'}).
-record(muc_registered,
{us_host = {{<<"">>, <<"">>}, <<"">>} :: {{binary(), binary()}, binary()} | '$1',
nick = <<"">> :: binary()}).
{us_host = {{<<"">>, <<"">>}, <<"">>} :: {{binary() | '$1', binary() | '$2'},
binary() | '_'} | '$1',
nick = <<"">> :: binary() | '$3'}).
-record(muc_online_room,
{name_host :: {binary(), binary()} | '$1' | {'_', binary()} | '_',
+8 -5
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -65,7 +65,7 @@
captcha_whitelist = (?SETS):empty() :: gb_sets:set(),
mam = false :: boolean(),
pubsub = <<"">> :: binary(),
enable_hats = false :: boolean(),
enable_hats = true :: boolean(),
lang = ejabberd_option:language() :: binary()
}).
@@ -81,7 +81,8 @@
role :: role(),
%%is_subscriber = false :: boolean(),
%%subscriptions = [] :: [binary()],
last_presence :: presence() | undefined
last_presence :: presence() | undefined,
occupant_id :: binary()
}).
-record(subscriber, {jid :: jid(),
@@ -126,12 +127,14 @@
history = #lqueue{} :: lqueue(),
subject = [] :: [text()],
subject_author = {<<"">>, #jid{}} :: {binary(), jid()},
hats_users = #{} :: map(), % FIXME on OTP 21+: #{ljid() => #{binary() => binary()}},
hats_defs = #{} :: #{binary() => {binary(), binary()}},
hats_users = #{} :: #{ljid() => [binary()]},
just_created = erlang:system_time(microsecond) :: true | integer(),
activity = treap:empty() :: treap:treap(),
room_shaper = none :: ejabberd_shaper:shaper(),
room_queue :: p1_queue:queue({message | presence, jid()}) | undefined,
hibernate_timer = none :: reference() | none | hibernating
hibernate_timer = none :: reference() | none | hibernating,
salt = <<>> :: binary()
}).
-type users() :: #{ljid() => #user{}}.
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+2 -2
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -19,6 +19,6 @@
%%%----------------------------------------------------------------------
-record(private_storage,
{usns = {<<"">>, <<"">>, <<"">>} :: {binary(), binary(), binary() |
{usns = {<<"">>, <<"">>, <<"">>} :: {binary() | '$1' | '_', binary(), binary() |
'$1' | '_'},
xml = #xmlel{} :: xmlel() | '_' | '$1'}).
+1 -1
View File
@@ -2,7 +2,7 @@
%%% RFC 1928 constants.
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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-2025 ProcessOne
%%% ejabberd, Copyright (C) 2017-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+2 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -25,6 +25,7 @@
jid = {<<>>, <<>>, <<>>} :: jid:ljid(),
name = <<>> :: binary() | '_',
subscription = none :: subscription() | '_',
approved = false :: boolean() | '_',
ask = none :: ask() | '_',
groups = [] :: [binary()] | '_',
askmessage = <<"">> :: binary() | '_',
+1 -1
View File
@@ -1,6 +1,6 @@
%%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 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-2025 ProcessOne, SARL. All Rights Reserved.
%%% @copyright (C) 2002-2026 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-2025 ProcessOne
%%% ejabberd, Copyright (C) 2002-2026 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
+1004 -61
View File
File diff suppressed because it is too large Load Diff
+17 -70
View File
@@ -6,7 +6,7 @@ defmodule Ejabberd.MixProject do
source_url: "https://github.com/processone/ejabberd",
version: version(),
description: description(),
elixir: elixir_required_version(),
elixir: "~> 1.14",
elixirc_paths: ["lib"],
compile_path: ".",
compilers: [:asn1, :yecc] ++ Mix.compilers(),
@@ -84,21 +84,11 @@ defmodule Ejabberd.MixProject do
includes = ["include", deps_include()]
result = [{:d, :ELIXIR_ENABLED}] ++
cond_options() ++
if Mix.env == :test do [{:d, :TEST}] else [] end ++
Enum.map(includes, fn (path) -> {:i, path} end) ++
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}]) ++
if_version_below(~c"26", [{:d, :OTP_BELOW_26}]) ++
if_version_below(~c"27", [{:d, :OTP_BELOW_27}]) ++
if_version_below(~c"27", [{:feature, :maybe_expr, :enable}]) ++
if_version_below(~c"28", [{:d, :OTP_BELOW_28}])
defines = for {:d, value} <- result, do: {:d, value}
result ++ [{:d, :ALL_DEFS, defines}]
@@ -110,7 +100,7 @@ defmodule Ejabberd.MixProject do
{config(:debug), :debug_info},
{not config(:debug), {:debug_info, false}},
{config(:roster_gateway_workaround), {:d, :ROSTER_GATEWAY_WORKAROUND}},
{config(:new_sql_schema), {:d, :NEW_SQL_SCHEMA}}
{config(:multihost_sql_schema), {:d, :MULTIHOST_SQL_SCHEMA}}
], do:
option
end
@@ -119,19 +109,20 @@ defmodule Ejabberd.MixProject do
[{:cache_tab, "~> 1.0"},
{:dialyxir, "~> 1.2", only: [:test], runtime: false},
{:eimp, "~> 1.0"},
{:erlydtl, "~> 0.14.0"},
{:ex_doc, "~> 0.31", only: [:edoc], runtime: false},
{:fast_tls, "~> 1.1.22"},
{:fast_xml, "~> 1.1.53"},
{:fast_tls, "~> 1.1.24"},
{:fast_xml, "~> 1.1.56"},
{:fast_yaml, "~> 1.0"},
{:idna, "~> 6.0"},
{:idna, "~> 7.1"},
{:mqtree, "~> 1.0"},
{:p1_acme, "~> 1.0"},
{:p1_acme, ">= 1.0.28"},
{:p1_oauth2, "~> 0.6"},
{:p1_utils, "~> 1.0"},
{:pkix, "~> 1.0"},
{:stringprep, ">= 1.0.26"},
{:xmpp, "~> 1.10.0"},
{:yconf, ">= 1.0.18"}]
{:xmpp, ">= 1.13.1"},
{:yconf, ">= 1.0.22"}]
++ cond_deps()
end
@@ -155,13 +146,12 @@ defmodule Ejabberd.MixProject do
{config(:redis), {:eredis, "~> 1.7.1"}},
{config(:sip), {:esip, "~> 1.0"}},
{config(:zlib), {:ezlib, "~> 1.0"}},
{if_version_above(~c"23", true), {:jose, "~> 1.11.10"}},
{if_version_below(~c"24", true), {:jose, "1.11.1", override: true}},
{if_version_below(~c"27", true), {:jiffy, "~> 1.1.1"}},
{if_version_below(~c"22", true), {:lager, "~> 3.9.1"}},
{if_version_below(~c"26", true), {:jose, "1.11.10", override: true}},
{if_version_above(~c"25", true), {:jose, "~> 1.11.12"}},
{config(:lua), {:luerl, "~> 1.2.0"}},
{config(:mysql), {:p1_mysql, ">= 1.0.24"}},
{config(:pgsql), {:p1_pgsql, ">= 1.1.32"}},
{config(:mysql), {:p1_mysql, ">= 1.0.28"}},
{config(:pgsql), {:p1_pgsql, ">= 1.1.38"}},
{config(:sqlite), {:sqlite3, "~> 1.1"}},
{config(:stun), {:stun, "~> 1.0"}}], do:
dep
@@ -182,7 +172,6 @@ defmodule Ejabberd.MixProject do
{config(:redis), :eredis},
{Mix.env() == :edoc, :ex_doc},
{Mix.env() == :test, :dialyxir},
{if_version_below(~c"22", true), :lager},
{config(:mysql), :p1_mysql},
{config(:sip), :esip},
{config(:odbc), :odbc},
@@ -229,35 +218,6 @@ defmodule Ejabberd.MixProject do
end
end
defp elixir_required_version do
case {Map.get(System.get_env(), "RELIVE", "false"),
MapSet.member?(MapSet.new(System.argv()), "release")}
do
{"true", _} ->
case Version.match?(System.version(), "~> 1.11") do
false ->
IO.puts("ERROR: To use 'make relive', Elixir 1.11.0 or higher is required.")
_ -> :ok
end
"~> 1.11"
{_, true} ->
case Version.match?(System.version(), "~> 1.10") do
false ->
IO.puts("ERROR: To build releases, Elixir 1.10.0 or higher is required.")
_ -> :ok
end
case Version.match?(System.version(), "< 1.11.4")
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
end
"~> 1.10"
_ ->
"~> 1.4"
end
end
defp releases do
maybe_tar = case Mix.env() do
:prod -> [:tar]
@@ -296,22 +256,8 @@ defmodule Ejabberd.MixProject do
ro = "rel/overlays"
File.rm_rf(ro)
# Elixir lower than 1.12.0 don't have System.shell
execute = fn(command) ->
case function_exported?(System, :shell, 1) do
true ->
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
true ->
:ok
false ->
execute.("cp config/runtime.exs config/releases.exs")
System.shell(command, into: IO.stream())
end
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.template > ejabberdctl.example1")
@@ -389,6 +335,7 @@ defmodule Ejabberd.MixProject do
"CONTRIBUTORS.md": [title: "Contributors"],
"CODE_OF_CONDUCT.md": [title: "Code of Conduct"],
"CHANGELOG.md": [title: "ChangeLog"],
"SECURITY.md": [title: "Security Policy"],
"COPYING": [title: "Copying License"],
"_build/edoc/docs.md": [title: "&xrArr; ejabberd Docs"]
],
+23 -28
View File
@@ -1,39 +1,34 @@
%{
"base64url": {:hex, :base64url, "1.0.1", "f8c7f2da04ca9a5d0f5f50258f055e1d699f0e8bf4cfdb30b750865368403cf6", [:rebar3], [], "hexpm", "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c"},
"cache_tab": {:hex, :cache_tab, "1.0.31", "e4097b50a6f373ab1e0a5f01bab0bef6626771a4cd6c93404ed6d54810e11fbc", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "8582b60a4a09b247ef86355ba9e07fce9e11edc0345a775c9171f971c72b6351"},
"dialyxir": {:hex, :dialyxir, "1.4.5", "ca1571ac18e0f88d4ab245f0b60fa31ff1b12cbae2b11bd25d207f865e8ae78a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b0fb08bb8107c750db5c0b324fa2df5ceaa0f9307690ee3c1f6ba5b9eb5d35c3"},
"cache_tab": {:hex, :cache_tab, "1.0.34", "935902ac8300d30f17c24f4d4056175f053ccc0572acab5fb4d1ce503831bee1", [:rebar3], [{:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "0db9f317f3941c17c9f8ea8125e25efa27bbed4cbf24a42c426fada74c82b692"},
"dialyxir": {:hex, :dialyxir, "1.4.7", "dda948fcee52962e4b6c5b4b16b2d8fa7d50d8645bbae8b8685c3f9ecb7f5f4d", [:mix], [{:erlex, ">= 0.2.8", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b34527202e6eb8cee198efec110996c25c5898f43a4094df157f8d28f27d9efe"},
"earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"},
"eimp": {:hex, :eimp, "1.0.24", "853db317ba394d479d2f1181e0b0135a3cd3c2c7eb48ff6cfb035a28dd354b14", [:rebar3], [{:p1_utils, "~> 1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "7d61432eb8a45659c0be475f44e75eeb651743aa64a1de8adf785cdad81961ad"},
"epam": {:hex, :epam, "1.0.14", "aa0b85d27f4ef3a756ae995179df952a0721237e83c6b79d644347b75016681a", [:rebar3], [], "hexpm", "2f3449e72885a72a6c2a843f561add0fc2f70d7a21f61456930a547473d4d989"},
"eimp": {:hex, :eimp, "1.0.27", "14bf9e6fac791d0c098708cbc5a0928746ed575869f4ce42a266643947790a3a", [:rebar3], [{:p1_utils, "~> 1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "3c7e83e293bcfaf50a1bf054fc4b62b7b8c484a6e4218e397709a4d0d857f3fc"},
"eredis": {:hex, :eredis, "1.7.1", "39e31aa02adcd651c657f39aafd4d31a9b2f63c6c700dc9cece98d4bc3c897ab", [:mix, :rebar3], [], "hexpm", "7c2b54c566fed55feef3341ca79b0100a6348fd3f162184b7ed5118d258c3cc1"},
"erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"},
"esip": {:hex, :esip, "1.0.57", "4b14e4832d08b9ffc10d855b5d10b3083232b1d53deb4c046679496ce85569c4", [:rebar3], [{:fast_tls, "1.1.22", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.17", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "19c357e1817b1e04792ef359bf900400f3e6d0e5ade929fd72f88ea9b44af2ed"},
"ex_doc": {:hex, :ex_doc, "0.37.3", "f7816881a443cd77872b7d6118e8a55f547f49903aef8747dbcb345a75b462f9", [:mix], [{:earmark_parser, "~> 1.4.42", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "e6aebca7156e7c29b5da4daa17f6361205b2ae5f26e5c7d8ca0d3f7e18972233"},
"erlex": {:hex, :erlex, "0.2.8", "cd8116f20f3c0afe376d1e8d1f0ae2452337729f68be016ea544a72f767d9c12", [:mix], [], "hexpm", "9d66ff9fedf69e49dc3fd12831e12a8a37b76f8651dd21cd45fcf5561a8a7590"},
"erlydtl": {:hex, :erlydtl, "0.14.0", "964b2dc84f8c17acfaa69c59ba129ef26ac45d2ba898c3c6ad9b5bdc8ba13ced", [:rebar3], [], "hexpm", "d80ec044cd8f58809c19d29ac5605be09e955040911b644505e31e9dd8143431"},
"ex_doc": {:hex, :ex_doc, "0.40.1", "67542e4b6dde74811cfd580e2c0149b78010fd13001fda7cfeb2b2c2ffb1344d", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "bcef0e2d360d93ac19f01a85d58f91752d930c0a30e2681145feea6bd3516e00"},
"exsync": {:hex, :exsync, "0.4.1", "0a14fe4bfcb80a509d8a0856be3dd070fffe619b9ba90fec13c58b316c176594", [:mix], [{:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "cefb22aa805ec97ffc5b75a4e1dc54bcaf781e8b32564bf74abbe5803d1b5178"},
"ezlib": {:hex, :ezlib, "1.0.13", "3c7f62862850a241159c10b218ecf580bce54d0890601b65144dacc2633be2b0", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "9ee62ab3f8ed55a0fd11a9569fcb8e458683f95575417272192b069f092abfbb"},
"fast_tls": {:hex, :fast_tls, "1.1.22", "44356b256afad4399c2fc5059a3066669dafd8bd4e4e796c9c1cf8910ddd265e", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "e65779aefb7ab15c4755230fef8077e687d20cc5a3984a5974f9f657e8e2485b"},
"fast_xml": {:hex, :fast_xml, "1.1.55", "ace020f2521f2a484ac8467d2822af85534a346e2aae03ffcbc34f29318befaf", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "83f3e23a780ed5f567cdec73953f06c95b838d709dbfa86b59a98a8d23c99f85"},
"fast_yaml": {:hex, :fast_yaml, "1.0.37", "f71d472fbf787ccd161b914d1eb486116a0f4f2e835337a378fbd31b59d2e74b", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "8de868721bf7e2172414f7d3148ede0f3c922b496455cd625dd5c4429515a769"},
"file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"},
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
"jiffy": {:hex, :jiffy, "1.1.2", "a9b6c9a7ec268e7cf493d028f0a4c9144f59ccb878b1afe42841597800840a1b", [:rebar3], [], "hexpm", "bb61bc42a720bbd33cb09a410e48bb79a61012c74cb8b3e75f26d988485cf381"},
"jose": {:hex, :jose, "1.11.10", "a903f5227417bd2a08c8a00a0cbcc458118be84480955e8d251297a425723f83", [:mix, :rebar3], [], "hexpm", "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"},
"luerl": {:hex, :luerl, "1.2.3", "df25f41944e57a7c4d9ef09d238bc3e850276c46039cfc12b8bb42eccf36fcb1", [:rebar3], [], "hexpm", "1b4b9d0ca5d7d280d1d2787a6a5ee9f5a212641b62bff91556baa53805df3aed"},
"ezlib": {:hex, :ezlib, "1.0.16", "8e0f209cb61db4034a3e7c920f21dd36330ba45884e707746898d5ee0db487c1", [:rebar3], [{:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "b4819540403d1ecb7eae645fdff142a8db2b476d893288d39babb92922250405"},
"fast_tls": {:hex, :fast_tls, "1.1.26", "5e46246020f9338c0661254eee0ff98e8b253a2331b3b51afb4eb8b0b3cf41ff", [:rebar3], [{:p1_utils, "~> 1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "6b0d4dd2309037565ebaa9acf39f02808f5f8215a39101a1da33c2a5b1b59b3f"},
"fast_xml": {:hex, :fast_xml, "1.1.58", "1fcfdfb58c4278dc1a163e68d1f83ba165553b1a68d48bf7e9954bb4fbf8571e", [:rebar3], [{:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "a36d6e03a398c53ba189e912bf4c7559a3704ac63c5050f126d47414018b4ca0"},
"fast_yaml": {:hex, :fast_yaml, "1.0.40", "053109abed40a80fb1e4a231ebfed39e93a4872d73e462fe9a2128503b6233d8", [:rebar3], [{:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "27705c29902c1c6f3268ba9bf387d5fa928b2e655b53110fa47b8e476d32b386"},
"file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"},
"idna": {:hex, :idna, "7.1.0", "1067a13043538129602d2f2ce6899d8713125c7d19734aa557ce2e3ea55bd4f1", [:rebar3], [], "hexpm", "6ae959a025bf36df61a8cab8508d9654891b5426a84c44d82deaffd6ddf8c71f"},
"jose": {:hex, :jose, "1.11.12", "06e62b467b61d3726cbc19e9b5489f7549c37993de846dfb3ee8259f9ed208b3", [:mix, :rebar3], [], "hexpm", "31e92b653e9210b696765cdd885437457de1add2a9011d92f8cf63e4641bab7b"},
"makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"},
"makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"},
"makeup_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"},
"mqtree": {:hex, :mqtree, "1.0.17", "82f54b8f2d22b4445db1d6cccb7fe9ead049d61410c29e32475f3ceb3ee62a89", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "5fe8b7cf8fbc4783d0fceb94654ac2bbf3242a58cd0397d249ded8ae021be2a3"},
"makeup_erlang": {:hex, :makeup_erlang, "1.0.3", "4252d5d4098da7415c390e847c814bad3764c94a814a0b4245176215615e1035", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "953297c02582a33411ac6208f2c6e55f0e870df7f80da724ed613f10e6706afd"},
"mqtree": {:hex, :mqtree, "1.0.20", "aec4b0299dfe3680014d32fd44069f8273867ce8c7d8f09492d2befdddd98598", [:rebar3], [{:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "5ec0e07b9c48a7840649600bf96e140b4fbe9e5017e1ddd3e898e15c0a383ed0"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
"p1_acme": {:hex, :p1_acme, "1.0.25", "db91f0d6c193cd1d5c0b0fa3939a898dbf56a6075db4347cde26e802715de50c", [:rebar3], [{:base64url, "~> 1.0", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "~> 6.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "~> 1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "~> 1.11.10", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "~> 1.0.17", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "a7b55b47495ddb4f98a15e65451ec3ad43f4637b955c74cd695d98e6a645d08c"},
"p1_mysql": {:hex, :p1_mysql, "1.0.26", "574d07c9936c53b1ec3556db3cf064cc14a6c39039835b3d940471bfa5ac8e2b", [:rebar3], [], "hexpm", "ea138083f2c54719b9cf549dbf5802a288b0019ea3e5449b354c74cc03fafdec"},
"p1_acme": {:hex, :p1_acme, "1.0.31", "d504620b4cb3349c9389f169481c5d88a149a44def58f4b52c6f0036cac314d0", [:rebar3], [{:idna, "~> 7.1", [hex: :idna, repo: "hexpm", optional: false]}, {:jose, "~> 1.11.12", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "~> 1.0.22", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "9b5922a90ab94da5889e64de5ccad3adc6e68a6d3c3fb708dd503757b232db1c"},
"p1_mysql": {:hex, :p1_mysql, "1.0.28", "8cffdfae7b3341dcd808fb723a3fcaeee3e55b9c971b7f75f6b0d7af6a3151e6", [:rebar3], [], "hexpm", "6e4d00e8ece505ba5091c8dab3aefe415cf2d836ff39508344c3527b366d9919"},
"p1_oauth2": {:hex, :p1_oauth2, "0.6.14", "1c5f82535574de87e2059695ac4b91f8f9aebacbc1c80287dae6f02552d47aea", [:rebar3], [], "hexpm", "1fd3ac474e43722d9d5a87c6df8d36f698ed87af7bb81cbbb66361451d99ae8f"},
"p1_pgsql": {:hex, :p1_pgsql, "1.1.32", "3f95d7e3413fc8f0be80abb4be1a0d7f67066a36905085cd5a423145598b0cb0", [:rebar3], [{:xmpp, "~> 1.10.0", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "268b01e8f4eb75c211a31495a25c2815c549aecce2f0df1a161c6e0a2cde061e"},
"p1_utils": {:hex, :p1_utils, "1.0.26", "67b0c4ac9fa3ba3ef563b31aa111b0a004439a37fac85e027f1c3617e1c7ec6c", [:rebar3], [], "hexpm", "d0379e8c1156b98bd64f8129c1de022fcca4f2fdb7486ce73bf0ed2c3376b04c"},
"p1_pgsql": {:hex, :p1_pgsql, "1.1.41", "b67cadb9079f809154d829a5eb5374619a60befd4da112ff59a759ea723548e1", [:rebar3], [{:stringprep, "~> 1.0.33", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "26ee2aba3d450464edd4b3ff9dab2c6a53fc20bbfd330a6973982b906504a172"},
"p1_utils": {:hex, :p1_utils, "1.0.29", "e3a8621c2cf5ecde52065b4c6650803e25fdd9462f92dec96f29032a163cbb0d", [:rebar3], [], "hexpm", "2071421cadb5b8fff114e91d4d944f14851c332391f6e93fc5011aad64abe1b9"},
"pkix": {:hex, :pkix, "1.0.10", "d3bfadf7b7cfe2a3636f1b256c9cce5f646a07ce31e57ee527668502850765a0", [:rebar3], [], "hexpm", "e02164f83094cb124c41b1ab28988a615d54b9adc38575f00f19a597a3ac5d0e"},
"sqlite3": {:hex, :sqlite3, "1.1.15", "e819defd280145c328457d7af897d2e45e8e5270e18812ee30b607c99cdd21af", [:rebar3], [], "hexpm", "3c0ba4e13322c2ad49de4e2ddd28311366adde54beae8dba9d9e3888f69d2857"},
"stringprep": {:hex, :stringprep, "1.0.31", "fa1688c156dd271722aa18c423a4163e710d2f4f475ad0bc220910df669b53af", [:rebar3], [{:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "e9699c88e8db16b3a41f0e45ac6874a4da81a6e4854a77d76ede6d09b08e3530"},
"stun": {:hex, :stun, "1.2.17", "c54614a592812ea125a2e6827aac5a438571b591616426ec1419ba9b48252f54", [:rebar3], [{:fast_tls, "1.1.22", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "6b318244c21e8524a9aae3ac9a05cd8234ee994c1c2c815de68d306086ad768d"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
"xmpp": {:hex, :xmpp, "1.10.0", "68a6dff8db8987c4592b2d5dd71d3f947b4ebd15209c9acaca5909a642670630", [:rebar3], [{:ezlib, "~> 1.0.12", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "~> 1.1.19", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "~> 1.1.51", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "~> 6.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "~> 1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "~> 1.0.29", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "ceeae43b8fe97649d8f8546b3f7f2b38ecfc931c0cdd5c7445ffb3f80fcb7d85"},
"yconf": {:hex, :yconf, "1.0.18", "e565edc8aabb8164c3bebc86969095d296ad315dcbb46af65dccbc6c71eae0f6", [:rebar3], [{:fast_yaml, "1.0.37", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "fa950ec6503f92d6417fb8cc1d982403f041697e8e1bbf4d4588fb919b9562ea"},
"stringprep": {:hex, :stringprep, "1.0.34", "b9d592c684e540c4cb867485742635ebc4738925bc28f411302db883baf44a49", [:rebar3], [{:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "27e78ea371881764e056fbe845d3ad304740ff5e3131bc1f38a66f0baa8c9b47"},
"stun": {:hex, :stun, "1.2.22", "bfacc08bd3724968de6d2a4acfa9761232cebef9ff6bd9ff8b000e4bb4ce92a4", [:rebar3], [{:fast_tls, "1.1.26", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "3408b4b11d5237a088f53b260a06940c30b16f4a48094892d6a9204e1643188a"},
"xmpp": {:hex, :xmpp, "1.13.1", "b75831a205a286478aa0dc122b91199ab125e14032e452d1aca4276ee4d44c42", [:rebar3], [{:ezlib, "~> 1.0.16", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "~> 1.1.26", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "~> 1.1.58", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "~> 7.1", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "~> 1.0.29", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "~> 1.0.34", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "a024eef7ccb4f78b9fb52e37d6385a57bdd150be75e50d51bbcbaf39a9ab883d"},
"yconf": {:hex, :yconf, "1.0.23", "1aa5ac72c007b80818ded5b65f76cfc98694b07b2da18202498ec4a4aefe191f", [:rebar3], [{:fast_yaml, "1.0.40", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "25b4dfb75328026acaa774cf5c6fb87d48b55eebce630ddaa3362441dac31437"},
}
+53
View File
@@ -0,0 +1,53 @@
{
"name": "ejabberd",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ejabberd",
"version": "1.0.0",
"hasInstallScript": true,
"dependencies": {
"bootstrap": "^5.3.8",
"jquery": "^4.0.0"
}
},
"node_modules/@popperjs/core": {
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
"license": "MIT",
"peer": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/bootstrap": {
"version": "5.3.8",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz",
"integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/twbs"
},
{
"type": "opencollective",
"url": "https://opencollective.com/bootstrap"
}
],
"license": "MIT",
"peerDependencies": {
"@popperjs/core": "^2.11.8"
}
},
"node_modules/jquery": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz",
"integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==",
"license": "MIT"
}
}
}
+15
View File
@@ -0,0 +1,15 @@
{
"name": "ejabberd",
"version": "1.0.0",
"dependencies": {
"bootstrap": "^5.3.8",
"jquery": "^4.0.0"
},
"scripts": {
"postinstall": "npm run -s clean && npm run -s mkdir-jquery && npm run -s cp-jquery && npm run -s cp-bootstrap",
"clean": "rm -rf priv/mod_invites/static/{jquery,bootstrap}",
"mkdir-jquery": "mkdir -p priv/mod_invites/static/jquery",
"cp-jquery": "cp node_modules/jquery/dist/jquery.min.js priv/mod_invites/static/jquery/jquery.min.js",
"cp-bootstrap": "cp -r node_modules/bootstrap/dist priv/mod_invites/static/bootstrap"
}
}
+4 -1
View File
@@ -131,9 +131,12 @@ ul li #navhead a, ul li #navheadsub a, ul li #navheadsubsub a {
background: #424a55;
color: #fff;
}
#navitemlogin-start {
border-top: 0.2em solid #cae7e4;
}
#navitemlogin {
padding: 0.5em;
border-top: 0.2em solid #cae7e4;
border-bottom: 0.2em solid #cae7e4;
padding-left: 0.5em;
}
+26
View File
@@ -0,0 +1,26 @@
<div class="container mb-0">
<div class="row">
{% for item in apps %}
<div class="card mx-0 mb-3 me-3 client-card {% for platform in item.platforms %}app-platform-{{ platform|lower }} {% endfor %}flex-wrap col-sm-12 col-md-8 col-lg-5">
<div class="row no-gutters h-100">
<div class="col-md-4 pt-2 mt-1">
<img src="{{ static }}/{{ item.image }}" class="p-2 img-fluid" alt="{{ item.alttext }}">
</div>
<div class="col-md-8">
<div class="card-body d-flex flex-column h-100">
<h3 class="card-title text-nowrap mb-1 h5">{{ item.name }}</h3>
<div>
{% for platform in item.platforms %}<span class="badge text-bg-info client-platform-badge client-platform-badge-{{ platform|lower }} me-1 mb-3">{{ platform }}</span>{% endfor %}
</div>
<p class="card-text">{{ item.text }}</p>
<a href="{{ item.proceed_url }}" class="btn btn-primary mt-md-auto" tabindex="{{ forloop.counter|add:2 }}">{% if item.select_text %}{{ item.select_text }}{% else %}{% trans "Select" %}{% endif %}</a>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
<div id="show-all-clients-button-container" class="d-none alert alert-info mb-0">
{% blocktrans with tabidx=apps|length|add:2 %}Showing apps for <span class='platform-name'>your current platform</span> only. You may also <a href='#' id='show-all-clients-button' tabindex="{{ tabidx }}">view all apps.</a>{% endblocktrans %}
</div>
+196
View File
@@ -0,0 +1,196 @@
[
{
"download": {
"buttons": [
{
"image": "{{ static }}/logos/google_ps.png",
"alttext": "{% trans 'Google Play Store Logo' %}",
"url": "https://play.google.com/store/apps/details?id=eu.siacs.conversations",
"magic_link_format": "https://play.google.com/store/apps/details?id=eu.siacs.conversations&referrer={{ uri }}"
},
{
"image": "{{ static }}/logos/fdroid.png",
"alttext": "{% trans 'F-Droid Store Logo' %}",
"url": "https://f-droid.org/en/packages/eu.siacs.conversations/",
"magic_link_format": "https://f-droid.org/packages/eu.siacs.conversations/"
}
]
},
"image": "logos/conversations.svg",
"alttext": "{% trans 'Conversations Logo' %}",
"link": "https://play.google.com/store/apps/details?id=eu.siacs.conversations",
"magic_link_format": "https://play.google.com/store/apps/details?id=eu.siacs.conversations&referrer={{ uri }}",
"name": "Conversations",
"platforms": [
"Android"
],
"supports_preauth_uri": true,
"text": "{% trans 'Conversations is a Jabber/XMPP client for Android 6.0+ smartphones that has been optimized to provide a unique mobile experience.' %}"
},
{
"download": {
"buttons": [
{
"image": "{{ static }}/logos/apple_as.svg",
"alttext": "{% trans 'Apple Store Logo' %}",
"target": "_blank",
"url": "https://apps.apple.com/app/id317711500"
}
]
},
"image": "logos/monal-tmp.svg",
"alttext": "{% trans 'Monal Logo' %}",
"link": "https://monal-im.org/",
"name": "Monal",
"platforms": [
"iOS", "iPadOS"
],
"supports_preauth_uri": true,
"text": "{% trans 'A modern open-source chat client for iPhone and iPad. It is easy to use and has a clean user interface.' %}"
},
{
"download": {
"buttons": [
{
"image": "{{ static }}/logos/apple_as.svg",
"alttext": "{% trans 'Apple Store Logo' %}",
"target": "_blank",
"url": "https://apps.apple.com/app/id1637078500"
}
]
},
"image": "logos/monal-tmp.svg",
"alttext": "{% trans 'Monal Logo' %}",
"link": "https://monal-im.org/",
"name": "Monal (macOS)",
"platforms": [
"macOS"
],
"supports_preauth_uri": true,
"text": "{% trans 'A modern open-source chat client for Mac. It is easy to use and has a clean user interface.' %}"
},
{
"download": {
"buttons": [
{
"image": "{{ static }}/logos/google_ps.png",
"alttext": "{% trans 'Google Play Store Logo' %}",
"url": "https://play.google.com/store/apps/details?id=org.yaxim.androidclient",
"magic_link_format": "https://play.google.com/store/apps/details?id=org.yaxim.androidclient&referrer={{ uri }}"
}
]
},
"image": "logos/yaxim.svg",
"link": "https://play.google.com/store/apps/details?id=org.yaxim.androidclient",
"magic_link_format": "https://play.google.com/store/apps/details?id=org.yaxim.androidclient&referrer={{ uri }}",
"name": "yaxim",
"platforms": [
"Android"
],
"supports_preauth_uri": true,
"text": "{% trans 'A lean Jabber/XMPP client for Android. It aims at usability, low overhead and security, and works on low-end Android devices starting with Android 4.0.' %}"
},
{
"download": {
"buttons": [
{
"image": "{{ static }}/logos/apple_as.svg",
"alttext": "{% trans 'Apple Store Logo' %}",
"target": "_blank",
"url": "https://apps.apple.com/us/app/siskin-im/id1153516838"
}
]
},
"image": "logos/siskin-im.svg",
"alttext": "{% trans 'Siskin IM Logo' %}",
"link": "https://apps.apple.com/us/app/siskin-im/id1153516838",
"name": "Siskin IM",
"platforms": [
"iOS", "iPadOS"
],
"supports_preauth_uri": true,
"text": "{% trans 'A lightweight and powerful XMPP client for iPhone and iPad. It provides an easy way to talk and share moments with your friends.' %}"
},
{
"download": {
"buttons": [
{
"target": "_blank",
"text": "{% trans 'Download from Mac App Store' %}",
"url": "https://apps.apple.com/us/app/beagle-im/id1445349494"
}
]
},
"image": "logos/beagle-im.svg",
"alttext": "{% trans 'Beagle IM Logo' %}",
"link": "https://apps.apple.com/us/app/beagle-im/id1445349494",
"name": "Beagle IM",
"platforms": [
"macOS"
],
"setup": {
"text": "{% trans 'Launch Beagle IM, and select \'Yes\' to add a new account. Click the \'+\' button under the empty account list and then enter your credentials.' %}"
},
"text": "{% trans 'Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.' %}"
},
{
"download": {
"buttons": [
{
"target": "_blank",
"text": "{% trans 'Download Dino for Linux' %}",
"url": "https://dino.im/#download"
}
],
"text": "{% trans 'Click the button to open the Dino website where you can download and install it on your PC.' %}"
},
"image": "logos/dino.svg",
"alttext": "{% trans 'Dino Logo' %}",
"link": "https://dino.im/",
"name": "Dino",
"platforms": [
"Linux"
],
"text": "{% trans 'A modern open-source chat client for the desktop. It focuses on providing a clean and reliable Jabber/XMPP experience while having your privacy in mind.' %}"
},
{
"download": {
"buttons": [
{
"target": "_blank",
"text": "{% trans 'Download Gajim' %}",
"url": "https://gajim.org/download/"
}
]
},
"image": "logos/gajim.svg",
"alttext": "{% trans 'Gajim Logo' %}",
"link": "https://gajim.org/",
"name": "Gajim",
"platforms": [
"Windows",
"Linux",
"macOS"
],
"text": "{% trans 'A fully-featured desktop chat client for Windows and Linux.' %}"
},
{
"download": {
"buttons": [
{
"target": "_blank",
"text": "{% trans 'Download Renga for Haiku' %}",
"url": "https://depot.haiku-os.org/#!/pkg/renga?bcguid=bc233-PQIA"
}
]
},
"image": "logos/renga.svg",
"alttext": "{% trans 'Renga Logo' %}",
"link": "https://pulkomandy.tk/projects/renga",
"name": "Renga",
"platforms": [
"Haiku"
],
"text": "{% trans 'XMPP client for Haiku' %}"
}
]
+41
View File
@@ -0,0 +1,41 @@
{% extends "base_min.html" %}
{% block rel_alternate %}<link rel="alternate" href="{{ uri }}">{% endblock %}
{% block qr_button %}
<div id="qr-button-container" class="float-end w-25 border border-info p-3 ms-3 d-none">
{% trans "<strong>Tip:</strong> You can open this invite on your mobile device by scanning a barcode with your camera." %}
<button id="qr-modal-show" class="mt-2 mx-auto d-block btn btn-info" title="{% trans "Send this invite to your device" %}"
data-bs-toggle="modal" data-bs-target="#qr-modal" tabindex="1">
{% trans "Scan with mobile device" %}
</button>
</div>
{% endblock %}
{% block qr_code %}
<div class="modal" tabindex="-1" role="dialog" id="qr-modal">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title h5">{% trans "Scan invite code" %}</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>{% trans "You can transfer this invite to your mobile device by scanning a code with your camera." %}</p>
<div id="qr-info-url" class="tab-pane show active">
<p>{% trans "Use a <em>QR code</em> scanner on your mobile device to scan the code below:" %}</p>
<div id="qr-invite-page" class="bg-light mx-auto"></div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal" tabindex="2">{% trans "Close" %}</button>
</div>
</div>
</div>
</div>
{% endblock %}
{% block extra_scripts %}
<script src="{{ static }}/qrcode.min.js" integrity="sha384-XfbBihCQqSDyejklP5yun2CbVxqR+2eNfx0Fhx5pQAfN5ypWGhSBjXaXr5g6X4DE"></script>
<script src="{{ static }}/platform.min.js" integrity="sha384-nziKWRrD67nso9WErLVLhgT7AobHh6aYfNgqgINmJrtZ92V9aNTaOpvDFkcneToL"></script>
{% endblock %}
+30
View File
@@ -0,0 +1,30 @@
<!DOCTYPE html>
<html lang="{{ lang }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}{% trans "Invite" %} | {{ site_name }}{% endblock %}</title>
{% block rel_alternate %}{% endblock %}
<link rel="stylesheet" href="{{ static }}/bootstrap/css/bootstrap.min.css" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB">
<link rel="icon" type="image/png" sizes="32x32" href="{{ static }}/favicon.png">
<meta name="msapplication-TileColor" content="#4acac3">
<meta name="theme-color" content="#4acac3">
<link rel="stylesheet" href="{{ static }}/invite.css" integrity="sha384-k6usDEL8f5OYugdzmHwAlWjdQA/YkOZre60c604zXvE9fSJpptDg2jzE2PaQ5/c+">
</head>
<body>
<div id="form" class="{% block form_class %}container col-md-10 col-md-offset-1 col-sm-8 col-sm-offset-2 col-lg-10 col-lg-offset-1 my-3 mt-md-5{% endblock %}">
<div class="card rounded-2 shadow">
<h1 class="card-header">{%block h1 %}{% blocktrans %}Invite to {{ site_name }}{% endblocktrans %}{% endblock %}</h1>
<div class="card-body">
{% block qr_button %}{% endblock %}
{% block content %}{% endblock %}
</div>
</div>
</div>
{% block qr_code %}{% endblock %}
{% block extra_scripts %}{% endblock %}
<script src="{{ static }}/jquery/jquery.min.js" integrity="sha384-fgGyf7Mo7DURSOMnOy7ed+dkq5Job205Gnzu6QIg0BOHKaqt4D76Dt8VlDCzcMHV"></script>
<script src="{{ static }}/bootstrap/js/bootstrap.min.js" integrity="sha384-G/EV+4j2dNv+tEPo3++6LCgdCROaejBqfUeNjuKAiuXbjrxilcCdDz6ZAVfHWe1Y"></script>
<script src="{{ static }}/invite.js" integrity="sha384-ov8LmXw6nEmT+QvXBRPMol0e90WFX9ZysvQudQ7H+nYDyolH4K/+GKJhq7qmTk4T"></script>
</body>
</html>
+72
View File
@@ -0,0 +1,72 @@
{% extends "base.html" %}
{% block title %}{% trans "Create Account" %} | {{ app.name }} | {{ site_name }}{% endblock %}
{% block h1 %}{% blocktrans with app_name=app.name %}Join {{ site_name }} with {{ app_name }}{% endblocktrans %}{% endblock %}
{% block content %}
<p>{% if invite.inviter|user %}
{% blocktrans with inviter=invite.inviter|user %}You have been invited to chat with <strong>{{ inviter }}</strong> on {{ site_name }}, part of the XMPP secure and decentralized messaging network.{% endblocktrans %}
{% else %}
{% blocktrans %}You have been invited to chat on {{ site_name }}, part of the XMPP secure and decentralized messaging network.{% endblocktrans %}
{% endif %}</p>
<div class="bd-callout bd-callout-info col-12 col-md-8">
<svg class="svg-inline--fa fa-lightbulb fa-w-11 text-warning" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="lightbulb" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512" data-fa-i2svg=""><path fill="currentColor" d="M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0 0 26.64 14.28h61.71a31.99 31.99 0 0 0 26.64-14.28l17.09-25.69a31.989 31.989 0 0 0 5.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z"></path></svg>
{% blocktrans with app_name=app.name %}You can start chatting right away with {{ app_name }}. Let's get started!{% endblocktrans %}
</div>
<div class="card client-card {% for item in app.platforms %}app-platform-{{ item|lower }} {% endfor %} flex-wrap col-sm-12 col-md-8 col-lg-5 p-3 my-3">
<div class="row no-gutters h-100">
<div class="col-md-4">
<img src="{{ static }}/{{ app.image }}" class="img-fluid" alt="{{ app.alttext }}">
</div>
<div class="col-md-8 h-100 ps-md-1">
<div class="card-body d-flex flex-column h-100 pb-0 p-md-0">
<h3 class="card-title text-nowrap mb-1 h5">{{ app.name }}</h3>
<div>
{% for item in app.platforms %}<span class="badge text-bg-info client-platform-badge client-platform-badge-{{ item|lower }} me-1 mb-3">{{ item }}</span> {% endfor %}
</div>
<p class="card-text">{{ app.text }}</p>
</div>
</div>
</div>
</div>
<h2 class="h3 alert alert-info p-2" clear-both">{% blocktrans with app_name=app.name %}Step 1: Install {{ app_name }}{% endblocktrans %}</h2>
<p>{% if app.download.text %}{{ app.download.text }}{% else %}{% blocktrans with app_name=app.name %}Download and install {{ app_name }} below:{% endblocktrans %}{% endif %}</p>
<div class="ms-5">
{% for button in app.download.buttons %}
{% if button.image %}
<a href="{% if button.magic_link %}{{ button.magic_link }}{% else %}{{ button.url }}{% endif %}" {% if button.target %}target="{{ button.target }}"{% endif %} rel="noopener" tabindex="3">
<img src="{{ button.image }}" {% if button.alttext %}alt="{{ button.alttext }}"{% endif %} class="invite-download-button">
</a>
{% endif %}
{% if button.text %}
<a href="{{ button.url }}" {% if button.target %}target="{{ button.target }}"{% endif %} class="btn btn-primary" rel="noopener" tabindex="4">
{{ button.text }}
</a>
{% endif %}
{% endfor %}
</div>
<p class="mt-3">{% blocktrans with app_name=app.name %}After successfully installing {{ app_name }}, come back to this page and <strong>continue with Step 2</strong>.{% endblocktrans %}</p>
<h2 class="h3 alert alert-info p-2">{% trans "Step 2: Activate your account" %}</h2>
<p>{% trans "Installed ok? Great! <strong>Click or tap the button below</strong> to accept your invite and continue with your account setup:" %}</p>
<div class="w-100 text-center text-md-start">
<a href="{{ uri }}" id="uri-cta" class="btn btn-success ms-md-5 mt-1 mb-3" tabindex="5">{% blocktrans with app_name=app.name %}Accept invite using {{ app_name }}{% endblocktrans %}</a><br/>
</div>
<p>{% blocktrans with app_name=app.name %}After clicking the button you will be taken to {{ app_name }} to finish setting up your new {{ site_name }} account.{% endblocktrans %}</p>
<nav aria-label="{% trans 'Page navigation' %}">
<ul class="pagination mb-0">
<li class="page-item"><a tabindex="6" class="page-link" href="/{{ base }}/{{ token }}" aria-label="{% trans 'Previous' %}">
<span aria-hidden="true">&laquo;</span>
<span>{% trans "Previous" %}</span>
</a></li>
</ul>
</nav>
{% endblock %}
+19
View File
@@ -0,0 +1,19 @@
The file static/illus-empty.svg is included under the following
license:
Copyright 2020 Katerina Limpitsouni
All images, assets and vectors published on unDraw can be used for free.
You can use them for noncommercial and commercial purposes. You do not
need to ask permission from or provide credit to the creator or unDraw.
More precisely, unDraw grants you an nonexclusive, worldwide copyright
license to download, copy, modify, distribute, perform, and use the
assets provided from unDraw for free, including for commercial purposes,
without permission from or attributing the creator or unDraw. This
license does not include the right to compile assets, vectors or images
from unDraw to replicate a similar or competing service, in any form or
distribute the assets in packs or otherwise. This extends to automated
and non-automated ways to link, embed, scrape, search or download the
assets included on the website without our consent.
+16
View File
@@ -0,0 +1,16 @@
{% extends "base.html" %}
{% block title %}{% trans "Create Account" %} | {{ site_name }}{% endblock %}
{% block content %}
<p>{% if invite.inviter|user %}
{% blocktrans with inviter=invite.inviter|user %}You have been invited to chat with <strong>{{ inviter }}</strong> on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.{% endblocktrans %}
{% else %}
{% blocktrans %}You have been invited to chat on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.{% endblocktrans %}
{% endif %}</p>
<h2 class="card-title h5 clear-both">{% trans "Get started" %}</h2>
<p>{% trans "To get started, you need to install an app for your platform:" %}</p>
{% include "apps.html" %}
<h2 class="h5 mt-3">{% trans "Other software" %}</h2>
<p id="other-software" class="mb-0">{% blocktrans with tabidx=apps|length|add:3 %}You can connect to {{ site_name }} using any XMPP-compatible software. If your preferred software is not listed above, you may still <a href="{{ registration_url }}" tabindex='{{ tabidx }}'>register an account manually</a>.{% endblocktrans %}</p>
{% endblock %}
+10
View File
@@ -0,0 +1,10 @@
{% extends "base_min.html" %}
{% block title %}{% trans "Invite Expired" %} | {{ site_name }}{% endblock %}
{% block form_class %}container col-md-8 col-md-offset-2 col-sm-8 cold-sm-offset-2 col-lg-6 col-lg-offset-3 my-3 mt-md-5{% endblock %}
{% block content %}
<h2 class="card-title h5">{% trans "Invite expired" %}</h2>
<p>{% trans "Sorry, it looks like this invite code has expired!" %}</p>
<img class="w-100" alt="{% trans "Sad person holding empty box" %}" src="{{ static }}/illus-empty.svg">
{% endblock %}
+72
View File
@@ -0,0 +1,72 @@
{% extends "base_min.html" %}
{% block title %}{% if error %}{% trans "Registration Error" %}{% else %}{% trans "Registration Form" %}{% endif %} | {{ site_name }}{% endblock %}
{% block h1 %}{% if error %}{% trans "Registration Error" %}{% else %}{% blocktrans %}Register on {{ site_name }}{% endblocktrans %}{% endif %}{% endblock %}
{% block form_class %}container col-md-8 col-md-offset-2 col-sm-8 cold-sm-offset-2 col-lg-6 col-lg-offset-3 my-3 mt-md-5{% endblock %}
{% block content %}
<p>{% if app %}{% blocktrans with app_name=app.name %}<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting using <strong>{{ app_name }}</strong> you need to first register an account.{% endblocktrans %}{% else %}{% blocktrans %}<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting you need to first register an account.{% endblocktrans %}{% endif %}</p>
<p>{%if invite.inviter %}{% blocktrans with inviter=invite.inviter|user %}Creating an account will allow to communicate with <strong>{{ inviter }}</strong> and other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.{% endblocktrans %}{% else %}{% blocktrans %}Creating an account will allow to communicate with other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.{% endblocktrans %}{% endif %}</p>
{% if app %}{% if app.supports_preauth_uri %}
<div class="alert alert-info">
<p>{% blocktrans with app_name=app.name %}If you already have {{ app_name }} installed, we recommend that you continue the account creation process using the app by clicking on the button below:{% endblocktrans %}</p>
<p class="text-center h6">{% blocktrans with app_name=app.name %}{{ app_name }} already installed?{% endblocktrans %}</p>
<div class="text-center">
<a href="{{ uri }}"><button class="btn btn-secondary btn-sm">{% trans "Open the app" %}</button></a><br/>
<small class="text-muted">{% trans "This button works only if you have the app installed already!" %}</small>
</div>
<br/>
</div>
{% endif %}{% endif %}
<h2 class="card-title h5">{% trans "Create an account" %}</h2>
{%if error and error.class == 'undefined' %}<div class="alert alert-danger" role="alert">{{ error.text }}</div>{% endif %}
<form method="post" class="needs-validation" novalidate>
<div class="input-group mb-3">
<label for="user" class="col-md-4 col-lg-12 form-label fw-bold">{% trans "Username" %}:</label>
<div class="col-md-8 col-lg-12">
<div class="input-group">
<input
type="text" name="user" class="form-control {% if error.class == 'username' %}is-invalid{% endif %}" aria-describedby="usernameHelp" tabindex="1"
required autofocus minlength="1" maxlength="30" length="30"{% if username %} value="{{ username }}"{% endif %}>
<div class="input-group-append">
<span class="input-group-text">@{{ domain }}</span>
</div>
<div class="invalid-feedback">
{% if error.class == 'username' %}{{ error.text }}{% else %}
{% blocktrans %}Please provide a valid username!{% endblocktrans %}{% endif %}
</div>
</div>
<small id="usernameHelp" class="d-block form-text text-muted">{% trans "Choose a username, this will become the first part of your new chat address." %}</small>
</div>
</div>
<div class="input-group mb-3">
<label for="password" class="col-md-4 col-lg-12 form-label col-form-label fw-bold">{% trans "Password" %}:</label>
<div class="col-md-8 col-lg-12">
<input type="password" name="password" class="form-control {% if error.class == 'password' %}is-invalid{% endif %}" aria-describedby="passwordHelp" tabindex="2"
autocomplete="new-password" required minlength="{{ password_min_length }}">
<div class="invalid-feedback">
{% if error.class == 'password' %}{{ error.text }}{% else %}
{% blocktrans %}Please provide a password! Minimum length: {{ password_min_length }}{% endblocktrans %}{% endif %}
</div>
<small id="passwordHelp" class="form-text text-muted">{% trans "Enter a secure password that you do not use anywhere else." %}</small>
</div>
</div>
<div>
<input type="hidden" name="token" value="{{ token }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
{% if app %}<input type="hidden" name="app_id" value="{{ app.id }}">{% endif %}
<button type="submit" tabindex="3" class="btn btn-primary float-end">{% trans "Submit" %}</button>
</div>
</form>
<nav aria-label="{% trans 'Page navigation' %}">
<ul class="pagination mt-3 mb-0">
<li class="page-item"><a tabindex="4" class="page-link" href="/{{ base }}/{{ token }}" aria-label="{% trans 'Previous' %}">
<span aria-hidden="true">&laquo;</span>
<span>{% trans "Previous" %}</span>
</a></li>
</ul>
</nav>
{% endblock %}
+7
View File
@@ -0,0 +1,7 @@
{% extends "base_min.html" %}
{% block form_class %}container col-md-8 col-md-offset-2 col-sm-8 cold-sm-offset-2 col-lg-6 col-lg-offset-3 my-3 mt-md-5{% endblock %}
{% block content %}
<h2 class="card-title h5">{% trans "Registration error" %}</h2>
<p>{% if message %}{{ message }}{% else %}{% trans "Sorry, there was a problem registering your account." %}{% endif %}</p>
{% endblock%}
+84
View File
@@ -0,0 +1,84 @@
{% extends "base_min.html" %}
{% block form_class %}container col-md-8 col-md-offset-2 col-sm-8 cold-sm-offset-2 col-lg-6 col-lg-offset-3 my-3 mt-md-5{% endblock %}
{% block title %}{% trans "Registration Success" %} | {{site_name}}{% endblock %}
{% block h1 %}{{site_name}}{% endblock %}
{% block content %}
<h2 class="card-title h5">{% trans "Congratulations!" %}</h2>
<p>{% blocktrans %}You have created an account on <strong>{{ site_name }}</strong>.{% endblocktrans %}</p>
<p>{% trans "To start chatting, you need to enter your new account credentials into your chosen XMPP software." %}</p>
{% if webchat_url %}
<div class="bd-callout bd-callout-info col-12">
<div class="container">
<div class="row">
<div class="col-12 col-md-9">
<svg class="svg-inline--fa fa-lightbulb fa-w-11 text-warning" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="lightbulb" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512" data-fa-i2svg=""><path fill="currentColor" d="M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0 0 26.64 14.28h61.71a31.99 31.99 0 0 0 26.64-14.28l17.09-25.69a31.989 31.989 0 0 0 5.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z"></path></svg> {% trans "<strong>No suitable software installed right now?</strong> You can also log in to your account through our online web chat!" %}
</div>
<div class="col text-end mt-3 mt-md-0">
<a class="btn btn-primary" href="{{ webchat_url }}" target="_blank" noopener>{% trans "Log in via web" %}</a>
</div>
</div>
</div>
</div>
{% endif %}
{% if app %}
<p>{% blocktrans with app_name=app.name %}You can now set up {{ app_name }} and connect it to your new account.{% endblocktrans %}</p>
<h2 class="h5 alert alert-info p-2">{% blocktrans with app_name=app.name %}Step 1: Download and install {{ app_name }}{% endblocktrans %}</h2>
<p>{% if app.download.text %}{{ app.download.text }}{% else %}{% blocktrans with app_name=app.name %}Download and install {{ app_name }} below:{% endblocktrans %}{% endif %}</p>
<div class="ms-5 mb-3">
{% for item in app.download.buttons %}
{% if item.image %}
<a href="{{ item.url }}" {%if item.target %}target="{{ item.target }}"{% endif %} rel="noopener">
<img src="{{ item.image }}" {% if item.alttext %}alt="{{ item.alttext }}"{% endif %}>
</a>
{% endif %}
{%if item.text %}
<a href="{{item.url}}" {% if item.target %}target="{{ item.target }}"{% endif %} rel="noopener">
<button class="btn btn-primary">
{{ item.text }}
</button>
</a>
{% endif %}
{% endfor %}
</div>
<h2 class="h5 alert alert-info p-2">{% blocktrans with app_name=app.name %}Step 2: Connect {{ app_name }} to your new account{% endblocktrans %}</h2>
<p>{% if app.setup.text %}{{ app.setup.text }}{% else %}{% blocktrans with app_name=app.name %}Launch {{ app_name }} and sign in using your account credentials.{% endblocktrans %}{% endif %}</p>
{% endif %}
<p>{% trans "As a final reminder, your account details are shown below:" %}</p>
<form class="account-details col-12 mx-auto">
<div class="input-group">
<label for="user" class="col-md-4 col-form-label fw-bold">{% trans "Chat address (JID)" %}:</label>
<div class="col-md-8 col-12">
<input type="text" class="form-control-plaintext" readonly value="{{ username }}@{{ domain }}">
</div>
</div>
{% if password %}
<div class="input-group">
<label for="password" class="col-md-4 col-12 col-form-label fw-bold">{% trans "Password" %}:</label>
<div class="col-md-8 col-12">
<div class="input-group">
<input type="password" readonly disabled aria-label="{% trans "Password" %}" class="form-control" value="{{ password }}">
<div class="input-group-append">
<button id="toggle-pw-button" class="btn btn-outline-secondary rounded-start-0" type="button"
data-text-show="{% trans "Show" %}" data-text-hide="{% trans "Hide" %}">{% trans "Show" %}</button>
</div>
</div>
</div>
</div>
{% endif %}
</form>
{% if password %}
<p class="mt-3">{% trans "Your password is stored encrypted on the server and will not be accessible after you close this page. Keep it safe and never share it with anyone." %}</p>
{% endif %}
{% endblock %}
+18
View File
@@ -0,0 +1,18 @@
{% extends "base.html" %}
{% block title %}{% trans "Add Contact" %} | {{ site_name }}{% endblock %}
{% block h1 %}{% blocktrans with inviter=invite.inviter|user %}{{ inviter }} has invited you to connect!{% endblocktrans %}{% endblock %}
{% block content %}
<div class="col-12 col-md-8">
{% blocktrans with inviter=invite.inviter|jid %}This is an invite from <strong>{{ inviter }}</strong> to connect and chat on the XMPP network. If you already have an XMPP client installed just press the button below!{% endblocktrans %}
<div class="text-center">
<a href="{{ invite.uri }}" class="btn btn-success my-3" tabindex="3">{% blocktrans with inviter=invite.inviter|user %}Add {{ inviter }} to your contact list{% endblocktrans %}</a><br/>
</div>
</div>
<div class="bd-callout bd-callout-info col-12 col-md-8 mb-3">
<svg class="svg-inline--fa fa-lightbulb fa-w-11 text-warning" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="lightbulb" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512" data-fa-i2svg=""><path fill="currentColor" d="M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0 0 26.64 14.28h61.71a31.99 31.99 0 0 0 26.64-14.28l17.09-25.69a31.989 31.989 0 0 0 5.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z"></path></svg>
<strong class="text-warning-emphasis">{% trans 'Hint' %}:</strong> {% trans "If you don't have an XMPP client installed yet, here's a list of suitable clients for your platform." %}
</div>
{% include "apps.html" %}
{% endblock %}
Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 34 KiB

+53
View File
@@ -0,0 +1,53 @@
#qr-invite-page{
width: 256px;
}
.invite-download-button {
max-width: 160px;
}
.clear-both {
clear: both;
}
.bd-callout {
padding: 1.25rem;
margin-top: 1.25rem;
margin-bottom: 1.25rem;
background-color: var(--bd-callout-bg, var(--bs-gray-100));
border-left:0.25rem solid var(--bd-callout-border, var(--bs-gray-300))
}
.bd-callout h4 {
margin-bottom:.25rem
}
.bd-callout > :last-child {
margin-bottom:0
}
.bd-callout + .bd-callout {
margin-top:-.25rem
}
.bd-callout .highlight {
background-color:rgba(0, 0, 0, 0.05)
}
.bd-callout-info {
--bd-callout-bg: rgba(var(--bs-info-rgb), .075);
--bd-callout-border: rgba(var(--bs-info-rgb), .5)
}
.bd-callout-warning {
--bd-callout-bg: rgba(var(--bs-warning-rgb), .075);
--bd-callout-border: rgba(var(--bs-warning-rgb), .5)
}
.bd-callout-danger {
--bd-callout-bg: rgba(var(--bs-danger-rgb), .075);
--bd-callout-border: rgba(var(--bs-danger-rgb), .5)
}
.fa-w-11 {
width: .6875em;
}
.fa-w-16 {
widht: 1em;
}
.svg-inline--fa {
display: inline-block;
font-size: inherit;
height: 1em;
overflow: visible;
vertical-align: -.125em;
}
+141
View File
@@ -0,0 +1,141 @@
(function () {
document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'));
// If QR lib loaded ok, show QR button on desktop devices
if (window.QRCode) {
const qrcode_opts = {
text: document.location.href,
addQuietZone: true
};
new QRCode(document.getElementById("qr-invite-page"), qrcode_opts);
document.getElementById('qr-button-container').classList.add("d-md-block");
}
const toggle_pw_button = document.getElementById('toggle-pw-button');
if (toggle_pw_button)
toggle_pw_button.addEventListener('click', toggle_password);
// Detect current platform and show/hide appropriate clients
if (window.platform) {
let platform_friendly = null;
let platform_classname = null;
switch (platform.os.family) {
case "Ubuntu":
case "Linux":
case "Fedora":
case "Red Hat":
case "SuSE":
platform_friendly = platform.os.family + " (Linux)";
platform_classname = "linux";
break;
case "Linux aarch64":
platform_friendly = "Linux mobile";
platform_classname = "linux";
break;
case "Haiku R1":
platform_friendly = "Haiku";
platform_classname = "haiku";
break;
case "Windows Phone":
platform_friendly = "Windows Phone";
platform_classname = "windows-phone";
break;
case "OS X":
if (navigator.maxTouchPoints > 1) {
// looks like iPad to me!
platform_friendly = "iPadOS";
platform_classname = "ipados";
} else {
platform_friendly = "macOS";
platform_classname = "macos";
}
break;
default:
if (platform.os.family.startsWith("Windows")) {
platform_friendly = "Windows";
platform_classname = "windows";
} else {
platform_friendly = platform.os.family;
platform_classname = platform_friendly.toLowerCase();
}
}
if (platform_friendly && platform_classname) {
if (document.querySelectorAll('.client-card .client-platform-badge-' + platform_classname).length == 0) {
const badges = document.querySelectorAll('.client-card .client-platform-badge');
for (let badge of badges) {
badge.classList.add("text-bg-secondary");
badge.classList.remove("text-bg-info");
}
// No clients recognised for this platform, do nothing
return;
}
// Hide clients not for this platform
const client_cards = document.getElementsByClassName('client-card');
for (let card of client_cards) {
if (card.classList.contains('app-platform-' + platform_classname))
card.classList.add('supported-platform');
else if (!card.classList.contains('app-platform-web'))
card.hidden = true;
const badges = card.querySelectorAll('.client-platform-badge');
let has_platform = false;
for (let badge of badges) {
if (badge.classList.contains('client-platform-badge-' + platform_classname)) {
badge.classList.add("text-bg-success");
badge.classList.remove("text-bg-info");
has_platform = true;
} else {
badge.classList.add("text-bg-secondary");
badge.classList.remove("text-bg-info");
}
}
if (!has_platform)
$(card).find("a.btn").removeClass("btn-primary").addClass("btn-secondary");
}
const show_all_clients_button_container = document.getElementById('show-all-clients-button-container');
if (show_all_clients_button_container) {
show_all_clients_button_container.querySelector('.platform-name').innerHTML = platform_friendly;
show_all_clients_button_container.classList.remove("d-none");
document.getElementById('show-all-clients-button').addEventListener('click', function (e) {
for (let card of client_cards)
card.hidden = false;
show_all_clients_button_container.hidden = true;
e.preventDefault();
});
}
}
}
})();
function toggle_password(e) {
var button = e.target;
var input = button.parentNode.parentNode.querySelector("input");
switch (input.attributes.type.value) {
case "password":
input.attributes.type.value = "text";
button.innerText = button.getAttribute('data-text-hide');
break;
case "text":
input.attributes.type.value = "password";
button.innerText = button.getAttribute('data-text-show');
break;
}
}
(function () {
'use strict';
window.addEventListener('load', function () {
// Fetch all the forms we want to apply custom Bootstrap validation styles to
var forms = document.getElementsByClassName('needs-validation');
// Loop over them and prevent submission
var validation = Array.prototype.filter.call(forms, function (form) {
form.addEventListener('submit', function (event) {
if (form.checkValidity() === false) {
event.preventDefault();
event.stopPropagation();
}
form.classList.add('was-validated');
}, false);
});
}, false);
})();
@@ -0,0 +1,46 @@
<svg id="livetype" xmlns="http://www.w3.org/2000/svg" width="119.66407" height="40" viewBox="0 0 119.66407 40">
<title>Download_on_the_App_Store_Badge_US-UK_RGB_blk_4SVG_092917</title>
<g>
<g>
<g>
<path d="M110.13477,0H9.53468c-.3667,0-.729,0-1.09473.002-.30615.002-.60986.00781-.91895.0127A13.21476,13.21476,0,0,0,5.5171.19141a6.66509,6.66509,0,0,0-1.90088.627A6.43779,6.43779,0,0,0,1.99757,1.99707,6.25844,6.25844,0,0,0,.81935,3.61816a6.60119,6.60119,0,0,0-.625,1.90332,12.993,12.993,0,0,0-.1792,2.002C.00587,7.83008.00489,8.1377,0,8.44434V31.5586c.00489.3105.00587.6113.01515.9219a12.99232,12.99232,0,0,0,.1792,2.0019,6.58756,6.58756,0,0,0,.625,1.9043A6.20778,6.20778,0,0,0,1.99757,38.001a6.27445,6.27445,0,0,0,1.61865,1.1787,6.70082,6.70082,0,0,0,1.90088.6308,13.45514,13.45514,0,0,0,2.0039.1768c.30909.0068.6128.0107.91895.0107C8.80567,40,9.168,40,9.53468,40H110.13477c.3594,0,.7246,0,1.084-.002.3047,0,.6172-.0039.9219-.0107a13.279,13.279,0,0,0,2-.1768,6.80432,6.80432,0,0,0,1.9082-.6308,6.27742,6.27742,0,0,0,1.6172-1.1787,6.39482,6.39482,0,0,0,1.1816-1.6143,6.60413,6.60413,0,0,0,.6191-1.9043,13.50643,13.50643,0,0,0,.1856-2.0019c.0039-.3106.0039-.6114.0039-.9219.0078-.3633.0078-.7246.0078-1.0938V9.53613c0-.36621,0-.72949-.0078-1.09179,0-.30664,0-.61426-.0039-.9209a13.5071,13.5071,0,0,0-.1856-2.002,6.6177,6.6177,0,0,0-.6191-1.90332,6.46619,6.46619,0,0,0-2.7988-2.7998,6.76754,6.76754,0,0,0-1.9082-.627,13.04394,13.04394,0,0,0-2-.17676c-.3047-.00488-.6172-.01074-.9219-.01269-.3594-.002-.7246-.002-1.084-.002Z" style="fill: #a6a6a6"/>
<path d="M8.44483,39.125c-.30468,0-.602-.0039-.90429-.0107a12.68714,12.68714,0,0,1-1.86914-.1631,5.88381,5.88381,0,0,1-1.65674-.5479,5.40573,5.40573,0,0,1-1.397-1.0166,5.32082,5.32082,0,0,1-1.02051-1.3965,5.72186,5.72186,0,0,1-.543-1.6572,12.41351,12.41351,0,0,1-.1665-1.875c-.00634-.2109-.01464-.9131-.01464-.9131V8.44434S.88185,7.75293.8877,7.5498a12.37039,12.37039,0,0,1,.16553-1.87207,5.7555,5.7555,0,0,1,.54346-1.6621A5.37349,5.37349,0,0,1,2.61183,2.61768,5.56543,5.56543,0,0,1,4.01417,1.59521a5.82309,5.82309,0,0,1,1.65332-.54394A12.58589,12.58589,0,0,1,7.543.88721L8.44532.875H111.21387l.9131.0127a12.38493,12.38493,0,0,1,1.8584.16259,5.93833,5.93833,0,0,1,1.6709.54785,5.59374,5.59374,0,0,1,2.415,2.41993,5.76267,5.76267,0,0,1,.5352,1.64892,12.995,12.995,0,0,1,.1738,1.88721c.0029.2832.0029.5874.0029.89014.0079.375.0079.73193.0079,1.09179V30.4648c0,.3633,0,.7178-.0079,1.0752,0,.3252,0,.6231-.0039.9297a12.73126,12.73126,0,0,1-.1709,1.8535,5.739,5.739,0,0,1-.54,1.67,5.48029,5.48029,0,0,1-1.0156,1.3857,5.4129,5.4129,0,0,1-1.3994,1.0225,5.86168,5.86168,0,0,1-1.668.5498,12.54218,12.54218,0,0,1-1.8692.1631c-.2929.0068-.5996.0107-.8974.0107l-1.084.002Z"/>
</g>
<g id="_Group_" data-name="&lt;Group&gt;">
<g id="_Group_2" data-name="&lt;Group&gt;">
<g id="_Group_3" data-name="&lt;Group&gt;">
<path id="_Path_" data-name="&lt;Path&gt;" d="M24.76888,20.30068a4.94881,4.94881,0,0,1,2.35656-4.15206,5.06566,5.06566,0,0,0-3.99116-2.15768c-1.67924-.17626-3.30719,1.00483-4.1629,1.00483-.87227,0-2.18977-.98733-3.6085-.95814a5.31529,5.31529,0,0,0-4.47292,2.72787c-1.934,3.34842-.49141,8.26947,1.3612,10.97608.9269,1.32535,2.01018,2.8058,3.42763,2.7533,1.38706-.05753,1.9051-.88448,3.5794-.88448,1.65876,0,2.14479.88448,3.591.8511,1.48838-.02416,2.42613-1.33124,3.32051-2.66914a10.962,10.962,0,0,0,1.51842-3.09251A4.78205,4.78205,0,0,1,24.76888,20.30068Z" style="fill: #fff"/>
<path id="_Path_2" data-name="&lt;Path&gt;" d="M22.03725,12.21089a4.87248,4.87248,0,0,0,1.11452-3.49062,4.95746,4.95746,0,0,0-3.20758,1.65961,4.63634,4.63634,0,0,0-1.14371,3.36139A4.09905,4.09905,0,0,0,22.03725,12.21089Z" style="fill: #fff"/>
</g>
</g>
<g>
<path d="M42.30227,27.13965h-4.7334l-1.13672,3.35645H34.42727l4.4834-12.418h2.083l4.4834,12.418H43.438ZM38.0591,25.59082h3.752l-1.84961-5.44727h-.05176Z" style="fill: #fff"/>
<path d="M55.15969,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H48.4302v1.50586h.03418a3.21162,3.21162,0,0,1,2.88281-1.60059C53.645,21.34766,55.15969,23.16406,55.15969,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C52.30227,29.01563,53.24953,27.81934,53.24953,25.96973Z" style="fill: #fff"/>
<path d="M65.12453,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H58.395v1.50586h.03418A3.21162,3.21162,0,0,1,61.312,21.34766C63.60988,21.34766,65.12453,23.16406,65.12453,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C62.26711,29.01563,63.21438,27.81934,63.21438,25.96973Z" style="fill: #fff"/>
<path d="M71.71047,27.03613c.1377,1.23145,1.334,2.04,2.96875,2.04,1.56641,0,2.69336-.80859,2.69336-1.91895,0-.96387-.67969-1.541-2.28906-1.93652l-1.60937-.3877c-2.28027-.55078-3.33887-1.61719-3.33887-3.34766,0-2.14258,1.86719-3.61426,4.51855-3.61426,2.624,0,4.42285,1.47168,4.4834,3.61426h-1.876c-.1123-1.23926-1.13672-1.9873-2.63379-1.9873s-2.52148.75684-2.52148,1.8584c0,.87793.6543,1.39453,2.25488,1.79l1.36816.33594c2.54785.60254,3.60645,1.626,3.60645,3.44238,0,2.32324-1.85059,3.77832-4.79395,3.77832-2.75391,0-4.61328-1.4209-4.7334-3.667Z" style="fill: #fff"/>
<path d="M83.34621,19.2998v2.14258h1.72168v1.47168H83.34621v4.99121c0,.77539.34473,1.13672,1.10156,1.13672a5.80752,5.80752,0,0,0,.61133-.043v1.46289a5.10351,5.10351,0,0,1-1.03223.08594c-1.833,0-2.54785-.68848-2.54785-2.44434V22.91406H80.16262V21.44238H81.479V19.2998Z" style="fill: #fff"/>
<path d="M86.065,25.96973c0-2.84863,1.67773-4.63867,4.29395-4.63867,2.625,0,4.29492,1.79,4.29492,4.63867,0,2.85645-1.66113,4.63867-4.29492,4.63867C87.72609,30.6084,86.065,28.82617,86.065,25.96973Zm6.69531,0c0-1.9541-.89551-3.10742-2.40137-3.10742s-2.40039,1.16211-2.40039,3.10742c0,1.96191.89453,3.10645,2.40039,3.10645S92.76027,27.93164,92.76027,25.96973Z" style="fill: #fff"/>
<path d="M96.18606,21.44238h1.77246v1.541h.043a2.1594,2.1594,0,0,1,2.17773-1.63574,2.86616,2.86616,0,0,1,.63672.06934v1.73828a2.59794,2.59794,0,0,0-.835-.1123,1.87264,1.87264,0,0,0-1.93652,2.083v5.37012h-1.8584Z" style="fill: #fff"/>
<path d="M109.3843,27.83691c-.25,1.64355-1.85059,2.77148-3.89844,2.77148-2.63379,0-4.26855-1.76465-4.26855-4.5957,0-2.83984,1.64355-4.68164,4.19043-4.68164,2.50488,0,4.08008,1.7207,4.08008,4.46582v.63672h-6.39453v.1123a2.358,2.358,0,0,0,2.43555,2.56445,2.04834,2.04834,0,0,0,2.09082-1.27344Zm-6.28223-2.70215h4.52637a2.1773,2.1773,0,0,0-2.2207-2.29785A2.292,2.292,0,0,0,103.10207,25.13477Z" style="fill: #fff"/>
</g>
</g>
</g>
<g id="_Group_4" data-name="&lt;Group&gt;">
<g>
<path d="M37.82619,8.731a2.63964,2.63964,0,0,1,2.80762,2.96484c0,1.90625-1.03027,3.002-2.80762,3.002H35.67092V8.731Zm-1.22852,5.123h1.125a1.87588,1.87588,0,0,0,1.96777-2.146,1.881,1.881,0,0,0-1.96777-2.13379h-1.125Z" style="fill: #fff"/>
<path d="M41.68068,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C44.57522,13.99463,45.01369,13.42432,45.01369,12.44434Z" style="fill: #fff"/>
<path d="M51.57326,14.69775h-.92187l-.93066-3.31641h-.07031l-.92676,3.31641h-.91309l-1.24121-4.50293h.90137l.80664,3.436h.06641l.92578-3.436h.85254l.92578,3.436h.07031l.80273-3.436h.88867Z" style="fill: #fff"/>
<path d="M53.85354,10.19482H54.709v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915h-.88867V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
<path d="M59.09377,8.437h.88867v6.26074h-.88867Z" style="fill: #fff"/>
<path d="M61.21779,12.44434a2.13346,2.13346,0,1,1,4.24756,0,2.1338,2.1338,0,1,1-4.24756,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C64.11232,13.99463,64.5508,13.42432,64.5508,12.44434Z" style="fill: #fff"/>
<path d="M66.4009,13.42432c0-.81055.60352-1.27783,1.6748-1.34424l1.21973-.07031v-.38867c0-.47559-.31445-.74414-.92187-.74414-.49609,0-.83984.18213-.93848.50049h-.86035c.09082-.77344.81836-1.26953,1.83984-1.26953,1.12891,0,1.76563.562,1.76563,1.51318v3.07666h-.85547v-.63281h-.07031a1.515,1.515,0,0,1-1.35254.707A1.36026,1.36026,0,0,1,66.4009,13.42432Zm2.89453-.38477v-.37646l-1.09961.07031c-.62012.0415-.90137.25244-.90137.64941,0,.40527.35156.64111.835.64111A1.0615,1.0615,0,0,0,69.29543,13.03955Z" style="fill: #fff"/>
<path d="M71.34816,12.44434c0-1.42285.73145-2.32422,1.86914-2.32422a1.484,1.484,0,0,1,1.38086.79h.06641V8.437h.88867v6.26074h-.85156v-.71143h-.07031a1.56284,1.56284,0,0,1-1.41406.78564C72.0718,14.772,71.34816,13.87061,71.34816,12.44434Zm.918,0c0,.95508.4502,1.52979,1.20313,1.52979.749,0,1.21191-.583,1.21191-1.52588,0-.93848-.46777-1.52979-1.21191-1.52979C72.72121,10.91846,72.26613,11.49707,72.26613,12.44434Z" style="fill: #fff"/>
<path d="M79.23,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C82.12453,13.99463,82.563,13.42432,82.563,12.44434Z" style="fill: #fff"/>
<path d="M84.66945,10.19482h.85547v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915H87.605V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
<path d="M93.51516,9.07373v1.1416h.97559v.74854h-.97559V13.2793c0,.47168.19434.67822.63672.67822a2.96657,2.96657,0,0,0,.33887-.02051v.74023a2.9155,2.9155,0,0,1-.4834.04541c-.98828,0-1.38184-.34766-1.38184-1.21582v-2.543h-.71484v-.74854h.71484V9.07373Z" style="fill: #fff"/>
<path d="M95.70461,8.437h.88086v2.48145h.07031a1.3856,1.3856,0,0,1,1.373-.80664,1.48339,1.48339,0,0,1,1.55078,1.67871v2.90723H98.69v-2.688c0-.71924-.335-1.0835-.96289-1.0835a1.05194,1.05194,0,0,0-1.13379,1.1416v2.62988h-.88867Z" style="fill: #fff"/>
<path d="M104.76125,13.48193a1.828,1.828,0,0,1-1.95117,1.30273A2.04531,2.04531,0,0,1,100.73,12.46045a2.07685,2.07685,0,0,1,2.07617-2.35254c1.25293,0,2.00879.856,2.00879,2.27V12.688h-3.17969v.0498a1.1902,1.1902,0,0,0,1.19922,1.29,1.07934,1.07934,0,0,0,1.07129-.5459Zm-3.126-1.45117h2.27441a1.08647,1.08647,0,0,0-1.1084-1.1665A1.15162,1.15162,0,0,0,101.63527,12.03076Z" style="fill: #fff"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

@@ -0,0 +1,105 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 201.96849 201.96849" id="svg4211" version="1.1" inkscape:version="0.91 r13725" sodipodi:docname="conversations_baloon.svg">
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" showgrid="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" showguides="false" inkscape:zoom="2.2196812" inkscape:cx="39.109276" inkscape:cy="132.27753" inkscape:window-width="1600" inkscape:window-height="836" inkscape:window-x="0" inkscape:window-y="27" inkscape:window-maximized="1" inkscape:current-layer="layer8"/>
<defs id="defs4213">
<linearGradient osb:paint="solid" id="linearGradient5393">
<stop id="stop5395" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
</linearGradient>
<clipPath id="clipPath4831" clipPathUnits="userSpaceOnUse">
<circle style="display:inline;opacity:1;fill:#a00e00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="circle4833" cx="883.16943" cy="677.19611" r="229.80969"/>
</clipPath>
<clipPath id="clipPath4859" clipPathUnits="userSpaceOnUse">
<circle style="display:inline;opacity:1;fill:#a00e00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="circle4861" cx="883.16943" cy="677.19611" r="229.80969"/>
</clipPath>
<clipPath id="clipPath5624" clipPathUnits="userSpaceOnUse">
<g style="display:inline" id="g5626" transform="matrix(0.3835576,0,0,0.3835576,-250.60108,-156.11014)">
<path sodipodi:nodetypes="ccsssc" inkscape:connector-curvature="0" id="path5628" d="m 1120.8042,772.36056 -118.0025,103.66316 118.5792,46.01918 c 8.4859,3.29325 19.6524,7.94481 27.2622,0.71376 7.3868,-7.01907 5.6502,-14.13839 3.0935,-24.54095 z" style="display:inline;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/>
<circle transform="matrix(1.0878566,0,0,1.0878566,-57.401992,-79.686482)" clip-path="url(#clipPath4859)" r="229.80969" cy="677.19611" cx="883.16943" id="circle5630" style="display:inline;opacity:1;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
</g>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath10653">
<g style="display:inline" id="g10655" transform="matrix(0.3835576,0,0,0.3835576,-250.60108,-156.11015)" inkscape:export-xdpi="100" inkscape:export-ydpi="100">
<path sodipodi:nodetypes="ccsssc" inkscape:connector-curvature="0" id="path10657" d="m 1120.8042,772.36056 -118.0025,103.66316 118.5792,46.01918 c 8.4859,3.29325 19.6524,7.94481 27.2622,0.71376 7.3868,-7.01907 5.6502,-14.13839 3.0935,-24.54095 z" style="display:inline;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/>
<circle transform="matrix(1.0878566,0,0,1.0878566,-57.401992,-79.686482)" clip-path="url(#clipPath4859)" r="229.80969" cy="677.19611" cx="883.16943" id="circle10659" style="display:inline;opacity:1;fill:#4caf50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
</g>
</clipPath>
<radialGradient inkscape:collect="always" xlink:href="#linearGradient3913" id="radialGradient3883" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.68662089,-0.30388739,0.24146012,0.54605188,-300.74233,-264.46964)" cx="262.33273" cy="945.23846" fx="262.33273" fy="945.23846" r="185.49754"/>
<linearGradient inkscape:collect="always" id="linearGradient3913">
<stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop3915"/>
<stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop3917"/>
</linearGradient>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath5315">
<g inkscape:export-ydpi="100" inkscape:export-xdpi="100" transform="matrix(0.3835576,0,0,0.3835576,-246.60108,-156.11013)" id="g5317" style="display:inline;fill:#00a000;fill-opacity:1">
<path style="display:inline;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 1120.8042,772.36056 -118.0025,103.66316 118.5792,46.01918 c 8.4859,3.29325 19.6524,7.94481 27.2622,0.71376 7.3868,-7.01907 5.6502,-14.13839 3.0935,-24.54095 z" id="path5319" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsssc"/>
<circle style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="circle5321" cx="883.16943" cy="677.19611" r="229.80969" clip-path="url(#clipPath4859)" transform="matrix(1.0878566,0,0,1.0878566,-57.401992,-79.686482)"/>
</g>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6882">
<path inkscape:connector-curvature="0" id="path6884" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6886">
<path inkscape:connector-curvature="0" id="path6888" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6890">
<path inkscape:connector-curvature="0" id="path6892" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6894">
<path inkscape:connector-curvature="0" id="path6896" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6898">
<path inkscape:connector-curvature="0" id="path6900" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6902">
<path inkscape:connector-curvature="0" id="path6904" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6906">
<path inkscape:connector-curvature="0" id="path6908" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6910">
<path inkscape:connector-curvature="0" id="path6912" d="M 99.88867,-2.3837657e-4 A 95.889392,95.889392 0 0 0 4,95.888436 95.889392,95.889392 0 0 0 99.88867,191.77906 95.889392,95.889392 0 0 0 142.59375,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.7793,95.888466 95.889392,95.889392 0 0 0 99.88867,-2.0837657e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
</clipPath>
<filter inkscape:collect="always" style="color-interpolation-filters:sRGB" id="filter5640" x="-0.012227737" width="1.0244555" y="-0.011780591" height="1.0235612">
<feGaussianBlur inkscape:collect="always" stdDeviation="0.9782166" id="feGaussianBlur5642"/>
</filter>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath5745">
<path inkscape:connector-curvature="0" id="path5747" d="M 99.908581,-2.3831968e-4 A 95.889392,95.889392 0 0 0 4.0199102,95.888436 95.889392,95.889392 0 0 0 99.908581,191.77906 95.889392,95.889392 0 0 0 142.61366,181.70093 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 L 183.8285,142.24002 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 195.79921,95.888466 95.889392,95.889392 0 0 0 99.908581,-2.0831968e-4 Z" style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
</clipPath>
</defs>
<metadata id="metadata4216">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g inkscape:groupmode="layer" id="layer9" inkscape:label="shaddow" transform="translate(-4,2.6816164)" style="display:inline">
<path inkscape:connector-curvature="0" id="path6914" d="M 104.88867,0.06226191 A 95.889392,95.889392 0 0 0 8.9999996,95.950936 95.889392,95.889392 0 0 0 104.88867,191.84156 95.889392,95.889392 0 0 0 147.59375,181.76343 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 l -11.34766,-46.16797 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 200.7793,95.950966 95.889392,95.889392 0 0 0 104.88867,0.06229191 Z" style="display:inline;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter5640)"/>
</g>
<g style="display:inline" inkscape:label="bubble" id="layer4" inkscape:groupmode="layer" transform="translate(-4,2.6816348)">
<path style="display:inline;opacity:1;fill:#00a000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="M 104.88867,-1.9377566 A 95.889392,95.889392 0 0 0 8.9999996,93.950918 95.889392,95.889392 0 0 0 104.88867,189.84154 95.889392,95.889392 0 0 0 147.59375,179.76341 l 0.12695,0.0137 40.79297,15.83204 c 3.25479,1.26313 7.53628,3.04697 10.45508,0.27343 2.83326,-2.69222 2.16811,-5.42213 1.1875,-9.41211 L 188.80859,140.3025 a 95.889392,95.889392 0 0 1 -0.002,0.002 l 0,-0.008 0.002,0.006 A 95.889392,95.889392 0 0 0 200.7793,93.950948 95.889392,95.889392 0 0 0 104.88867,-1.9377266 Z" id="circle6661" inkscape:connector-curvature="0"/>
<text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:125px;line-height:1000%;font-family:Sans;letter-spacing:-10.89000034px;word-spacing:5px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" x="85.862968" y="-55.271603" id="text6634" sodipodi:linespacing="1000%"><tspan sodipodi:role="line" id="tspan6636" x="85.862968" y="-55.271603"/></text>
</g>
<g inkscape:groupmode="layer" id="layer8" inkscape:label="dotted line" style="display:inline" transform="translate(-4,2.6816164)">
<path style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6910)" d="m 145.16406,11.183594 -5.13232,9.649402 c -0.77924,1.465076 -0.65974,2.41396 0.66876,3.18097 9.66686,5.488467 18.12303,12.874168 24.86104,21.711122 1.05534,1.616079 2.08054,1.713076 3.67763,0.571565 L 178.04883,40 C 169.45271,27.990203 158.19857,18.128379 145.16406,11.183594 Z" id="path7364" inkscape:connector-curvature="0" sodipodi:nodetypes="csccscc" transform="translate(4.9999996,-1.9374999)"/>
<path style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6906)" d="m 193.80469,75.615234 -9.62713,2.062751 c -2.66266,0.570512 -3.40763,1.172953 -2.90593,3.917433 0.85823,4.714633 1.30424,9.497137 1.33189,14.293254 -0.028,5.578758 -0.62194,11.137108 -1.77093,16.589918 -0.86591,3.23162 0.13682,3.77092 3.16149,4.58138 l 8.98639,2.30136 c 1.98177,-7.66828 3.00584,-15.55255 3.04883,-23.472658 -0.0187,-6.817681 -0.76446,-13.613926 -2.22461,-20.273438 z" id="path7366" inkscape:connector-curvature="0" sodipodi:nodetypes="csccccccc" transform="translate(4.9999996,-1.9374999)"/>
<path style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6902)" d="m 14.264281,102.76512 -10.2076406,0.87943 c 1.2093798,14.83154 5.8540346,29.17808 13.5664056,41.90429 l 8.544301,-5.23239 c 2.394983,-1.46665 1.895406,-3.37834 0.986202,-5.04513 -5.118253,-9.40257 -8.359018,-19.71635 -9.536202,-30.36553 0,-2.09418 -1.881577,-2.26744 -3.353066,-2.14067 z" id="path7372" inkscape:connector-curvature="0" sodipodi:nodetypes="sccsccs" transform="translate(4.9999996,-1.9374999)"/>
<path style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6898)" d="m 51.504371,166.60235 -5.82273,8.50898 c 12.710503,8.71282 27.333669,14.23394 42.630859,16.0957 l 1.220329,-9.90843 c 0.355066,-2.88295 -1.085712,-3.52946 -3.332252,-3.90256 -10.402329,-1.73697 -20.373956,-5.45322 -29.373754,-10.94516 -1.647505,-1.06744 -3.639993,-2.30718 -5.322452,0.15147 z" id="path7370" inkscape:connector-curvature="0" sodipodi:nodetypes="sccsccs" transform="translate(4.9999996,-1.9374999)"/>
<path style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6894)" d="M 32.208984,27.683594 C 21.779177,38.079001 13.883707,50.736882 9.1347656,64.675781 L 19.33617,68.090365 c 1.658147,0.55501 2.832564,-0.120955 3.374272,-1.591979 3.777598,-10.021698 9.470788,-19.210103 16.759132,-27.052307 1.561136,-1.561136 1.567283,-2.960058 0.447507,-4.076606 z" id="path7374" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsccsc" transform="translate(4.9999996,-1.9374999)"/>
<path style="opacity:1;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6890)" d="M 99.888672,-0.25 C 87.701045,-0.2239408 75.630114,2.1252837 64.322266,6.671875 l 3.530435,8.74898 c 1.063314,2.635062 1.616754,3.526314 4.973913,2.352259 8.692057,-3.031338 17.839027,-4.588849 27.062058,-4.599286 5.555828,0 6.486278,0.350026 6.780788,-3.4460223 l 0.74851,-9.64772758 C 104.9135,-0.12857239 102.40179,-0.23868346 99.888672,-0.25 Z" id="path7376" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsccscc" transform="translate(4.9999996,-1.9374999)"/>
<path style="display:inline;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6886)" d="m 138.72416,168.48439 c -4.17634,2.25458 -8.55959,4.09055 -13.0504,5.63418 -1.00363,0.34498 -1.20742,1.18222 -0.8682,2.27372 l 3.44056,11.0706 c 4.92985,-1.53124 9.72799,-3.45808 14.34766,-5.76172 l 0.12695,0.0137 14.0293,5.44532 4.12174,-10.20577 c 0.7548,-1.86894 -0.0184,-2.7016 -1.59462,-3.31324 l -14.72114,-5.71251 c -1.86679,-0.7244 -3.68834,-0.60144 -5.83185,0.55572 z" id="path5005" inkscape:connector-curvature="0" sodipodi:nodetypes="cssccccsssc" transform="translate(4.9999996,-1.9374999)"/>
<path style="display:inline;fill:#80d080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" clip-path="url(#clipPath6882)" d="m 186.53125,152.80469 -10.6386,2.70888 c -0.78879,0.20085 -1.67397,1.02386 -1.35494,2.33801 l 9.75918,40.15428 c 8.56713,5.97538 15.30408,3.06731 11.01563,-9.47266 z" id="path5071" inkscape:connector-curvature="0" sodipodi:nodetypes="cssccc" transform="translate(4.9999996,-1.9374999)"/>
</g>
<g style="display:inline" inkscape:label="dots" id="layer2" inkscape:groupmode="layer" transform="translate(-4,2.6816348)">
<g inkscape:export-ydpi="100" inkscape:export-xdpi="100" style="fill:#f5f5f5;fill-opacity:1" transform="matrix(0.3835576,0,0,0.3835576,-248.17635,-138.86977)" id="g5126">
<circle r="27.299093" style="opacity:1;fill:#f5f5f5;fill-opacity:1;fill-rule:evenodd;stroke:none" id="path3047-4" cx="799.11273" cy="609.86285"/>
<circle r="27.299093" style="opacity:1;fill:#f5f5f5;fill-opacity:1;fill-rule:evenodd;stroke:none" id="path3047-1-2" cx="918.91962" cy="609.86285"/>
<circle r="27.299093" style="opacity:1;fill:#f5f5f5;fill-opacity:1;fill-rule:evenodd;stroke:none" id="path3047-1-8-6" cx="1039.0352" cy="609.86285"/>
</g>
</g>
<g inkscape:groupmode="layer" id="layer1" inkscape:label="light" style="display:inline" transform="translate(-4,2.6816164)">
<path style="display:inline;opacity:0.19211821;fill:url(#radialGradient3883);fill-opacity:1;stroke:none" d="m 192.44891,47.715674 c -61.69765,0 -111.704333,49.103472 -111.704333,109.668976 0,12.77573 2.228815,25.0414 6.321575,36.4393 5.069139,0.70557 10.251828,1.06876 15.514978,1.06876 18.80489,0 30.91434,7.28449 47.46533,1.26909 l 54.00234,6.06606 c 5.24363,2.11897 11.63381,1.37954 10.27166,-4.11162 l -14.23663,-57.56735 c 9.15073,-16.06873 12.27539,-34.36633 12.27539,-53.240271 0,-13.72556 -2.63167,-26.842322 -7.42478,-38.909717 -4.09925,-0.447474 -8.2658,-0.683228 -12.48553,-0.683228 z" id="path3878" inkscape:connector-curvature="0" clip-path="url(#clipPath5745)" transform="translate(4.9800894,-1.9374999)" sodipodi:nodetypes="sscsccccscs"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" class="converse-svg-logo" viewBox="0 0 364 364"><g data-name="Layer 2" fill="#fff"><g data-name="Layer 7"><path d="M179.9 4.15c-70.975 0-134.962 42.755-162.121 108.326-27.16 65.57-12.142 141.044 38.044 191.23 50.187 50.187 125.66 65.205 191.231 38.045 65.571-27.16 108.326-91.146 108.326-162.121 0-96.915-78.565-175.48-175.48-175.48z" class="cls-4"/><path d="M221.46 103.71c0 18.83-29.36 18.83-29.12 0-.24-18.83 29.12-18.83 29.12 0z" class="cls-3"/></g></g><g data-name="Layer 2"><g data-name="Layer 7"><path class="cls-3" d="M221.46 103.71c0 18.83-29.36 18.83-29.12 0-.24-18.83 29.12-18.83 29.12 0z"/><path class="cls-4" d="M179.9 4.15a175.48 175.48 0 1 0 175.48 175.48A175.48 175.48 0 0 0 179.9 4.15zm-40.79 264.5c-.23-17.82 27.58-17.82 27.58 0s-27.81 17.83-27.58 0zm79.49-100.41a79.65 79.65 0 0 1-13.45 5.76 12.76 12.76 0 0 0-6.29 4.65L167.54 222a1.36 1.36 0 0 1-2.46-.8v-35.8a2.58 2.58 0 0 0-3.06-2.53c-15.43 3-30.23 7.7-42.73 19.94-38.8 38-29.42 105.69 16.09 133.16a162.25 162.25 0 0 1-91.47-67.27C-3.86 182.26 34.5 47.25 138.37 25.66c46.89-9.75 118.25 5.16 123.73 62.83 3.05 32.15-15.54 64.4-43.5 79.75z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

+78
View File
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128" version="1.1">
<defs>
<radialGradient id="radial0" gradientUnits="userSpaceOnUse" cx="16.488304" cy="23.537582" fx="16.488304" fy="23.537582" r="19" gradientTransform="matrix(5.830516,0,0,5.186123,-57.136612,106.88559)">
<stop offset="0" style="stop-color:rgb(45.09804%,82.352942%,8.627451%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(30.588236%,60.392159%,2.352941%);stop-opacity:1;"/>
</radialGradient>
<filter id="alpha" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
<feColorMatrix type="matrix" in="SourceGraphic" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
</filter>
<mask id="mask0">
<g filter="url(#alpha)">
<rect x="0" y="0" width="128" height="128" style="fill:rgb(0%,0%,0%);fill-opacity:0.137778;stroke:none;"/>
</g>
</mask>
<linearGradient id="linear0" gradientUnits="userSpaceOnUse" x1="15.571428" y1="29.99917" x2="15.571428" y2="42.285942" gradientTransform="matrix(2.931288,0,0,2.931288,-1.412986,2.510315)">
<stop offset="0" style="stop-color:rgb(0%,0%,0%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(0%,0%,0%);stop-opacity:0;"/>
</linearGradient>
<clipPath id="clip1">
<rect x="0" y="0" width="192" height="152"/>
</clipPath>
<g id="surface511779" clip-path="url(#clip1)">
<path style=" stroke:none;fill-rule:evenodd;fill:url(#linear0);" d="M 36.695312 90.449219 C 39.863281 90.667969 45.804688 93.007812 48.417969 90.449219 C 42.980469 93.910156 45.859375 116.472656 43.183594 127.925781 C 41.019531 115.433594 39.433594 94.847656 36.695312 90.449219 Z M 36.695312 90.449219 "/>
</g>
<mask id="mask1">
<g filter="url(#alpha)">
<rect x="0" y="0" width="128" height="128" style="fill:rgb(0%,0%,0%);fill-opacity:0.137778;stroke:none;"/>
</g>
</mask>
<linearGradient id="linear1" gradientUnits="userSpaceOnUse" x1="15.571428" y1="29.99917" x2="15.571428" y2="42.285942" gradientTransform="matrix(2.931288,0,0,2.931288,4.44959,2.510315)">
<stop offset="0" style="stop-color:rgb(0%,0%,0%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(0%,0%,0%);stop-opacity:0;"/>
</linearGradient>
<clipPath id="clip2">
<rect x="0" y="0" width="192" height="152"/>
</clipPath>
<g id="surface511782" clip-path="url(#clip2)">
<path style=" stroke:none;fill-rule:evenodd;fill:url(#linear1);" d="M 107.042969 90.449219 C 103.875 90.667969 97.933594 93.007812 95.320312 90.449219 C 100.757812 93.910156 97.878906 116.472656 100.554688 127.925781 C 102.71875 115.433594 104.304688 94.847656 107.042969 90.449219 Z M 107.042969 90.449219 "/>
</g>
<linearGradient id="linear2" gradientUnits="userSpaceOnUse" x1="16" y1="2" x2="38.465416" y2="42.405006" gradientTransform="matrix(3.689005,0,0,3.693769,-24.666805,156.809784)">
<stop offset="0" style="stop-color:rgb(100%,100%,100%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(100%,100%,100%);stop-opacity:0;"/>
</linearGradient>
<radialGradient id="radial1" gradientUnits="userSpaceOnUse" cx="21.142859" cy="22.17857" fx="21.142859" fy="22.17857" r="9" gradientTransform="matrix(2.931285,0,0,2.932291,-6.481694,134.102966)">
<stop offset="0" style="stop-color:rgb(99.607843%,94.901961%,56.862748%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(92.941177%,83.137256%,0%);stop-opacity:1;"/>
</radialGradient>
<linearGradient id="linear3" gradientUnits="userSpaceOnUse" x1="24.260687" y1="2.533504" x2="24.832115" y2="22.012075" gradientTransform="matrix(1.342451,0,-0.837372,1.723858,33.163297,2.90654)">
<stop offset="0" style="stop-color:rgb(100%,100%,100%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(100%,100%,100%);stop-opacity:0;"/>
</linearGradient>
<linearGradient id="linear4" gradientUnits="userSpaceOnUse" x1="16" y1="2" x2="32.927006" y2="31.587952" gradientTransform="matrix(2.912369,0,0,2.925584,-6.027668,173.323547)">
<stop offset="0" style="stop-color:rgb(100%,100%,100%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(100%,100%,100%);stop-opacity:0;"/>
</linearGradient>
<linearGradient id="linear5" gradientUnits="userSpaceOnUse" x1="24.000008" y1="31.785711" x2="30.00001" y2="38.499996" gradientTransform="matrix(1.993,0,0,2.079344,16.040779,163.224747)">
<stop offset="0" style="stop-color:rgb(44.705883%,62.352943%,81.176472%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(22.352941%,43.137255%,65.490198%);stop-opacity:1;"/>
</linearGradient>
<linearGradient id="linear6" gradientUnits="userSpaceOnUse" x1="17.725422" y1="3.860764" x2="27.055439" y2="24.431168" gradientTransform="matrix(2.912369,0,0,2.925584,-6.027668,173.323547)">
<stop offset="0" style="stop-color:rgb(100%,100%,100%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(100%,100%,100%);stop-opacity:0;"/>
</linearGradient>
</defs>
<g id="surface511761">
<path style="fill-rule:nonzero;fill:url(#radial0);stroke-width:2.931288;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(30.588236%,60.392159%,2.352941%);stroke-opacity:1;stroke-miterlimit:4;" d="M 63.871094 218.601562 C 35.554688 218.601562 9.640625 233.59375 9.640625 243.296875 C 9.640625 247.816406 28.058594 245.226562 28.695312 249.191406 L 33.273438 280.140625 C 33.273438 283.101562 34.832031 285.421875 36.847656 285.421875 C 55.203125 290.164062 73.234375 290.09375 90.800781 285.421875 C 92.8125 285.421875 94.464844 283.101562 94.464844 280.140625 L 99.042969 249.191406 C 99.890625 245.851562 118.097656 247.816406 118.097656 243.296875 C 118.097656 233.59375 92.183594 218.601562 63.871094 218.601562 Z M 63.871094 218.601562 " transform="matrix(1,0,0,1,0,-172)"/>
<use xlink:href="#surface511779" transform="matrix(1,0,0,1,-8,-16)" mask="url(#mask0)"/>
<use xlink:href="#surface511782" transform="matrix(1,0,0,1,-8,-16)" mask="url(#mask1)"/>
<path style="fill:none;stroke-width:2.93129;stroke-linecap:butt;stroke-linejoin:miter;stroke:url(#linear2);stroke-miterlimit:4;" d="M 63.871094 221.53125 C 37.082031 221.53125 11.375 237.507812 13.199219 242.46875 C 13.453125 243.152344 30.621094 243.289062 31.222656 247.117188 L 36.183594 277.121094 C 36.183594 279.984375 36.402344 283.0625 38.308594 283.0625 C 56.125 287.078125 73.109375 286.9375 89.34375 283.0625 C 91.25 283.0625 91.554688 280.820312 91.554688 277.960938 L 96.304688 247.324219 C 97.105469 244.101562 113.710938 244.800781 114.121094 241.632812 C 114.886719 235.6875 90.65625 221.53125 63.871094 221.53125 Z M 63.871094 221.53125 " transform="matrix(1,0,0,1,0,-172)"/>
<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:0.0593608;stroke-width:2.931289;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(100%,100%,100%);stroke-opacity:0.423529;stroke-miterlimit:4;" d="M 79.992188 233.257812 C 79.992188 239.734375 72.773438 244.984375 63.871094 244.984375 C 54.964844 244.984375 47.746094 239.734375 47.746094 233.257812 C 47.746094 226.78125 54.964844 221.53125 63.871094 221.53125 C 72.773438 221.53125 79.992188 226.78125 79.992188 233.257812 Z M 79.992188 233.257812 " transform="matrix(1,0,0,1,0,-172)"/>
<path style="fill-rule:nonzero;fill:url(#radial1);stroke-width:2.931289;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(76.862746%,62.7451%,0%);stroke-opacity:1;stroke-miterlimit:4;" d="M 63.871094 177.5625 C 50.109375 177.5625 38.953125 188.730469 38.953125 202.488281 C 38.953125 211.28125 43.503906 219.019531 50.382812 223.457031 C 54.878906 228.578125 52.875 226.90625 53.609375 233.1875 C 53.609375 234.851562 54.96875 236.210938 56.632812 236.210938 C 61.96875 240.304688 66.722656 239.871094 71.105469 236.210938 C 72.769531 236.210938 74.128906 234.851562 74.128906 233.1875 C 75 227.039062 73.738281 227.816406 76.945312 223.714844 C 84.054688 219.320312 88.785156 211.453125 88.785156 202.488281 C 88.785156 188.730469 77.628906 177.5625 63.871094 177.5625 Z M 63.871094 177.5625 " transform="matrix(1,0,0,1,0,-172)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear3);" d="M 59.097656 24.617188 C 56.738281 29.472656 52.273438 33.410156 49.128906 33.410156 C 45.984375 33.410156 45.34375 29.472656 47.703125 24.617188 C 50.0625 19.761719 54.527344 15.824219 57.671875 15.824219 C 60.816406 15.824219 61.453125 19.761719 59.097656 24.617188 Z M 59.097656 24.617188 "/>
<path style="fill:none;stroke-width:2.931289;stroke-linecap:butt;stroke-linejoin:miter;stroke:url(#linear4);stroke-miterlimit:4;" d="M 63.871094 180.496094 C 51.726562 180.496094 41.882812 190.714844 41.882812 203.304688 C 41.882812 211.351562 46.273438 217.214844 53.070312 222.492188 C 57.035156 227.183594 55.574219 226.542969 55.875 231.449219 C 55.875 232.972656 56.378906 233.441406 57.847656 233.441406 C 61.960938 237.171875 66.179688 237.078125 70.132812 233.320312 C 71.601562 233.320312 71.738281 232.636719 71.738281 231.113281 C 72.25 224.757812 72.535156 225.519531 75.367188 221.765625 C 81.640625 217.746094 85.855469 211.511719 85.855469 203.304688 C 85.855469 190.714844 76.011719 180.496094 63.871094 180.496094 Z M 63.871094 180.496094 " transform="matrix(1,0,0,1,0,-172)"/>
<path style="fill-rule:nonzero;fill:url(#linear5);stroke-width:2.931288;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(20.392157%,39.607844%,64.313728%);stroke-opacity:1;stroke-miterlimit:4;" d="M 52.171875 225.542969 C 53.09375 227.152344 53.101562 228.8125 53.605469 233.160156 C 53.605469 234.832031 54.9375 236.195312 56.589844 236.195312 C 61.890625 240.308594 66.640625 239.875 70.992188 236.195312 C 72.648438 236.195312 74.191406 234.882812 74.191406 233.210938 C 74.757812 229.15625 74.984375 226.558594 75.582031 225.144531 L 71.519531 227.507812 L 56.171875 227.507812 Z M 52.171875 225.542969 " transform="matrix(1,0,0,1,0,-172)"/>
<path style="fill:none;stroke-width:2.931289;stroke-linecap:butt;stroke-linejoin:miter;stroke:url(#linear6);stroke-miterlimit:4;" d="M 56.4375 230.328125 L 56.59375 233.285156 L 58.058594 233.285156 C 63.382812 237.972656 66.652344 235.839844 69.785156 233.265625 L 70.925781 233.265625 L 71.300781 230.328125 Z M 56.4375 230.328125 " transform="matrix(1,0,0,1,0,-172)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.9 KiB

+267
View File
@@ -0,0 +1,267 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
xml:space="preserve"
viewBox="0 0 200 200"
enable-background="new 0 0 200 200"
id="svg36"
sodipodi:docname="xmpp.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
id="metadata42"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs40"><filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Greyscale"
id="filter1291"><feColorMatrix
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
id="feColorMatrix1289"
result="fbSourceGraphic" /><feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix1329" /><feColorMatrix
id="feColorMatrix1331"
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
in="fbSourceGraphic" /></filter><filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Greyscale"
id="filter1295"><feColorMatrix
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
id="feColorMatrix1293"
result="fbSourceGraphic" /><feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix1333" /><feColorMatrix
id="feColorMatrix1335"
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
in="fbSourceGraphic" /></filter><filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Greyscale"
id="filter1299"><feColorMatrix
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
id="feColorMatrix1297"
result="fbSourceGraphic" /><feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix1337" /><feColorMatrix
id="feColorMatrix1339"
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
in="fbSourceGraphic" /></filter><filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Greyscale"
id="filter1303"><feColorMatrix
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
id="feColorMatrix1301"
result="fbSourceGraphic" /><feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix1341" /><feColorMatrix
id="feColorMatrix1343"
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
in="fbSourceGraphic" /></filter><filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Greyscale"
id="filter1307"><feColorMatrix
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
id="feColorMatrix1305"
result="fbSourceGraphic" /><feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix1345" /><feColorMatrix
id="feColorMatrix1347"
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
in="fbSourceGraphic" /></filter><filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Greyscale"
id="filter1311"><feColorMatrix
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
id="feColorMatrix1309"
result="fbSourceGraphic" /><feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix1349" /><feColorMatrix
id="feColorMatrix1351"
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
in="fbSourceGraphic" /></filter><filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Greyscale"
id="filter1315"><feColorMatrix
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
id="feColorMatrix1313"
result="fbSourceGraphic" /><feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix1353" /><feColorMatrix
id="feColorMatrix1355"
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
in="fbSourceGraphic" /></filter><filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Greyscale"
id="filter1319"><feColorMatrix
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
id="feColorMatrix1317"
result="fbSourceGraphic" /><feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix1357" /><feColorMatrix
id="feColorMatrix1359"
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
in="fbSourceGraphic" /></filter><filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Greyscale"
id="filter1323"><feColorMatrix
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
id="feColorMatrix1321"
result="fbSourceGraphic" /><feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix1361" /><feColorMatrix
id="feColorMatrix1363"
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
in="fbSourceGraphic" /></filter><filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Greyscale"
id="filter1327"><feColorMatrix
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
id="feColorMatrix1325"
result="fbSourceGraphic" /><feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix1365" /><feColorMatrix
id="feColorMatrix1367"
values="0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0.05 2.57 0.072 -1.41 0 0 0 0 1 0 "
in="fbSourceGraphic" /></filter></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1918"
inkscape:window-height="1126"
id="namedview38"
showgrid="false"
inkscape:zoom="1.18"
inkscape:cx="-83.898305"
inkscape:cy="100"
inkscape:window-x="1200"
inkscape:window-y="744"
inkscape:window-maximized="1"
inkscape:current-layer="svg36" />
<linearGradient
id="SVGID_right_"
y2="1.279e-13"
gradientUnits="userSpaceOnUse"
x2="-1073.2"
gradientTransform="translate(1196.604,15.368977)"
y1="126.85"
x1="-1073.2">
<stop
stop-color="#1b3967"
offset=".011"
id="stop2" />
<stop
stop-color="#13b5ea"
offset=".467"
id="stop4" />
<stop
stop-color="#002b5c"
offset=".9945"
id="stop6" />
</linearGradient>
<linearGradient
id="SVGID_left_"
y2="1.279e-13"
gradientUnits="userSpaceOnUse"
x2="-1073.2"
gradientTransform="matrix(-1,0,0,1,-994.78801,15.367977)"
y1="126.85"
x1="-1073.2">
<stop
stop-color="#1b3967"
offset=".011"
id="stop9" />
<stop
stop-color="#13b5ea"
offset=".467"
id="stop11" />
<stop
stop-color="#002b5c"
offset=".9945"
id="stop13" />
</linearGradient>
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.29300005;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.77952766;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect1369"
width="191.52542"
height="191.52542"
x="4.2372894"
y="4.2372894"
rx="13.4362"
ry="13.435" /><path
d="m 151.80512,29.557978 c 0.077,1.313 -1.787,0.968 -1.787,2.293 0,38.551 -46.558,97.366012 -91.687985,108.730012 v 1.639 C 118.28313,136.69999 186.89012,74.419978 188.40012,15.369977 l -36.599,14.189001 z"
style="fill:url(#SVGID_right_);opacity:0.293;filter:url(#filter1327)"
id="path16" />
<path
d="m 133.67312,34.300978 c 0.076,1.313 0.12,2.63 0.12,3.957 0,38.551 -30.69898,90.497012 -75.826985,101.860012 v 1.639 c 59.044005,-2.79 105.809995,-63.024012 105.809995,-109.200012 0,-2.375 -0.128,-4.729 -0.371,-7.056 l -29.73,8.798 z"
style="fill:#e96d1f;opacity:0.293;filter:url(#filter1323)"
id="path18" />
<path
d="m 163.69112,24.951978 -7.61699,2.722 c 0.041,0.962 0.066,2.254 0.066,3.225 0,41.219 -37.271,98.204012 -87.271995,107.120012 -3.24501,1.088 -7.53801,2.077 -10.932,2.931 v 1.638 C 123.19013,137.02799 169.03613,70.721978 163.69612,24.947978 Z"
style="fill:#d9541e;opacity:0.293;filter:url(#filter1319)"
id="path20" />
<path
d="m 50.011,29.556978 c -0.077,1.313 1.787,0.968 1.787,2.293 0,38.551 46.558007,97.366012 91.68799,108.730012 v 1.639 C 83.533,136.69899 14.926,74.418978 13.416,15.368977 l 36.599,14.189001 z"
style="fill:url(#SVGID_left_);opacity:0.293;filter:url(#filter1315)"
id="path22" />
<path
d="m 68.143,34.299978 c -0.076,1.313 -0.12,2.63 -0.12,3.957 0,38.551 30.698995,90.497012 75.82699,101.860012 v 1.639 C 84.806,138.96599 38.04,78.731978 38.04,32.555978 c 0,-2.375 0.128,-4.729 0.371,-7.056 l 29.73,8.798 z"
style="fill:#a0ce67;opacity:0.293;filter:url(#filter1311)"
id="path24" />
<path
d="m 38.125,24.950978 7.617,2.722 c -0.041,0.962 -0.066,2.254 -0.066,3.225 0,41.219 37.271,98.204012 87.27199,107.120012 3.245,1.088 7.538,2.077 10.932,2.931 v 1.638 C 78.626,137.02699 32.78,70.720978 38.12,24.946978 Z"
style="fill:#439639;opacity:0.293;filter:url(#filter1307)"
id="path26" />
<path
d="m 25.988,172.07799 -13.388,-14.65 h 11.643 l 9.127,10.268 9.129,-10.268 h 11.643 l -13.387,14.646 14.401,14.728 h -12.09 l -9.697,-10.67 -9.693,10.67 H 11.584 l 14.404,-14.73 z"
id="path28"
style="opacity:0.293;filter:url(#filter1303)" />
<path
d="m 58.508,157.42799 h 13.836 l 10.183,18.905 10.183,-18.905 h 13.83199 v 29.374 h -8.761983 v -21.096 h -0.08 L 85.893,186.80199 H 79.16 l -11.807,-21.096 h -0.082 v 21.096 h -8.764 v -29.37 z"
id="path30"
style="opacity:0.293;filter:url(#filter1299)" />
<path
d="m 112.66199,157.42799 h 24.546 c 8.559,0 10.628,4.302 10.628,10.063 v 2.516 c 0,4.381 -1.908,9.41 -8.275,9.41 h -17.894 v 7.385 h -9.005 v -29.38 z m 9,14.69 h 13.997 c 2.10901,0 2.92401,-1.377 2.92401,-3.123 v -1.135 c 0,-1.99 -0.976,-3.127 -3.694,-3.127 h -13.227 v 7.38 z"
id="path32"
style="opacity:0.293;filter:url(#filter1295)" />
<path
d="m 152.72199,157.42799 h 24.546 c 8.561,0 10.63,4.302 10.63,10.063 v 2.516 c 0,4.381 -1.907,9.41 -8.275,9.41 h -17.893 v 7.385 h -9.008 v -29.38 z m 9.01,14.69 h 13.996 c 2.11,0 2.922,-1.377 2.922,-3.123 v -1.135 c 0,-1.99 -0.974,-3.127 -3.693,-3.127 h -13.225 v 7.38 z"
id="path34"
style="opacity:0.293;filter:url(#filter1291)" />
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

@@ -0,0 +1,28 @@
<svg width="1920" height="1920" viewBox="0 0 1920 1920" xmlns="http://www.w3.org/2000/svg">
<clipPath id="a">
<path id="b" fill="#2cd3e3" d="m1334.5488 1582.1247c-28.4552-23.0252-43.2128-44.8707-64.5988-95.6247-25.3093-60.0651-47.8839-87.6239-87.964-107.3859-19.9998-9.8611-40.1173-15.0444-66.3812-17.1032-18.9074-1.4822-86.6304-.5278-105.3003-2.0652-69.92737-5.7579-123.90089-26.1169-173.47181-65.4343-33.41312-26.5017-70.02913-69.9082-94.99294-112.5114-59.79603-102.0478-81.37876-198.78271-213.27375-277.5941 12.39924-21.70183 34.09241-35.09759 55.52244-46.62618 20.4843-40.74139 42.32638-74.39974 95.91156-90.58542 12.92189-3.90313 19.90689-4.69554 41-4.65128 19.70006.0414 20.96826.16562 32.5 3.18481 21.18287 5.546 34.31788 11.45635 53.38893 24.02338 19.97173 13.16053 31.44414 24.26503 56.13281 54.33267 17.87816 21.77332 20.10026 24.33205 29.31923 33.76085 38.65972 39.53961 73.34668 36.56267 77.81969 36.14929-3.67291-7.73135-7.29364-23.38307-9.10389-39.62667-1.95764-17.56621-3.46012-42.21303-.95323-62.86735 2.58304-21.28177 9.83227-48.31061 17.50821-65.27964 1.31354-2.90379 2.38825-5.54332 2.38825-5.86561 0-1.65552 15.0061-30.21565 21.1639-40.27977 15.3858-25.14644 47.5329-70.83509 57.3361-81.48827.55-.59769 3.6688-4.42585 6.9307-8.50703 20.0294-25.06008 61.3537-67.08217 85.5693-87.01412 4.125-3.3953 9.7022-8.06154 12.3937-10.36942s5.8415-4.84506 7-5.63818 2.3313-1.72317 2.6063-2.06678c.8826-1.1028 27.1338-20.41419 38.5-28.32203 6.05-4.2092 11.45-8.01486 12-8.45702.55-.44217 7.525-4.99177 15.5-10.11024s16.3-10.54797 18.5-12.06558c2.2-1.5176 6.25-3.99698 9-5.50973s7.925-4.47099 11.5-6.57386c13.4478-7.91025 40.507-21.75211 58.5406-29.94597 3.8277-1.73914 8.3094-3.83676 9.9594-4.66137s8.6073-3.99308 15.4606-7.04105c10.2629-4.56435 23.0544-10.9269 35.5224-17.66911 11.2219-6.06834 23.0076-14.83706 33.267-24.75094 3.9875-3.85322 7.25-7.2074 7.25-7.45373 0-.41324 3.9579-5.11446 6.6475-7.896 13.3625-17.52378 25.7406-36.11072 37.3525-54.41717 2.8879-6.21005 7.1747-10.94806 10.9967-16.61738 14.2693-21.35936 38.3987-46.12055 52.8954-54.28053 6.5625-3.69394 6.6868-3.71947 18.1079-3.71947h11.5l7.072 4.76366c7.5209 5.06596 10.2495 8.10481 12.3342 13.73634.7126 1.925 1.8127 4.58582 2.4447 5.91293.6555 1.3765 1.0922 6.59185 1.0166 12.142-.1294 9.49449-1.9623 17.67936-5.9561 26.5962-.7763 1.73312-1.4114 3.46586-1.4114 3.85053 0 1.64538-11.5429 23.35454-16.3963 30.83705-5.0777 7.82835-16.4697 23.23766-22.6523 30.64036-5.262 6.30047-11.3563 14.48273-16.0682 21.57342-8.8399 13.3025-15.6286 24.4666-16.5854 26.0786 10.8788-1.30869 21.897-1.65453 32.6366 1.10818 1.2886.4184 2.1768.98674 3.669 1.86853 4.1956 2.47926 11.6427 7.2794 15.4941 12.3922 1.8644 2.475 3.6551 4.725 3.9794 5 .3242.275 1.8996 3.2 3.5007 6.5 2.6871 5.53821 2.9707 9.13322 3.1386 18.60473.189 10.66226-.9846 16.29074-1.191 19.75385 6.6399-3.85785 68.2097-48.67035 101.9748-81.25338 11.0808-10.69288 36.2578-31.38092 45-37.25385 7.9297-5.32709 19.7095-10.85876 26.3612-12.37894 7.6088-1.73891 17.6682-.79227 24.418 2.29787 5.7726 2.64277 12.1294 8.29114 13.2286 11.75417.3448 1.08655 1.0105 1.97555 1.4792 1.97555 1.8172 0 4.2605 10.38748 4.1748 17.7484-.1093 9.39437-2.037 16.08622-7.322 25.41898-3.6169 6.38689-11.1266 16.63906-12.7836 18.83262-1.5504 2.05248-40.135 48.18251-56.9886 65.86569 30.3686 14.93501 32.4554 41.18744 24.255 71.63431-3.1937 10.14275-18.2308 38.01159-25.8091 53-20.1691 39.89035-69.5128 84.65212-89.0886 100 21.0212 8.92454 30.5113 33.51052 28.588 60.4132-1.4231 19.90537-12.2817 36.97875-37.1412 66.76616-33.7924 40.49125-49.7967 56.06859-72.5779 70.64162-20.2524 12.9553-43.9723 19.71177-43.9723 19.71177l2.0507 5.73362c2.7125 7.58411 2.9095 26.06285.3634 34.10628-2.032 6.41958-7.4973 16.55768-13.0067 24.12735-14.0923 19.36253-57.6985 53.0432-84.2781 65.095-23.5526 10.6791-38.5513 11.0799-38.5513 11.0799s4.4828 17.4333 4.5366 32.3251c.062 17.2547-1.6171 24.9745-8.4225 38.7141-13.1955 27.7415-40.4507 43.1189-64.2219 60.6872.624 1.5922 14.0082 16.3275 33.214 33.2719 24.8978 21.9664 46.1991 38.8539 58.1406 46.0936 2.9445 1.7851 7.3787 4.6388 9.8537 6.3416 6.9336 4.77 23.2748 13.4845 35.5 18.9314 6.9705 3.1057 26.8466 10.3458 30.5 11.1099 1.375.2876 4.525 1.143 7 1.9009 6.4625 1.9791 28.7403 5.8808 57 9.9829 44.0448 6.3935 66.3152 13.2318 83.5 25.6391 6.0801 4.3899 18.6026 18.1866 21.9348 24.1668 1.888 3.3883 4.6832 9.7606 6.2116 14.1606 2.5802 7.4282 2.7815 9.1436 2.8162 24 .042 17.9653-1.0805 23.8424-6.9121 36.1911-19.8567 42.0471-55.5096 46.1675-56.5901 47.4421l.2016 18.8668c.1149 10.7554-.309 15.0482-1.9509 21.116-7.88 29.1225-30.5077 51.5014-60.7111 60.0436-6.468 1.8294-10.5853 2.7691-21.5 2.8332-4.0173.024-17.2994-.6829-19.9921-1.4742 0 3.326-10.1664 20.2644-14.9191 25.1952-11.8393 12.2831-25.5479 18.2905-43.0888 18.8825-38.6908 1.3062-77.5246-27.63-88.4512-36.4716z"/>
</clipPath>
<path d="m0 0h1920v1920h-1920z" fill="#99eaff"/>
<path d="m-44.254722 682.91057c195.353132-132.92976 351.447222-98.86848 466.022032-48.80765 204.35207-329.62316 703.72149-387.88427 998.49769-44.04599 161.505-107.80619 371.353-50.80746 513.0074 52.62089v1277.32218h-1933.2724z" fill="#ccf4fe"/>
<path d="m-31.628257 1167.2235c141.494017-53.3934 359.227947-17.1959 518.575047 66.9771 65.06772-453.22794 741.28201-465.29026 983.71021-104.8824 63.4716-32.6017 324.2921-63.3571 474.0492 90.6289v700.0529h-1944.7062z" fill="#fff"/>
<g fill="none" stroke="#24a8b5" stroke-width="54" transform="rotate(19,563,-133)">
<rect fill="#fff" height="291.04729" rx="6" width="465.78566" x="658.32253" y="885.69167"/>
<path d="m679.21967 898.18315 135.36056 123.54005c52.5322 47.9448 95.48415 41.0626 142.69405 2.6219l160.20842-128.62378"/>
<path d="m660.09283 1167.9354 165.27316-150.8431"/>
<path d="m1120.3373 1163.3457-172.18298-144.7062"/>
</g>
<g clip-path="url(#a)">
<use href="#b"/>
<g fill="#86dae2">
<path d="m1233.1711 1089.7708c74.3447 200.172 163.4242 242.1899 428.0614 258.5212z"/>
<path d="m953.96862 900.02607c87.31948-193.16064 157.28438-342.38841 439.70248-467.33639 138.8966-73.9092 194.465-250.8988 206.6771-310.43615-821.074 333.68623-646.37958 777.77254-646.37958 777.77254z"/>
<path d="m1304.4521 518.42089c-3.1972 24.87639 8.6381 41.59821 36.7513 33.28049 71.1957-54.02509 205.5464-129.071 264.9326-160.18902l-42.9959-39.98576c-86.0448 61.38901-171.0257 114.41378-258.688 166.89429z"/>
</g>
<g fill="#24a8b5">
<path d="m650.66153 1043.6358c35.84819-7.7967 100.70568 99.4805 195.35014 170.7051 87.87216 66.1281 182.82513 122.737 315.04673 156.9323h-400z"/>
<path d="m1512.902 1589.2508c-18.6453-5.0324-36.0134-17.755-46.902-25.6075-22.5409-16.2558-34.9983-29.0675-52.526-54.0201-3.983-5.6702-4.909-7.824-5.2782-12.2758-.8038-9.6922 5.4325-20.9839 14.1406-25.6039 6.403-3.397 18.5519-3.1944 24.6636.4113 2.475 1.4602 5.5452 3.774 6.8227 5.1419 2.3601 2.527 14.1773 22.3559 14.1773 23.789 0 .4308 2.6168 4.0753 5.8152 8.0988 6.3214 7.9525 13.6647 12.5624 21.6158 13.57 2.2379.2836 4.519.8656 5.069 1.2934 3.0571 2.3778 21.7976 11.5654 28.8134 14.1258 9.3454 3.4107 38.4695 11.239 52.0269 8.325zm56.098-117.9241c-25.6398-4.1122-45.313-11.2939-63.4578-23.1654-3.8732-2.5342-7.5463-5.0916-8.1625-5.6833-2.4442-2.347-4.6232-8.0813-5.0882-13.3901-1.3041-14.888 10.8462-28.0084 25.9906-28.0659 6.9742-.026 10.3204 1.2892 21.0182 8.2643 18.1237 11.8168 18.9424 12.0203 43.3285 10.77 15.5849-.7991 21.9984-1.5668 29.7328-3.5589 11.2454-2.8964 32.7607-14.8363 39.8916-19.9593 29.3594-21.0928-4.3677 60.6463-51.7667 74.4379-5.2291 1.5215-24.7641 1.4288-31.4865.3507z"/>
<path d="m1288.7736 1166.6709c-14.4841-7.4689-27.8659-16.0015-33.595-21.4209-.7268-.6875-1.6268-1.2572-2-1.266-.3732-.01-2.0891-1.2463-3.813-2.75-5.0574-4.4113-7.6001-6.5206-12.3365-10.234-6.9934-5.4829-12.4377-11.2687-23.5562-25.0336-5.6703-7.0198-11.3497-14.0465-12.6208-15.6149-3.9429-4.8645-30.0607-30.7167-35.7676-35.4038-2.9785-2.4462-5.9035-4.8977-6.5-5.4477-2.7209-2.5089-16.3102-13.0809-29.0845-22.6268-7.7-5.754-14.9-11.191-16-12.0823-27.8685-22.57972-50.2047-44.82165-64.5636-64.2909-2.4337-3.3-4.7044-6.225-5.0459-6.5-1.3255-1.0675-11.6505-19.90497-15.073-27.5-4.9158-10.90894-5.9546-16.35613-5.9937-16.35734-.039-.001 14.657-10.58109 22.2869-17.87067 12.9353-12.35828 24.2378-27.46964 34.609-46.27199 1.6686-3.025 5.4172-9.775 8.3303-15 5.3314-9.56273 10.95-20.60836 10.95-21.52683 0-.92199 4.2808-9.89307 18.1199-37.97317 20.0968-40.77691 24.0013-47.37572 43.194-73 9.0207-12.0435 34.4314-36.74541 48.7689-47.40861 6.8295-5.07924 13.0922-9.77542 13.9172-10.43596 2.2846-1.82914 24.9623-16.08734 29.5-18.54758 2.2-1.19279 6.25-3.51776 9-5.16659s5.9-3.43407 7-3.96718c1.1-.53312 2.675-1.41859 3.5-1.96772 1.7622-1.17296 38.3689-20.45569 65.5-34.50245 22.871-11.84113 62.7539-31.79659 74.5-37.27615 4.675-2.18089 11.4789-5.35569 15.1197-7.05511 8.3699-3.90673 18.5224-7.94846 36.8803-14.6821 52.0745-19.10082 82.1244-35.88524 114.5663-57.93548 56.591-54.73241 114.6827-143.77442 204.8677-130.93094.4589.34691-2.9044 5.47537-4.6891 7.43032-1.7847 1.95494-6.6199 7.34971-10.7449 11.98838-8.3713 9.41369-67.4215 68.80341-76 76.43687-3.025 2.69177-8.659 7.84751-12.5201 11.45721-3.861 3.6097-9.8916 9.03809-13.4014 12.06309-3.5097 3.025-7.3257 6.41342-8.4799 7.52983s-3.0471 2.69141-4.2064 3.5-5.3858 4.39517-9.3922 7.97017-8.2329 7.15658-9.3922 7.95908c-1.1593.80249-2.7345 2.07205-3.5005 2.82124-3.4044 3.32982-22.146 18.12892-39.1073 30.88055-6.325 4.75519-13.3 10.33063-15.5 12.38986-2.2 2.05924-7.8659 6.82773-12.5909 10.59667-9.2341 7.36566-10.9713 8.69193-20.8478 15.91646-7.6025 5.56117-7.5357 5.50965-12.1933 9.40136-1.9976 1.66913-3.9297 3.03478-4.2936 3.03478-.6844 0-6.3395 4.98978-12.3271 10.87699-7.8164 7.68525-12.2473 18.09358-12.2473 28.76916 0 8.24671 6.7852 19.31415 14.2501 23.24339 2.4436 1.28622 3.0344 1.14175 7.9449-1.9428 7.2368-4.54577 43.0629-28.18107 44.305-29.22898.55-.46402 5.725-4.17698 11.5-8.25104 18.3873-12.9716 54.7069-39.83495 56-41.41971.275-.33703 7.25-5.97722 15.5-12.53373 8.25-6.55652 17.6892-14.19172 20.9759-16.96711 6.676-5.63736 6.714-5.67032 12.142-10.54617 2.143-1.925 8.6181-7.53436 14.3892-12.46525 5.7711-4.93088 17.3806-16.47746 19.8378-18.83408 14.1473-13.56818 40.9289 20.21634 34.0829 48.6802-1.6566 6.88714-41.7247 48.98956-68.8345 72.61913-13.0542 11.37834-36.8282 28.85402-55.0933 40.49771-6.875 4.38271-12.725 8.20114-13 8.48542s-3.425 2.05594-7 3.93703-10.1306 5.81859-14.568 8.75c-4.4375 2.93141-8.5625 5.32984-9.1667 5.32984-.6043 0-1.2486.39679-1.432.88177-1.0625 2.81072-34.9649 17.57585-55.1028 23.9983-7.528 2.40085-41.1813 10.90498-55.418 14.00404-9.5115 2.07045-13.3542 3.61322-16.8639 6.77047-14.14 12.72-10.9471 36.08206 6.0105 43.97855 8.3843 3.90423 14.5044 3.25572 44.5409-4.71974 23.2114-6.16323 55.8635-17.70206 77.5-27.38751 13.773-6.1654 45.7416-23.08079 46.4986-23.4063 19.2912-8.29473 50.8351 37.4702 31.0473 65.79168-4.7798 6.84129-28.1452 30.01453-37.0459 37.42496-4.675 3.89223-8.725 7.32249-9 7.62281-2.5034 2.73388-26.6145 19.2044-35 23.90891-8.1316 4.56204-27.8123 13.8933-36.1821 17.15511-15.8184 6.16462-25.8704 9.06135-57.3179 16.51751-14.6692 3.47805-24.5121 4.58773-41.5 4.67865-16.4011.0878-22.6551-.4613-48.1926-4.23122-3.681-.5434-9.531-.98359-13-.97822-19.6876.0305-32.571 19.93082-24.267 37.48403 4.1799 8.8356 7.3725 10.90357 20.5966 13.34134 15.9836 2.94647 23.909 3.8949 43.5059 5.20641 19.4217 1.29976 44.5016.15505 66.2442-3.02356 6.9371-1.01416 16.7595-2.20862 16.9641-2.00613 7.0343 17.98197 15.4318 34.89104-.5251 46.85513-7.6975 5.77148-20.0799 12.38579-30.8261 18.09216-5.7335 3.04459-19.9844 8.87616-29.5 12.07162-26.6188 8.93895-53.585 12.08754-86.5 10.09981-15.4676-.93409-20.3213-1.66343-34.5-5.18412-12.6562-3.14267-17.8977-4.00843-22.5-3.71645-10.3873.659-17.7758 5.84336-22.2827 15.63534-2.1083 4.58065-2.3966 6.38465-1.9709 12.33435.4327 6.047 1.0116 7.7078 4.3761 12.553l3.8775 5.584 11 3.3669c24.2908 7.4351 57.1068 13.2823 75.8676 12.9354 17.3135-.3202 26.4227 119.255-72.197 130.361-.6139.069-6.6465-2.8481-13.397-6.3291z"/>
</g>
<circle cx="708.6" cy="879.6" fill="#fff" r="26"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

+39
View File
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg version="1.1" width="512" height="512" viewBox="0 0 64 64" color-interpolation="linearRGB"
xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg">
<g>
<path style="fill:#000000; fill-opacity:0.4"
d="M20.99 2C10.5 2 1.99 9.15 1.99 18C1.99 26.82 10.5 34 20.99 34C31.47 34 40 26.82 40 18C40 9.15 31.47 2 20.99 2z
M40 36C37 33 36 26 36 26L28 32C28 32 36 36 40 36z"
transform="matrix(1.4544,0,0,1.4544,2.9135,6.9089)"
/>
<path style="fill:none; stroke:#000000; stroke-width:4; stroke-linecap:round; stroke-linejoin:round"
d="M20.99 2C10.5 2 1.99 9.15 1.99 18C1.99 26.82 10.5 34 20.99 34C31.47 34 40 26.82 40 18C40 9.15 31.47 2 20.99 2z
M40 36C37 33 36 26 36 26L28 32C28 32 36 36 40 36z"
transform="matrix(1.4544,0,0,1.4544,0.0047,4)"
/>
<linearGradient id="gradient0" gradientUnits="userSpaceOnUse" x1="128" y1="1.99" x2="128" y2="40">
<stop offset="0" stop-color="#ffffff"/>
<stop offset="1" stop-color="#e5e5e5"/>
</linearGradient>
<path style="fill:url(#gradient0)"
d="M20.99 2C10.5 2 1.99 9.15 1.99 18C1.99 26.82 10.5 34 20.99 34C31.47 34 40 26.82 40 18C40 9.15 31.47 2 20.99 2z
M40 36C37 33 36 26 36 26L28 32C28 32 36 36 40 36z"
transform="matrix(1.4544,0,0,1.4544,0.0047,4)"
/>
<path style="fill:#000000"
d="M22.48 26.76H26.1V28.82H22.48
M26.1 21.75V23.99H22.48V21.75
M34.03 23.99H30.29V21.75H34.03
M30.29 28.82V26.76H34.03V28.82
M30.29 40.24V36.75H40.15V33.27H30.29V31.75H38.14V18.77H30.29V17.75H39.71V14.3H30.29V11.57H26.1V14.3H17.15V17.75H26.1V18.77H18.59V31.75H26.1V33.27H16.71V36.75H26.1V40.24
M15.39 16.61C12.9 14.22 10.89 12.49 10.89 12.49L7.6 15.07C7.6 15.07 7.6 15.07 9.62 16.79C12 18.82 13.01 20.57 13.01 20.57L16.53 18.16
M7.46 25.83V29.75H11.5V37.75C11.5 37.75 11.5 37.75 10.06 39C8.43 40.21 7.03 41.13 7.03 41.13L9.04 45.46C9.04 45.46 9.04 45.46 10.89 43.82C12.35 42.46 13.79 41.05 15.96 43.82C18.84 44.86 23.12 45.07 27.51 45.29C35.15 45.19 39.6 44.94 39.82 43.76C40.43 41.77 40.93 40.75 35.96 41.16C27.48 41.27 23.15 41.08 19.48 40.94C16.96 39.93 15.56 37.46 15.56 37.46V25.83H7.46z
M51.62 40.02H48.67V37.75H51.62
M54.73 34.99H45.57V44.55H48.67V42.75H54.73
M48.82 24.18V21.75H51.59V24.18
M73.48 22.75C73.48 22.75 73.48 22.75 73.23 25.18C72.93 27.24 72.65 28.75 72.65 28.75L76.07 29.55C76.07 29.55 76.07 29.55 76.75 26.88C77.4 22.66 77.82 19.35 77.82 19.35L75.03 18.77L74.37 18.88H67.43C67.43 18.88 67.43 18.88 67.82 17.15C68.18 15.21 68.48 13.22 68.48 13.22L64.34 12.61C64.34 12.61 64.34 12.61 63.71 17.93C62.46 23.02 60.26 26.69 60.31 26.47C60.31 26.19 60.31 25.9 60.31 25.9V17.75H62.5V14.3H44.57V17.75H56.53V25.79C56.53 25.79 56.53 25.79 56.53 26.15C56.37 26.25 56.01 26.25 56.01 26.25H54.68V19.21H45.73V28H48.82V26.75H53.39C53.39 26.75 53.39 26.75 53.75 28C54.1 28.97 54.26 29.75 56.34 29.75C57.82 29.72 58.93 29.25 59.62 28.9C59.98 28.47 60.15 27.79 61.2 28.32C62.82 29.33 63.46 29.93 64.59 28.21C65.56 25.88 66.35 22.75 66.35 22.75H66.92V28.07C66.92 28.07 66.92 28.07 66.92 31.43C65.78 38.38 60.34 42.61 60.34 42.61V33.75H62.82V30.27H44.18V33.75H56.53V42.69C56.53 42.69 56.53 42.69 56.53 43.19C56.42 43.29 55.98 43.35 55.65 43.38C54.32 43.38 53.07 43.35 53.53 44.29C54.04 45.72 54.18 46.75 56.28 46.75C57.78 46.72 58.93 46.15 59.79 45.68C60.15 45.04 60.31 43.96 60.98 44.9C61.78 46.11 62.1 46.9 66.46 43.85C68.57 37.88 69.09 34.85 69.51 37.72C71.46 43.96 75.64 46.85 76.25 45.83C77.43 44.02 78.2 42.97 72.4 38.79C71.1 31.49 71.1 27.75 71.1 27.75V22.75H73.48z"
transform="matrix(0.6943,0,0,0.669,0.986,10.1795)"
/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

+136
View File
@@ -0,0 +1,136 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 484.03 474.84">
<defs>
<style>
.cls-1 {
fill: #e5cf62;
}
.cls-2 {
fill: #392e1f;
}
.cls-3 {
fill: #feffff;
}
.cls-4 {
fill: #c4b62f;
}
.cls-5 {
fill: #baab9a;
}
.cls-6 {
clip-path: url(#clippath-1);
}
.cls-7 {
stroke: url(#linear-gradient-2);
}
.cls-7, .cls-8, .cls-9, .cls-10 {
fill: none;
}
.cls-7, .cls-8, .cls-10 {
stroke-miterlimit: 10;
stroke-width: 4px;
}
.cls-11 {
fill: #c1b66e;
}
.cls-12 {
fill: #2e2130;
}
.cls-13 {
fill: #cab01c;
}
.cls-8 {
stroke: url(#linear-gradient-3);
}
.cls-14 {
fill: #212121;
}
.cls-15 {
clip-path: url(#clippath);
}
.cls-16 {
fill: #000805;
}
.cls-10 {
stroke: url(#linear-gradient);
}
.cls-17 {
fill: #a19a42;
}
.cls-18 {
fill: #e8d96d;
}
</style>
<clipPath id="clippath">
<path class="cls-9" d="m155.97,474.84c7.81-22.57,14.87-41.17,20.32-55,7.75-19.68,11.14-26.91,14.04-32.69,5.91-11.79,5.69-9.39,18.17-32.42,0,0,6.98-12.89,12.99-21.62,3.1-4.5,6.45-8.9,6.45-8.9,0,0,1.62-2.13,3.39-4.34,19.7-24.71,37.39-42.47,37.39-42.47,16.07-16.13,29.3-26.98,33.86-30.66,1.39-1.13,2.09-1.69,3.04-2.43,10.94-8.46,23.07-17.66,41.13-23.66,16.54-5.49,32.93-11.11,47.57-2.97,15.11,8.4,23.96,26.19,22.79,45.59,2.7,2.4,8.44,8.2,11.15,17.59,1.82,6.32,1.55,11.79,1.11,15.11-5.31-2.37-9.53-4.76-12.64-6.69-3.8-2.36-4.42-2.86-6.57-3.96-7.69-3.97-15.14-4.23-17.15-4.25-4-.05-12.02.48-20.11,5.4-1.81,1.1-5.49,3.55-9.89,8.76-7.98,9.47-6.36,13.87-12.6,24.54-8.59,14.68-22.3,24.5-30.92,30.71-.42.3-.95.68-1.6,1.13-6.32,4.37-21.12,13.79-47.95,21.66-28.58,8.38-56.07,10.71-69.13,11.48,20.68-10.52,48.58-28.44,72.96-58.1,7.25-8.82,28.21-35.77,35.57-69.33,2.12-9.69,2.61-17.76,1.49-26.01-2.16-15.83-9.62-27.43-15.61-35.43-35.45-47.32-79.28-74.32-79.28-74.32-33.41-20.09-41.33-16.6-86.45-39.71-29.69-15.21-52.46-30.15-66.66-40.06,3.77,5.61,10.25,14.8,19.32,25.27,8.86,10.23,29.39,32.29,98.99,76.27,9.78,6.18,24.06,15.02,41.73,25.3-4.86-1.48-11.52-3.61-19.32-6.44-37.63-13.67-64.07-30-72.96-35.68-16.44-10.5-36.81-25.42-57.85-46.08,8.9,21.52,24.08,48.86,51.16,70.98,16.71,13.65,41.42,24.83,60.29,34.01,11.17,5.43,20.63,9.61,27.28,12.44-5.29.29-10.84.29-16.62-.08-38.61-2.48-68.4-20.46-86.56-34.48,5.64,10.12,18.27,29.63,41.99,45.34,23.61,15.63,46.4,19.67,57.9,20.93-6.41,1.48-14.13,2.62-22.87,2.6-23.51-.03-41.67-8.36-51.64-14,8.02,9.49,21.04,22.6,40.13,33.69,14.6,8.48,28.24,13.17,38.65,15.86-4.31,1.64-9.74,3.15-16.1,3.72-18.09,1.61-32.18-5.49-38.4-9.17,6.82,8.07,17.07,18.41,31.46,27.75,10.85,7.04,21.12,11.61,29.48,14.62-3.65,1.16-8.12,2.17-13.25,2.48-14.71.89-26.17-4.48-31.83-7.68,5.49,8.3,17.27,23.2,37.16,29.98,3.91,1.33,7.68,2.2,11.2,2.73"/>
</clipPath>
<clipPath id="clippath-1">
<path class="cls-9" d="m357.86,36.48c-3.83,12.38-7.82,30.95-5.23,52.83,1.84,15.53,6.17,25.77,8.37,32.3,6.36,18.9,9.05,48.9-9.42,96.51-13.39,7.26-26.79,14.51-40.18,21.77-.76-6.82-2.35-16.97-6.11-28.83-3.27-10.29-5.94-14.51-7.76-20.37-2.96-9.53-4.54-24.24,3.06-45.93,1.02,8.26,3.21,14.35,4.97,18.31,2.64,5.95,6.03,9.15,8.63,16.74,1.41,4.12,2.03,7.66,2.33,9.92,1.58-1.71,3.98-4.69,5.61-8.9,5.91-15.24-5.9-28.41-8.98-46.27-1.6-9.27-1.41-22.94,7.51-41.1-1.47,14.83,1.32,25.22,4.26,32.08,3.33,7.76,7.48,12.45,10.98,23.41,2.38,7.44,3.23,13.91,3.56,18.27,2-2.59,4.64-6.62,6.38-11.99,2.75-8.52,1.31-14.53-2.48-34-4.61-23.65-5.96-32.74-4.4-44.61.21-1.59.46-4.02,1.27-7.18,3.85-15.02,11.71-26.05,17.65-32.95Z"/>
</clipPath>
<linearGradient id="linear-gradient" x1="268.88" y1="386.34" x2="283.69" y2="386.34" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#000"/>
<stop offset="1" stop-color="#000"/>
</linearGradient>
<linearGradient id="linear-gradient-2" x1="287.9" y1="375.66" x2="304.37" y2="375.66" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-3" x1="268.98" y1="393.87" x2="313.02" y2="393.87" xlink:href="#linear-gradient"/>
</defs>
<g id="Layer_1-2" data-name="Layer 1">
<g>
<g class="cls-15">
<g>
<ellipse class="cls-11" cx="227.21" cy="287.64" rx="167.4" ry="77.79" transform="translate(-56.17 55.13) rotate(-12.33)"/>
<path class="cls-1" d="m354.43,167.55c6.99,35.51-67.81,92.56-136.54,95.53-17.09.74-17.95-2.55-61.92-8.64-94.28-13.06-122.42-2.73-128.62-15.42-9.38-19.19,56.45-91.96,146.94-111.73,76.91-16.81,172.92,3.53,180.15,40.26Z"/>
<path class="cls-12" d="m337.67,94.75c1.22,12.05-13.76,14.9-65.79,63.92-40.48,38.14-42.7,47.05-61.28,52.98-22.89,7.3-36.62-.78-91.72-15.39-85.29-22.61-103.83-16.89-108.29-30.04C.98,137.94,73.66,72.89,157.53,54.49c84.57-18.55,177.19,11.07,180.15,40.26Z"/>
<path class="cls-4" d="m327.83,45.82c.9,16.43-34.14,17.8-65.3,61.01-27.45,38.08-15.85,58.66-37.44,73.44-14.79,10.13-31.85,8.42-145.44-28.08C11.15,130.18,3.22,126.27.75,117.29-8.33,84.38,66.87,23,147.68,5.56c87.18-18.81,178.72,13.99,180.15,40.26Z"/>
</g>
</g>
<g class="cls-6">
<g>
<ellipse class="cls-1" cx="290.17" cy="178.71" rx="167.4" ry="77.79" transform="translate(-31.46 66.06) rotate(-12.33)"/>
<path class="cls-11" d="m483.71,246.33c6.16,46.65-77.97,96.66-146.94,111.73-90.32,19.74-170.98,1.71-180.15-40.26-6.6-30.21,59.19-64.87,146.94-111.73,32.11-17.15,48.95-23.4,69.92-23.91,48.33-1.18,105.51,28.42,110.23,64.17Z"/>
<path class="cls-12" d="m413.75,76.82c.88,8.85-6.55,14.86-38.83,41.98-95.16,79.97-93.16,80.38-101.76,84-70.46,29.68-179.32-8.41-186.5-54.51-6.75-43.37,76.07-96.53,146.94-111.73,82.85-17.77,177.17,10.38,180.15,40.26Z"/>
<path class="cls-4" d="m400,50.06c-.01,5.23-5.62,6.9-22.68,29.86-9.98,13.43-15.61,23.03-18.34,27.27-12.89,20.03-54.43,65.83-96.38,82.17-72.52,28.25-183.99-16.79-189.69-67.83-5.23-46.94,79.17-97.42,146.94-111.73,89.76-18.96,180.2,19.23,180.15,40.26Z"/>
</g>
</g>
<path class="cls-17" d="m311.4,239.89c0,1.34-.06,3.35-.27,5.78-.61,6.93-2.12,12.06-3,15-5.05,16.86-7.57,25.29-9.24,29.4-8.68,21.31-26.85,39.38-39.61,51.89-12.6,12.35-30.87,28.2-55.49,43.57l-4.44.41c-11.98,16.33-23.96,32.65-35.94,48.97-2.88,1.6-5.76,3.2-8.64,4.8,18.15-21.67,29.13-40.12,35.86-53.17,4.42-8.57,11.41-23.36,24-42.96,4.75-7.39,8.79-13.14,11-16.26,10.43-14.78,17.15-24.27,27.06-34.49,4.43-4.56,12.89-12.78,18.34-17.89.6-.56,1.8-1.68,3.76-3.53,7.29-6.85,8.62-8.17,11.03-10.39,4.23-3.9,7.45-6.58,11.37-9.85,3.91-3.25,8.67-7.09,14.21-11.28Z"/>
<path class="cls-13" d="m203.79,385.53c7.63-4.77,17.18-11.19,27.69-19.44,19.05-14.95,31.58-28.32,34.68-31.66,9.56-10.33,21.21-24.49,32.51-42.78-.36,1.86-3.26,18.24,8.62,31.6,11.6,13.03,27.67,12.39,29.67,12.27-9.99,8.22-22.35,16.91-37.24,24.73-37.49,19.69-73.05,24.38-95.93,25.29Z"/>
<path class="cls-18" d="m402.98,282.1c2.27-1.04,6-3.11,9.44-6.97,2.93-3.28,4.51-6.58,5.36-8.78.33-7.5.2-27.92-13.42-40.77-19.36-18.27-60.49-16.06-92.97,14.31-4.47,17.97-8.94,35.94-13.4,53.92-.36,2.45-2.1,16.03,7.25,27.94,11.64,14.84,30.11,13.87,31.71,13.76,11.2-10.91,17.72-21.2,21.66-28.85,4.02-7.79,4.71-11.59,8.74-15.84,8.97-9.45,23.88-9.96,35.62-8.72Z"/>
<g>
<path class="cls-14" d="m417.86,264.27c-5.99,1.04-11.99,2.08-17.98,3.12-8.69,0-25.87-.87-28.93-8.82-1.6-4.15.11-11.62-1.98-16.77-.18-.44-1.07-2.55-.4-4.78.16-.54.49-1.57,1.4-1.97,1-.44,2.22.1,2.9.69,1.22,1.05.81,2.26,1.56,2.86,1.68,1.34,8.04-1.25,8.71-5,.72-4.07-5.47-8.43-10.07-10.04-1.26-.44-3.77-.7-8.74-1.22-6.26-.65-9.4-1.07-10.73-.93-.16.02-.3.03-.44.05-1.49.2-2.56.42-2.88.48-2.63.52-4.95.15-4.95.15-.38-.04-.84-.12-1.35-.3-1.16-.42-1.91-1.15-2.29-1.59,1.54-.63,3.82-1.52,6.62-2.44,11.95-3.91,25.14-8.22,39.06-3.42,9.13,3.15,16,9.33,19.68,13.85,1.79,2.19,3.18,4.43,3.37,4.73,3.59,5.81,4.92,10.95,5.74,14.12,1.79,7,1.93,13.06,1.71,17.22Z"/>
<path class="cls-14" d="m372.89,286.46c1.28-3.15,3.24-7,6.31-10.92,6.75-8.6,15.04-12.64,19.56-14.43l5.1,7.48c2.04,5.7,1.91,11.31-.89,13.51-3.01,2.38-10.22.91-12.52.46-.52-.1-1.88-.41-3.72-.39-1.62.02-2.99.28-4.51.68-3.78,1.01-7.23,2.56-9.33,3.6Z"/>
</g>
<g>
<circle class="cls-16" cx="385.54" cy="247.87" r="7.95"/>
<circle class="cls-3" cx="387.05" cy="245.08" r="2.79"/>
</g>
<path class="cls-5" d="m426.99,293.81c.88-2.4,2.22-7.14,1.25-12.95-1.64-9.81-8.66-15.31-10.38-16.59-1.51,3.49-3.02,6.97-4.54,10.46-3.89,2.17-7.77,4.35-11.66,6.52,8.44,4.19,16.88,8.37,25.33,12.56Z"/>
<g>
<path class="cls-5" d="m417.86,264.27c3.09,4.69,6.52,10.91,9.19,18.6,1.51,4.35,2.51,8.41,3.19,12.04-1.07-.34-2.38-.8-3.86-1.43,0,0-1.62-.69-3.2-1.52-3.71-1.94-7.24-4.8-9.36-6.21-2.26-1.5-5.74-3.24-10.95-4.02-.48-1.16-.93-2.54-1.22-4.12-.64-3.57-.19-6.73.45-9.09.27-1,.58-1.85.85-2.53,1.77-.38,3.66-.72,5.66-1,3.33-.46,6.43-.67,9.25-.73Z"/>
<path class="cls-2" d="m402.95,266c-.18.49-.36.98-.53,1.47,3.49,2.64,7.32,5.87,11.23,9.79,4.24,4.25,7.69,8.41,10.46,12.15,1.18,1.21,2.36,2.42,3.54,3.63-3.27-4.91-7.48-10.45-12.84-16.11-4.09-4.32-8.13-7.93-11.86-10.94Z"/>
</g>
<g>
<path class="cls-10" d="m270.73,372.87l11.11,26.94"/>
<path class="cls-7" d="m289.62,364.79c4.34,7.25,8.69,14.5,13.03,21.75"/>
<line class="cls-8" x1="269.93" y1="405.27" x2="312.07" y2="382.47"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

+65
View File
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" viewBox="0 0 240 240" id="svg2" version="1.1" inkscape:version="0.91 r13725" sodipodi:docname="icon.svg" inkscape:export-filename="/usr/src/G1/yaxim/asset-graphics/yak-grass.png" inkscape:export-xdpi="100.07505" inkscape:export-ydpi="100.07505">
<defs id="defs4">
<linearGradient inkscape:collect="always" id="hair-3">
<stop style="stop-color:#803300;stop-opacity:1;" offset="0" id="stop4211"/>
<stop style="stop-color:#632800;stop-opacity:1" offset="1" id="stop4213"/>
</linearGradient>
<linearGradient inkscape:collect="always" id="face-4">
<stop style="stop-color:#7d5d5d;stop-opacity:1" offset="0" id="stop4187"/>
<stop style="stop-color:#653a3a;stop-opacity:1" offset="1" id="stop4189"/>
</linearGradient>
<linearGradient id="horn-6-7" inkscape:collect="always">
<stop id="stop4173" offset="0" style="stop-color:#c8b7b7;stop-opacity:1;"/>
<stop id="stop4175" offset="1" style="stop-color:#916f6f;stop-opacity:1"/>
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#horn-6-7" id="linearGradient4169" x1="163.93039" y1="136.61838" x2="221.33586" y2="103.28334" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.43084117,0,0,0.43178741,-32.504638,816.95133)"/>
<linearGradient inkscape:collect="always" xlink:href="#horn-6-7" id="linearGradient4183" x1="485.88913" y1="130.25711" x2="531.94739" y2="162.58197" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.43084117,0,0,0.43178741,-32.504638,816.95133)"/>
<linearGradient inkscape:collect="always" xlink:href="#face-4" id="linearGradient4191" x1="374.63556" y1="428.83673" x2="371.53345" y2="297.51688" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.43084117,0,0,0.43178741,-32.504638,816.95133)"/>
<linearGradient inkscape:collect="always" xlink:href="#face-4" id="linearGradient4199" x1="476.2699" y1="351.55411" x2="494.49133" y2="344.48303" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.43084117,0,0,0.43178741,-32.504638,816.95133)"/>
<linearGradient inkscape:collect="always" xlink:href="#face-4" id="linearGradient4207" x1="267.55359" y1="363.70987" x2="243.70245" y2="356.63879" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.43084117,0,0,0.43178741,-32.504638,816.95133)"/>
<radialGradient inkscape:collect="always" xlink:href="#hair-3" id="radialGradient4217" cx="374.30594" cy="290.83109" fx="374.30594" fy="290.83109" r="110.27738" gradientTransform="matrix(0.51642294,-0.00883784,0.00347391,0.20388409,-65.930166,877.32132)" gradientUnits="userSpaceOnUse"/>
</defs>
<sodipodi:namedview id="base" pagecolor="#494745" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:zoom="2.8284271" inkscape:cx="28.129339" inkscape:cy="114.93147" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" inkscape:window-width="1920" inkscape:window-height="1029" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" units="px" showguides="false">
<inkscape:grid type="xygrid" id="grid5353" originx="20" originy="20" spacingx="10" spacingy="10"/>
</sodipodi:namedview>
<metadata id="metadata7">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-812.36216)">
<path style="fill:#99cc33;fill-opacity:1;stroke:#669900;stroke-width:4.86499977;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 53.269531,845.17578 c -10.266673,0.27991 -19.576776,9.05841 -20.373047,19.375 -0.26138,20.53097 -0.03593,41.07704 -0.111328,61.61377 0.05527,24.53746 -0.11011,49.08127 0.0819,73.61482 0.621828,10.71753 10.383803,19.87393 21.128864,19.78623 44.355126,-0.013 88.714509,0.078 133.067589,-0.045 10.73105,-0.4371 20.03681,-10.06 20.13139,-20.79981 0.009,-44.47334 0.0809,-88.95148 -0.0357,-133.42297 -0.42153,-10.46516 -9.65497,-19.63915 -20.03422,-20.0919 -44.6149,-0.11601 -89.238883,-0.0556 -133.855489,-0.0301 z" id="rect3450-3" inkscape:connector-curvature="0"/>
<path style="fill:#669900;fill-opacity:1;fill-rule:evenodd;stroke:#669900;stroke-width:1.19520223px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 38.515721,918.34836 c 10.153917,-33.55991 1.580157,-9.90509 18.878429,16.61745 2.012347,-8.48401 0.912034,-11.20893 3.728838,-27.27196 2.379487,10.84674 6.650859,27.91872 13.044822,34.69493 6.400509,-4.36969 11.61382,-12.34846 17.248541,-18.62057 3.295109,-4.28321 10.061749,-18.57227 9.496769,-4.33479 0.82159,6.10771 2.27229,20.6289 6.22927,19.60063 4.72677,-11.44421 3.29557,-46.95893 10.61584,-55.94089 2.59523,29.15561 12.24177,39.269 21.03786,5.12515 1.20391,14.14385 7.17312,22.32945 11.5106,32.74898 1.02162,3.02994 3.98033,14.80846 3.30568,5.2513 3.112,-14.57771 5.72674,13.26446 10.19135,8.38642 3.23087,-9.85848 3.38164,-13.10423 7.14522,-22.69087 4.36856,-26.44247 -1.00942,-3.47087 12.66614,20.55863 9.83166,-23.16191 6.30039,-52.63407 11.75854,6.50228 2.73098,-8.50802 4.24473,-23.67634 5.87972,-27.20895 3.0054,10.94164 6.25616,17.73384 5.94973,30.15986 0.55323,12.4288 -0.0479,24.91693 0.44471,37.3202 -1.65107,12.07059 -1.53944,26.25464 -9.9972,32.92814 -7.39708,9.6221 -17.81944,4.4354 -26.71442,6.6529 -12.35655,3.5218 -25.10876,1.3684 -37.6455,1.9068 -14.93086,0.8338 -29.80367,-2.4911 -44.743153,-1.5038 -14.698821,-0.2743 -29.669186,1.7255 -44.010515,-3.8641 -8.413667,-6.1703 -11.741297,-21.52304 -12.078954,-34.33751 -2.350132,-29.67846 0.341394,-36.69079 6.057683,-62.68023 z" id="path4197" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccccccccccccccc"/>
<path style="fill:#4c7800;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 38.183767,974.46578 c 1.125388,-3.25592 3.691308,-13.922 4.520832,-5.10924 3.528397,6.00636 1.465648,13.15556 2.587646,19.71831 3.229295,-0.37355 5.346597,-9.99777 6.32655,-14.43519 1.85021,7.02583 3.854887,14.1364 8.724737,19.79695 2.497566,-3.42027 2.926958,-9.49874 5.154944,-13.80332 1.075234,-3.49721 4.319041,-6.99851 5.090463,-1.32089 2.409525,7.63579 3.680854,16.14546 9.170615,22.3859 6.365047,0.6367 7.544458,-9.3862 10.056699,-13.84277 4.197301,-10.36624 11.092337,-19.38831 15.597357,-29.58218 4.83312,-5.07432 4.81333,6.60783 7.08119,9.34229 3.58646,9.94509 6.22094,20.35999 11.03628,29.7711 5.30954,6.17606 6.01006,-8.29794 9.88477,-10.69399 3.51571,1.7617 3.40407,12.27625 7.25147,10.95891 2.58805,-6.44985 4.92169,-12.96839 6.43875,-19.74445 2.51003,-2.80506 2.90985,12.35197 8.78685,7.29604 2.58121,-5.29019 4.70103,-11.80212 10.21325,-14.79395 6.14772,1.22743 2.97818,10.85611 7.03881,15.00086 3.33086,9.11976 6.63837,-3.03364 9.63101,-5.88045 1.61196,-3.07383 3.85618,-7.28598 4.22063,-1.64528 1.11168,3.26036 0.84743,13.56286 5.19729,11.20021 2.8324,-5.41483 2.92539,-10.20999 9.34521,-19.35545 5.06547,12.33161 8.87029,26.05954 2.96798,37.76131 -1.26925,9.0966 -11.14031,10.2574 -18.41187,12.2102 -8.52172,1.09 -17.24804,0.2031 -25.85201,0.504 -14.29863,0.067 -28.57511,-0.1857 -42.86349,0.3377 -6.03701,-0.6015 -12.10213,-0.5491 -18.114569,-0.3437 -7.030939,-0.8427 -14.137698,0.8658 -21.114055,-0.7193 -6.148516,-0.2699 -12.455199,-2.2202 -18.425624,0.2232 -18.523823,2.33 -29.725482,-7.2061 -29.01334,-23.34892 -0.793226,-3.96804 5.573212,-17.68678 7.471625,-21.8879 z" id="path4174" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccccccccccccccccccccc"/>
<rect ry="21.962282" rx="21.962288" y="844.79456" x="32.43243" height="175.13513" width="175.13513" id="rect3450" style="fill:none;fill-opacity:1;stroke:#669900;stroke-width:4.865;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
<g id="g4262" transform="translate(-4.8361402,0)">
<path sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" inkscape:connector-curvature="0" id="path4272" d="m 126.58306,1042.1389 c -7.09035,0.1774 -13.66992,-2.7851 -18.75841,-7.5104 -5.88417,-4.2836 -9.381015,-10.8254 -12.749868,-17.1103 -4.208493,-8.5784 -9.094199,-16.9566 -10.92662,-26.51907 -1.803917,-5.76691 0.331622,-4.9829 -6.286858,-6.52366 -2.3545,-0.6022 -2.933021,-0.65562 -5.127509,-1.49781 -3.307555,-1.66113 -6.82072,-4.90316 -6.026895,-9.14553 0.08147,-3.34016 2.748025,-9.29511 3.97469,-12.04361 0.91534,-1.65692 3.058877,-3.12108 2.201741,-5.09228 0.528801,-4.64531 1.345241,-9.54102 3.378281,-13.64115 1.236436,-2.65573 3.147097,-5.53074 4.609704,-8.02095 -2.195938,-0.96604 -5.210293,2.93179 -6.487379,0.82212 -0.05406,-2.05336 1.505113,-4.40962 2.594297,-6.2735 1.73941,-2.94874 7.683875,-3.44611 1.047935,-5.04802 -5.486425,-2.00028 -9.771628,-5.95319 -14.096424,-9.8264 -2.303704,-3.44345 -6.15485,-5.84069 -8.525329,-9.37725 -2.884844,-3.50736 -6.066033,-7.57438 -7.448098,-11.71551 -2.096051,-4.05535 -4.085075,-8.10164 -6.226413,-12.065 -2.121078,-4.13334 -3.183825,-8.15761 -3.862042,-12.64611 -0.06224,-2.65508 -0.532585,-6.54839 -0.815643,-8.27126 0.146292,-4.44179 0.668419,-9.14264 1.83774,-13.69518 0.496324,-2.98753 1.323428,-6.24528 1.353207,-8.70666 0.302197,-6.21234 4.301217,-11.87896 9.239082,-15.46794 0.379912,5.04446 0.214517,10.87118 0.867348,15.306 0.285403,3.27095 1.176012,5.65808 2.405197,8.49605 1.690048,2.85054 3.807757,6.79173 5.929922,10.01148 3.585485,4.56445 7.808228,9.47947 11.02808,14.55661 1.598335,2.04308 3.157992,4.77727 5.234862,6.7205 1.494321,2.05329 3.399273,3.43578 4.942179,4.93772 2.983537,3.21707 6.504731,5.61338 9.541551,8.54921 1.606526,1.5923 3.269674,2.74249 4.456728,3.85064 2.857588,2.65316 4.760789,3.96737 9.665604,8.18004 1.89317,1.33926 3.9661,3.22774 4.83934,2.24536 4.5159,-1.78631 10.39091,-1.34346 15.34674,0.41505 1.55667,0.69093 3.27329,2.71745 4.68732,2.1484 3.76411,-3.51423 9.3342,-4.94278 14.37801,-4.82612 3.05916,0.33108 3.99723,-3.05457 6.18447,-4.5005 5.01848,-6.46319 11.4081,-11.62361 17.09092,-17.33168 1.36158,-2.02375 4.40218,-5.33511 6.04822,-7.83666 1.81188,-2.27416 3.88026,-6.43952 5.52961,-8.21422 3.55278,-5.41595 7.22461,-11.1506 9.7389,-16.74806 2.53507,-6.56673 5.91343,-12.68945 7.94775,-18.97709 0.5899,-1.78877 1.77538,-3.52089 2.06935,-5.44175 1.69184,-2.13109 3.95725,1.31247 4.91473,2.71372 3.44757,6.2125 4.5866,12.96437 6.71963,19.50302 2.04198,8.06207 0.6828,16.88473 -1.69602,24.90312 -1.00747,6.46671 -3.55283,13.37555 -5.51135,19.26871 -0.26761,1.80626 -2.05447,4.9708 -3.18281,6.58997 -2.77196,5.62244 -6.87337,10.26188 -10.77642,15.01436 -3.91191,4.20367 -8.16947,8.32363 -13.11539,10.98009 -1.3679,0.0317 -4.20256,1.85775 -1.70564,3.43976 1.08194,1.47816 3.06663,4.95188 -0.13991,4.60357 -3.22443,-0.54393 -6.79533,-0.15054 -2.64276,2.96154 3.23213,3.91664 3.4291,10.06727 2.59427,14.83218 1.43984,0.7415 4.8641,1.57501 5.2188,4.62545 2.63582,6.29969 7.64664,11.96238 9.0529,18.41008 0.17894,2.944 -1.38965,4.87826 -2.79168,6.78295 -2.79418,2.67527 -7.15063,3.8727 -11.17285,2.61969 -2.78489,-1.28268 -1.52093,3.80886 -2.36034,5.22389 -1.20787,6.5517 -3.81355,12.30606 -7.1399,17.90839 -2.94235,6.1633 -6.02787,12.0681 -9.82112,17.7466 -2.21619,2.6131 -4.44333,5.2258 -6.85245,7.6824 -7.05077,7.3235 -11.24756,12.073 -20.42298,12.025 z" style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.43099999;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
<path sodipodi:nodetypes="ccccccccccccccc" inkscape:connector-curvature="0" id="path4270" d="m 124.94764,1039.4395 c 0.45196,-5.4315 2.23538,-13.306 -4.43943,-14.0383 -2.36257,-1.1866 -2.18981,-4.3763 0.35274,-5.2857 3.61766,-2.0579 7.58221,-3.6452 11.57249,-1.6342 3.6779,1.8919 2.40163,7.901 -1.82318,7.5412 -3.54555,-0.4379 -2.81783,2.8858 -2.88188,4.5135 0.0932,3.4069 0.46995,10.8351 5.66537,7.4806 4.83252,-2.1883 8.82018,-6.011 12.19586,-10.561 3.25582,-3.3427 6.73813,-7.1379 9.41477,-11.5532 2.40167,-3.1021 -2.18401,-4.8065 -2.18401,-4.8065 -11.22713,-6.5688 -24.74797,-9.3533 -37.52649,-6.6627 -4.89674,1.8141 -9.9689,3.4359 -14.59616,5.7852 -3.735505,1.4671 -5.812815,3.9107 -2.377214,7.6579 3.544274,6.2296 7.527934,12.4324 13.657084,16.4724 3.59928,2.9931 8.22809,5.2943 12.97005,5.0908 z" style="fill:#ffccaa;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4268" d="m 127.77864,1028.5536 c -0.33143,-0.8631 -0.24671,0.764 0,0 z" style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4266" d="m 95.110116,1009.9642 c 6.192304,-5.004 14.119014,-7.0315 21.552834,-9.4869 9.08852,-1.25252 18.93599,-0.63338 27.72462,2.8106 4.74516,1.6946 9.05975,4.2725 13.38615,6.7895 3.13085,-6.5983 7.19946,-12.69759 9.14372,-19.6641 1.67898,-9.12788 2.87027,-18.79835 3.24203,-27.77863 1.53706,-4.32197 -3.75501,-3.65998 -3.47044,-7.73059 -1.44979,-6.71739 -7.96946,-10.61799 -12.6846,-15.02827 -1.55845,-1.15439 -4.14997,-4.49449 -5.25038,-1.18211 -2.40033,3.80647 -3.79028,7.11535 -6.00666,11.28136 -1.30501,1.78827 -1.81869,3.89215 -3.05086,5.17836 -0.5988,2.77893 -4.94597,3.73813 -5.68516,0.5474 -2.49235,-3.2659 -5.10802,-6.44695 -7.22391,-10.03014 -1.90244,-2.6233 -4.22002,-4.87591 -5.57647,-7.80881 -3.00792,5.05715 -6.55362,9.70305 -9.49124,14.75691 -0.60225,1.41966 -5.62843,5.42602 -1.34103,4.74166 3.66716,0.75186 6.89516,3.76168 8.67136,6.9249 0.81715,2.15796 2.76089,5.04151 1.42371,8.05265 -1.46661,4.72243 -3.65888,9.56592 -8.52601,11.30075 -1.60292,0.77239 -4.76075,0.47482 -6.73336,-0.58595 -5.260678,-3.75463 -6.028115,-11.55234 -5.243684,-16.73457 1.044694,-3.26092 2.599224,-6.24966 5.441354,-8.22714 1.20609,-0.66012 -1.40213,-2.00638 -1.9847,-2.89876 -3.18084,-1.26913 -7.97928,-13.18968 -9.545105,-6.40156 -0.916812,3.77918 -1.658102,8.16512 -1.785957,11.76495 1.056162,2.38327 -2.268368,4.18328 -3.999083,-0.0136 -1.211268,-4.84004 -5.132394,-12.13358 -3.989331,-2.39447 -1.400776,8.53844 -1.840117,17.37535 0.774106,25.67913 1.079416,3.56658 1.605863,7.08664 3.054079,10.30129 1.777301,5.55088 3.68378,11.15954 6.85241,16.05254 l 0.32238,-0.2167 -8.61e-4,3e-4 z" style="fill:url(#linearGradient4191);fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4264" d="m 144.75917,985.10612 c -5.00323,-0.74681 -5.72318,-6.80041 -7.3575,-10.81229 -1.24824,-5.51939 -2.30247,-12.69374 3.16981,-16.22504 4.08828,-3.257 10.85078,-3.87544 14.41456,0.61584 2.91703,4.09468 3.1902,10.22 2.49912,15.16856 -1.43353,5.62842 -6.08105,11.95636 -12.72599,11.25293 z" style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4262" d="m 146.49725,982.37512 c 7.49728,-2.18714 9.9371,-11.63828 7.74831,-18.50959 -0.39137,-4.62761 -5.17127,-7.51551 -9.27625,-5.40849 -4.20824,1.23546 -6.89632,6.00195 -5.81471,10.41253 0.63271,4.5578 1.74702,9.53483 4.7217,13.0716 0.74176,0.51785 1.77674,0.67856 2.62095,0.43395 z" style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path4260" d="m 148.64583,963.35949 c 5.70461,2.5998 3.15538,13.82318 0.29976,15.25607 -6.93873,3.76236 -6.10181,-15.13758 -0.29976,-15.25607 z" style="fill:#2b1100;fill-opacity:1;stroke:none;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4258" d="m 145.85926,972.31023 c 4.59816,-4.00808 -4.89135,-2.59786 0,0 z" style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4256" d="m 81.053927,982.22661 c 0.561925,-2.45753 -0.06169,-6.15944 -0.137593,-8.63166 -1.094328,-4.78181 0.299555,-9.22834 -0.122532,-14.11748 0.161803,-2.50547 0.891665,-4.76478 1.021637,-7.25404 -3.121039,4.12073 -7.144058,8.16819 -9.543605,13.01839 -0.87811,3.60041 -2.021231,6.12013 -2.776901,9.66665 -0.162836,5.82203 6.924755,7.75301 11.558994,7.31814 z" style="fill:url(#linearGradient4207);fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4254" d="m 108.90781,981.26062 c 1.92403,-0.0999 3.36222,-0.88527 5.10546,-2.74132 3.47829,-3.71814 4.96745,-9.54241 2.11005,-13.86037 -1.66599,-4.28446 -8.7801,-6.84792 -11.25498,-1.94187 -3.51007,5.32384 -3.07282,13.3211 1.21849,18.09334 l 1.52844,0.51677 1.29252,-0.0666 z" style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4252" d="m 108.8755,978.71903 c -6.60916,-2.24108 -2.27162,-19.00122 4.29366,-13.12054 2.50053,3.91366 2.75349,14.36784 -4.29366,13.12054 z" style="fill:#2b1100;fill-opacity:1;stroke:none;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4250" d="m 108.47887,974.48353 c 4.49073,-4.73386 -5.62263,-2.69987 0,0 z" style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4248" d="m 176.60372,979.50001 c 5.4633,-0.0564 9.99716,-6.9663 6.29891,-11.66927 -2.65752,-5.03255 -5.58145,-10.36989 -8.44524,-15.06528 -4.38273,0.14275 -0.35238,6.60365 -1.17551,9.59416 -0.0721,5.26761 -1.07664,10.66993 -1.24098,16.24966 1.37488,0.72275 3.19541,0.52242 4.56282,0.89073 z" style="fill:url(#linearGradient4199);fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4246" d="m 89.731453,956.60697 c 0.173568,-5.32519 -0.180447,-12.28655 5.590404,-15.12102 3.150277,4.44276 6.829553,8.58454 10.641823,12.51176 1.78954,-0.74636 1.51349,-0.69393 2.26558,-2.042 3.43702,-5.55328 7.52336,-10.67604 10.35257,-16.57298 3.69459,-3.67658 6.25146,1.55308 7.91672,4.53411 3.388,3.53988 5.66824,8.0974 8.45311,11.82223 1.24654,2.14342 2.68433,1.81345 3.26416,-0.6616 2.25969,-3.77661 3.65235,-7.0567 5.58798,-10.58719 1.59373,-2.35421 3.20008,-8.23864 6.75011,-6.10697 6.559,3.57532 11.6129,9.23252 16.74379,14.60182 1.62457,4.57232 3.12993,-0.021 2.91127,-2.8438 0.95345,-5.01345 -0.92851,-9.47647 -4.50774,-13.06986 -1.39257,-1.62992 -5.63419,-4.54815 -2.31103,-6.30336 1.2542,1.08333 6.39428,3.0371 6.33144,0.26069 -3.04194,-4.9365 -7.15441,-9.72873 -12.75704,-11.84722 -4.15491,-2.52854 -14.9926,-0.15831 -16.21165,-2.76621 2.66453,-2.53008 7.20354,-4.15112 9.82517,-5.49947 -6.38683,-0.74863 -13.1544,-1.07072 -18.77168,2.71324 -3.12054,3.87803 -6.69441,0.41676 -10.15969,-0.76382 -6.5254,-1.4538 -13.70751,-1.06917 -19.3361,3.10596 -2.653329,2.48141 12.14927,4.1582 3.87421,6.51493 -6.03041,2.69933 -12.782689,3.78789 -17.92203,7.95704 -3.678534,2.50206 -9.002231,2.69938 -11.516492,6.77552 2.305328,0.54308 12.505332,-2.07178 6.860956,3.89175 -2.831323,5.15423 -7.162303,10.01721 -7.691565,16.00843 4.312504,-4.6541 11.665769,-10.9461 11.934718,0.74294 -0.03555,0.94448 0.609548,3.29376 1.881006,2.74508 z" style="fill:url(#radialGradient4217);fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4242" d="m 86.145969,923.85117 c 4.587176,-3.61061 10.154469,-5.93937 15.853441,-6.68536 -1.53265,-1.9481 -12.18342,-0.70676 -3.956101,-5.25409 1.536719,-1.6878 8.365841,-3.87014 5.046641,-5.70064 -4.789838,-3.50948 -9.025174,-8.27479 -14.230512,-11.85683 -3.045864,-2.47926 -5.577902,-5.43696 -8.580939,-7.64059 -0.572717,1.68718 -1.717362,1.45856 -3.152146,3.13608 -1.628709,1.50462 -4.094887,3.57826 -5.733969,3.78124 -2.408785,-1.53229 -0.5903,-3.93488 1.734893,-4.71833 1.722184,-0.81617 3.098347,-2.50094 3.926406,-3.56869 2.085069,-0.62836 -0.840701,-2.62968 -1.788628,-3.61902 -0.804505,-1.19274 -2.714621,-2.21899 -2.372178,-3.07321 -2.251751,-0.82342 -3.142816,-3.71537 -4.765386,-5.31631 -4.036603,-5.53463 -7.522991,-11.09371 -12.125029,-16.01425 -2.306047,0.69273 -3.96513,2.78847 -6.60286,2.17672 -2.497742,0.26259 -4.396942,-5.17935 -0.778906,-3.24898 2.145206,0.19025 6.888711,-1.44907 4.292002,-4.09223 -1.298724,-2.40367 -3.449949,-6.20431 -4.204114,-7.77215 -1.964442,-2.47961 -0.393332,-8.17203 -0.909231,-11.5122 0.365733,-8.32558 -2.299744,-1.45835 -3.420584,1.47812 -1.561137,6.63686 -1.820903,13.26144 -3.671306,19.85281 -0.403021,6.52554 -0.243852,12.32979 1.15104,18.6792 0.819796,3.20877 1.959534,6.37947 3.571534,9.26185 2.901689,0.23343 5.415028,-1.88815 7.559153,-3.88609 1.571984,-2.16599 4.304249,1.54186 2.017856,2.57414 -2.001222,2.21812 -4.954513,5.07688 -7.913833,4.35006 3.365297,6.99412 6.403429,14.19299 11.861699,19.90966 3.409578,3.99881 7.238373,7.53105 10.661436,11.05544 2.123897,0.87931 3.677617,4.50276 6.073495,2.53301 2.127989,-1.58334 13.3692,-8.10752 7.831136,-2.27185 -2.387397,1.82721 -4.572762,3.34597 -6.893467,4.68476 1.774778,1.09113 4.136502,1.85865 6.389633,2.56233 1.198958,-0.66097 2.022411,0.0783 3.128824,0.1954 z" style="fill:url(#linearGradient4169);fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4240" d="m 170.16763,922.04792 c 4.16178,-1.02835 7.67158,-4.26231 11.00661,-7.07162 4.41106,-4.53441 8.35929,-9.01617 11.86917,-14.50443 1.05207,-1.02203 2.83507,-3.00253 1.80989,-4.10513 -3.24255,0.32116 -6.40267,-2.60384 -6.78757,-5.6632 2.76236,-1.78156 5.37447,5.65599 9.2717,2.49561 2.00989,-4.28631 3.27652,-8.97751 4.8138,-13.1922 1.57418,-5.20838 2.43067,-10.50309 3.8092,-15.47958 0.45775,-2.46254 1.10234,-3.96741 1.10565,-6.94924 0.74471,-3.36167 0.14202,-5.69807 -3.93393,-4.56689 -5.85517,-1.3395 -0.73417,-4.04059 2.95664,-2.87549 1.75194,-1.82696 -0.90112,-5.48718 -1.17947,-8.04915 -0.90657,-2.14667 -1.04157,-4.40977 -1.93894,-6.381 -0.66906,-3.06039 -1.99643,-6.05579 -3.84838,-8.53548 -1.81396,5.14469 -3.99616,10.13578 -6.10508,15.18764 -1.32168,4.53232 -3.81415,8.67942 -5.53444,12.68826 -2.85204,5.36797 -6.04907,9.77903 -9.20999,14.90104 5.11484,0.0256 10.90093,-0.37726 14.67172,-4.20549 2.1993,-0.23438 2.71951,2.16469 1.04341,3.09553 -2.22942,2.40289 -5.129,2.96104 -8.07984,3.91843 -3.68442,1.51983 -8.72364,-2.48989 -10.24859,1.02972 -3.12732,4.63718 -6.28503,8.77715 -10.23307,12.91915 -4.60723,4.39994 -9.8012,8.68205 -13.47735,13.68076 2.9809,2.50887 8.47607,2.87451 12.04683,0.91128 2.94045,4.77113 -12.66012,2.01493 -14.97059,1.80235 4.41884,0.88877 15.86554,9.28826 4.34515,7.36554 -7.84996,1.32913 2.89574,1.19752 5.46354,2.64387 4.4323,2.02212 8.34712,5.55519 11.33393,8.93972 z" style="fill:url(#linearGradient4183);fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4238" d="m 186.4269,913.81595 c -0.79257,-0.24807 -0.13619,0.26364 0,0 z" style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4236" d="m 207.6889,869.52893 c -0.47547,-0.49648 -0.62037,0.19284 0,0 z" style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path4234" d="m 51.535953,858.9088 c -0.109095,-0.29681 -0.559784,0.29265 0,0 z" style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
<path inkscape:connector-curvature="0" id="path3429" d="m 55.041894,857.36439 c -1.179898,-0.26619 -0.275201,0.27547 0,0 z" style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.43131402;stroke-opacity:1"/>
</g>
<path style="fill:#000000;stroke:#000000;stroke-opacity:1" d="" id="path3427" inkscape:connector-curvature="0"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 24 KiB

+100
View File
@@ -0,0 +1,100 @@
/*!* Platform.js <https://mths.be/platform>
* Copyright 2014-2018 Benjamin Tan <https://bnjmnt4n.now.sh/>
* Copyright 2011-2013 John-David Dalton <http://allyoucanleet.com/>
* Available under MIT license <https://mths.be/mit>*/;(function(){'use strict';var objectTypes={'function':true,'object':true};var root=(objectTypes[typeof window]&&window)||this;var oldRoot=root;var freeExports=objectTypes[typeof exports]&&exports;var freeModule=objectTypes[typeof module]&&module&&!module.nodeType&&module;var freeGlobal=freeExports&&freeModule&&typeof global=='object'&&global;if(freeGlobal&&(freeGlobal.global===freeGlobal||freeGlobal.window===freeGlobal||freeGlobal.self===freeGlobal)){root=freeGlobal;}
var maxSafeInteger=Math.pow(2,53)-1;var reOpera=/\bOpera/;var thisBinding=this;var objectProto=Object.prototype;var hasOwnProperty=objectProto.hasOwnProperty;var toString=objectProto.toString;function capitalize(string){string=String(string);return string.charAt(0).toUpperCase()+string.slice(1);}
function cleanupOS(os,pattern,label){var data={'10.0':'10','6.4':'10 Technical Preview','6.3':'8.1','6.2':'8','6.1':'Server 2008 R2 / 7','6.0':'Server 2008 / Vista','5.2':'Server 2003 / XP 64-bit','5.1':'XP','5.01':'2000 SP1','5.0':'2000','4.0':'NT','4.90':'ME'};if(pattern&&label&&/^Win/i.test(os)&&!/^Windows Phone /i.test(os)&&(data=data[/[\d.]+$/.exec(os)])){os='Windows '+data;}
os=String(os);if(pattern&&label){os=os.replace(RegExp(pattern,'i'),label);}
os=format(os.replace(/ ce$/i,' CE').replace(/\bhpw/i,'web').replace(/\bMacintosh\b/,'Mac OS').replace(/_PowerPC\b/i,' OS').replace(/\b(OS X) [^ \d]+/i,'$1').replace(/\bMac (OS X)\b/,'$1').replace(/\/(\d)/,' $1').replace(/_/g,'.').replace(/(?: BePC|[ .]*fc[ \d.]+)$/i,'').replace(/\bx86\.64\b/gi,'x86_64').replace(/\b(Windows Phone) OS\b/,'$1').replace(/\b(Chrome OS \w+) [\d.]+\b/,'$1').split(' on ')[0]);return os;}
function each(object,callback){var index=-1,length=object?object.length:0;if(typeof length=='number'&&length>-1&&length<=maxSafeInteger){while(++index<length){callback(object[index],index,object);}}else{forOwn(object,callback);}}
function format(string){string=trim(string);return /^(?:webOS|i(?:OS|P))/.test(string)?string:capitalize(string);}
function forOwn(object,callback){for(var key in object){if(hasOwnProperty.call(object,key)){callback(object[key],key,object);}}}
function getClassOf(value){return value==null?capitalize(value):toString.call(value).slice(8,-1);}
function isHostType(object,property){var type=object!=null?typeof object[property]:'number';return!/^(?:boolean|number|string|undefined)$/.test(type)&&(type=='object'?!!object[property]:true);}
function qualify(string){return String(string).replace(/([ -])(?!$)/g,'$1?');}
function reduce(array,callback){var accumulator=null;each(array,function(value,index){accumulator=callback(accumulator,value,index,array);});return accumulator;}
function trim(string){return String(string).replace(/^ +| +$/g,'');}
function parse(ua){var context=root;var isCustomContext=ua&&typeof ua=='object'&&getClassOf(ua)!='String';if(isCustomContext){context=ua;ua=null;}
var nav=context.navigator||{};var userAgent=nav.userAgent||'';ua||(ua=userAgent);var isModuleScope=isCustomContext||thisBinding==oldRoot;var likeChrome=isCustomContext?!!nav.likeChrome:/\bChrome\b/.test(ua)&&!/internal|\n/i.test(toString.toString());var objectClass='Object',airRuntimeClass=isCustomContext?objectClass:'ScriptBridgingProxyObject',enviroClass=isCustomContext?objectClass:'Environment',javaClass=(isCustomContext&&context.java)?'JavaPackage':getClassOf(context.java),phantomClass=isCustomContext?objectClass:'RuntimeObject';var java=/\bJava/.test(javaClass)&&context.java;var rhino=java&&getClassOf(context.environment)==enviroClass;var alpha=java?'a':'\u03b1';var beta=java?'b':'\u03b2';var doc=context.document||{};var opera=context.operamini||context.opera;var operaClass=reOpera.test(operaClass=(isCustomContext&&opera)?opera['[[Class]]']:getClassOf(opera))?operaClass:(opera=null);var data;var arch=ua;var description=[];var prerelease=null;var useFeatures=ua==userAgent;var version=useFeatures&&opera&&typeof opera.version=='function'&&opera.version();var isSpecialCasedOS;var layout=getLayout([{'label':'EdgeHTML','pattern':'Edge'},'Trident',{'label':'WebKit','pattern':'AppleWebKit'},'iCab','Presto','NetFront','Tasman','KHTML','Gecko']);var name=getName(['Adobe AIR','Arora','Avant Browser','Breach','Camino','Electron','Epiphany','Fennec','Flock','Galeon','GreenBrowser','iCab','Iceweasel','K-Meleon','Konqueror','Lunascape','Maxthon',{'label':'Microsoft Edge','pattern':'Edge'},'Midori','Nook Browser','PaleMoon','PhantomJS','Raven','Rekonq','RockMelt',{'label':'Samsung Internet','pattern':'SamsungBrowser'},'SeaMonkey',{'label':'Silk','pattern':'(?:Cloud9|Silk-Accelerated)'},'Sleipnir','SlimBrowser',{'label':'SRWare Iron','pattern':'Iron'},'Sunrise','Swiftfox','Waterfox','WebPositive','Opera Mini',{'label':'Opera Mini','pattern':'OPiOS'},'Opera',{'label':'Opera','pattern':'OPR'},'Chrome',{'label':'Chrome Mobile','pattern':'(?:CriOS|CrMo)'},{'label':'Firefox','pattern':'(?:Firefox|Minefield)'},{'label':'Firefox for iOS','pattern':'FxiOS'},{'label':'IE','pattern':'IEMobile'},{'label':'IE','pattern':'MSIE'},'Safari']);var product=getProduct([{'label':'BlackBerry','pattern':'BB10'},'BlackBerry',{'label':'Galaxy S','pattern':'GT-I9000'},{'label':'Galaxy S2','pattern':'GT-I9100'},{'label':'Galaxy S3','pattern':'GT-I9300'},{'label':'Galaxy S4','pattern':'GT-I9500'},{'label':'Galaxy S5','pattern':'SM-G900'},{'label':'Galaxy S6','pattern':'SM-G920'},{'label':'Galaxy S6 Edge','pattern':'SM-G925'},{'label':'Galaxy S7','pattern':'SM-G930'},{'label':'Galaxy S7 Edge','pattern':'SM-G935'},'Google TV','Lumia','iPad','iPod','iPhone','Kindle',{'label':'Kindle Fire','pattern':'(?:Cloud9|Silk-Accelerated)'},'Nexus','Nook','PlayBook','PlayStation Vita','PlayStation','TouchPad','Transformer',{'label':'Wii U','pattern':'WiiU'},'Wii','Xbox One',{'label':'Xbox 360','pattern':'Xbox'},'Xoom']);var manufacturer=getManufacturer({'Apple':{'iPad':1,'iPhone':1,'iPod':1},'Archos':{},'Amazon':{'Kindle':1,'Kindle Fire':1},'Asus':{'Transformer':1},'Barnes & Noble':{'Nook':1},'BlackBerry':{'PlayBook':1},'Google':{'Google TV':1,'Nexus':1},'HP':{'TouchPad':1},'HTC':{},'LG':{},'Microsoft':{'Xbox':1,'Xbox One':1},'Motorola':{'Xoom':1},'Nintendo':{'Wii U':1,'Wii':1},'Nokia':{'Lumia':1},'Samsung':{'Galaxy S':1,'Galaxy S2':1,'Galaxy S3':1,'Galaxy S4':1},'Sony':{'PlayStation':1,'PlayStation Vita':1}});var os=getOS(['Windows Phone','Android','CentOS',{'label':'Chrome OS','pattern':'CrOS'},'Debian','Fedora','FreeBSD','Gentoo','Haiku','Kubuntu','Linux Mint','OpenBSD','Red Hat','SuSE','Ubuntu','Xubuntu','Cygwin','Symbian OS','hpwOS','webOS ','webOS','Tablet OS','Tizen','Linux','Mac OS X','Macintosh','Mac','Windows 98;','Windows ']);function getLayout(guesses){return reduce(guesses,function(result,guess){return result||RegExp('\\b'+(guess.pattern||qualify(guess))+'\\b','i').exec(ua)&&(guess.label||guess);});}
function getManufacturer(guesses){return reduce(guesses,function(result,value,key){return result||(value[product]||value[/^[a-z]+(?: +[a-z]+\b)*/i.exec(product)]||RegExp('\\b'+qualify(key)+'(?:\\b|\\w*\\d)','i').exec(ua))&&key;});}
function getName(guesses){return reduce(guesses,function(result,guess){return result||RegExp('\\b'+(guess.pattern||qualify(guess))+'\\b','i').exec(ua)&&(guess.label||guess);});}
function getOS(guesses){return reduce(guesses,function(result,guess){var pattern=guess.pattern||qualify(guess);if(!result&&(result=RegExp('\\b'+pattern+'(?:/[\\d.]+|[ \\w.]*)','i').exec(ua))){result=cleanupOS(result,pattern,guess.label||guess);}
return result;});}
function getProduct(guesses){return reduce(guesses,function(result,guess){var pattern=guess.pattern||qualify(guess);if(!result&&(result=RegExp('\\b'+pattern+' *\\d+[.\\w_]*','i').exec(ua)||RegExp('\\b'+pattern+' *\\w+-[\\w]*','i').exec(ua)||RegExp('\\b'+pattern+'(?:; *(?:[a-z]+[_-])?[a-z]+\\d+|[^ ();-]*)','i').exec(ua))){if((result=String((guess.label&&!RegExp(pattern,'i').test(guess.label))?guess.label:result).split('/'))[1]&&!/[\d.]+/.test(result[0])){result[0]+=' '+result[1];}
guess=guess.label||guess;result=format(result[0].replace(RegExp(pattern,'i'),guess).replace(RegExp('; *(?:'+guess+'[_-])?','i'),' ').replace(RegExp('('+guess+')[-_.]?(\\w)','i'),'$1 $2'));}
return result;});}
function getVersion(patterns){return reduce(patterns,function(result,pattern){return result||(RegExp(pattern+
'(?:-[\\d.]+/|(?: for [\\w-]+)?[ /-])([\\d.]+[^ ();/_-]*)','i').exec(ua)||0)[1]||null;});}
function toStringPlatform(){return this.description||'';}
layout&&(layout=[layout]);if(manufacturer&&!product){product=getProduct([manufacturer]);}
if((data=/\bGoogle TV\b/.exec(product))){product=data[0];}
if(/\bSimulator\b/i.test(ua)){product=(product?product+' ':'')+'Simulator';}
if(name=='Opera Mini'&&/\bOPiOS\b/.test(ua)){description.push('running in Turbo/Uncompressed mode');}
if(name=='IE'&&/\blike iPhone OS\b/.test(ua)){data=parse(ua.replace(/like iPhone OS/,''));manufacturer=data.manufacturer;product=data.product;}
else if(/^iP/.test(product)){name||(name='Safari');os='iOS'+((data=/ OS ([\d_]+)/i.exec(ua))?' '+data[1].replace(/_/g,'.'):'');}
else if(name=='Konqueror'&&!/buntu/i.test(os)){os='Kubuntu';}
else if((manufacturer&&manufacturer!='Google'&&((/Chrome/.test(name)&&!/\bMobile Safari\b/i.test(ua))||/\bVita\b/.test(product)))||(/\bAndroid\b/.test(os)&&/^Chrome/.test(name)&&/\bVersion\//i.test(ua))){name='Android Browser';os=/\bAndroid\b/.test(os)?os:'Android';}
else if(name=='Silk'){if(!/\bMobi/i.test(ua)){os='Android';description.unshift('desktop mode');}
if(/Accelerated *= *true/i.test(ua)){description.unshift('accelerated');}}
else if(name=='PaleMoon'&&(data=/\bFirefox\/([\d.]+)\b/.exec(ua))){description.push('identifying as Firefox '+data[1]);}
else if(name=='Firefox'&&(data=/\b(Mobile|Tablet|TV)\b/i.exec(ua))){os||(os='Firefox OS');product||(product=data[1]);}
else if(!name||(data=!/\bMinefield\b/i.test(ua)&&/\b(?:Firefox|Safari)\b/.exec(name))){if(name&&!product&&/[\/,]|^[^(]+?\)/.test(ua.slice(ua.indexOf(data+'/')+8))){name=null;}
if((data=product||manufacturer||os)&&(product||manufacturer||/\b(?:Android|Symbian OS|Tablet OS|webOS)\b/.test(os))){name=/[a-z]+(?: Hat)?/i.exec(/\bAndroid\b/.test(os)?os:data)+' Browser';}}
else if(name=='Electron'&&(data=(/\bChrome\/([\d.]+)\b/.exec(ua)||0)[1])){description.push('Chromium '+data);}
if(!version){version=getVersion(['(?:Cloud9|CriOS|CrMo|Edge|FxiOS|IEMobile|Iron|Opera ?Mini|OPiOS|OPR|Raven|SamsungBrowser|Silk(?!/[\\d.]+$))','Version',qualify(name),'(?:Firefox|Minefield|NetFront)']);}
if((data=layout=='iCab'&&parseFloat(version)>3&&'WebKit'||/\bOpera\b/.test(name)&&(/\bOPR\b/.test(ua)?'Blink':'Presto')||/\b(?:Midori|Nook|Safari)\b/i.test(ua)&&!/^(?:Trident|EdgeHTML)$/.test(layout)&&'WebKit'||!layout&&/\bMSIE\b/i.test(ua)&&(os=='Mac OS'?'Tasman':'Trident')||layout=='WebKit'&&/\bPlayStation\b(?! Vita\b)/i.test(name)&&'NetFront')){layout=[data];}
if(name=='IE'&&(data=(/; *(?:XBLWP|ZuneWP)(\d+)/i.exec(ua)||0)[1])){name+=' Mobile';os='Windows Phone '+(/\+$/.test(data)?data:data+'.x');description.unshift('desktop mode');}
else if(/\bWPDesktop\b/i.test(ua)){name='IE Mobile';os='Windows Phone 8.x';description.unshift('desktop mode');version||(version=(/\brv:([\d.]+)/.exec(ua)||0)[1]);}
else if(name!='IE'&&layout=='Trident'&&(data=/\brv:([\d.]+)/.exec(ua))){if(name){description.push('identifying as '+name+(version?' '+version:''));}
name='IE';version=data[1];}
if(useFeatures){if(isHostType(context,'global')){if(java){data=java.lang.System;arch=data.getProperty('os.arch');os=os||data.getProperty('os.name')+' '+data.getProperty('os.version');}
if(rhino){try{version=context.require('ringo/engine').version.join('.');name='RingoJS';}catch(e){if((data=context.system)&&data.global.system==context.system){name='Narwhal';os||(os=data[0].os||null);}}
if(!name){name='Rhino';}}
else if(typeof context.process=='object'&&!context.process.browser&&(data=context.process)){if(typeof data.versions=='object'){if(typeof data.versions.electron=='string'){description.push('Node '+data.versions.node);name='Electron';version=data.versions.electron;}else if(typeof data.versions.nw=='string'){description.push('Chromium '+version,'Node '+data.versions.node);name='NW.js';version=data.versions.nw;}}
if(!name){name='Node.js';arch=data.arch;os=data.platform;version=/[\d.]+/.exec(data.version);version=version?version[0]:null;}}}
else if(getClassOf((data=context.runtime))==airRuntimeClass){name='Adobe AIR';os=data.flash.system.Capabilities.os;}
else if(getClassOf((data=context.phantom))==phantomClass){name='PhantomJS';version=(data=data.version||null)&&(data.major+'.'+data.minor+'.'+data.patch);}
else if(typeof doc.documentMode=='number'&&(data=/\bTrident\/(\d+)/i.exec(ua))){version=[version,doc.documentMode];if((data=+data[1]+4)!=version[1]){description.push('IE '+version[1]+' mode');layout&&(layout[1]='');version[1]=data;}
version=name=='IE'?String(version[1].toFixed(1)):version[0];}
else if(typeof doc.documentMode=='number'&&/^(?:Chrome|Firefox)\b/.test(name)){description.push('masking as '+name+' '+version);name='IE';version='11.0';layout=['Trident'];os='Windows';}
os=os&&format(os);}
if(version&&(data=/(?:[ab]|dp|pre|[ab]\d+pre)(?:\d+\+?)?$/i.exec(version)||/(?:alpha|beta)(?: ?\d)?/i.exec(ua+';'+(useFeatures&&nav.appMinorVersion))||/\bMinefield\b/i.test(ua)&&'a')){prerelease=/b/i.test(data)?'beta':'alpha';version=version.replace(RegExp(data+'\\+?$'),'')+
(prerelease=='beta'?beta:alpha)+(/\d+\+?/.exec(data)||'');}
if(name=='Fennec'||name=='Firefox'&&/\b(?:Android|Firefox OS)\b/.test(os)){name='Firefox Mobile';}
else if(name=='Maxthon'&&version){version=version.replace(/\.[\d.]+/,'.x');}
else if(/\bXbox\b/i.test(product)){if(product=='Xbox 360'){os=null;}
if(product=='Xbox 360'&&/\bIEMobile\b/.test(ua)){description.unshift('mobile mode');}}
else if((/^(?:Chrome|IE|Opera)$/.test(name)||name&&!product&&!/Browser|Mobi/.test(name))&&(os=='Windows CE'||/Mobi/i.test(ua))){name+=' Mobile';}
else if(name=='IE'&&useFeatures){try{if(context.external===null){description.unshift('platform preview');}}catch(e){description.unshift('embedded');}}
else if((/\bBlackBerry\b/.test(product)||/\bBB10\b/.test(ua))&&(data=(RegExp(product.replace(/ +/g,' *')+'/([.\\d]+)','i').exec(ua)||0)[1]||version)){data=[data,/BB10/.test(ua)];os=(data[1]?(product=null,manufacturer='BlackBerry'):'Device Software')+' '+data[0];version=null;}
else if(this!=forOwn&&product!='Wii'&&((useFeatures&&opera)||(/Opera/.test(name)&&/\b(?:MSIE|Firefox)\b/i.test(ua))||(name=='Firefox'&&/\bOS X (?:\d+\.){2,}/.test(os))||(name=='IE'&&((os&&!/^Win/.test(os)&&version>5.5)||/\bWindows XP\b/.test(os)&&version>8||version==8&&!/\bTrident\b/.test(ua))))&&!reOpera.test((data=parse.call(forOwn,ua.replace(reOpera,'')+';')))&&data.name){data='ing as '+data.name+((data=data.version)?' '+data:'');if(reOpera.test(name)){if(/\bIE\b/.test(data)&&os=='Mac OS'){os=null;}
data='identify'+data;}
else{data='mask'+data;if(operaClass){name=format(operaClass.replace(/([a-z])([A-Z])/g,'$1 $2'));}else{name='Opera';}
if(/\bIE\b/.test(data)){os=null;}
if(!useFeatures){version=null;}}
layout=['Presto'];description.push(data);}
if((data=(/\bAppleWebKit\/([\d.]+\+?)/i.exec(ua)||0)[1])){data=[parseFloat(data.replace(/\.(\d)$/,'.0$1')),data];if(name=='Safari'&&data[1].slice(-1)=='+'){name='WebKit Nightly';prerelease='alpha';version=data[1].slice(0,-1);}
else if(version==data[1]||version==(data[2]=(/\bSafari\/([\d.]+\+?)/i.exec(ua)||0)[1])){version=null;}
data[1]=(/\bChrome\/([\d.]+)/i.exec(ua)||0)[1];if(data[0]==537.36&&data[2]==537.36&&parseFloat(data[1])>=28&&layout=='WebKit'){layout=['Blink'];}
if(!useFeatures||(!likeChrome&&!data[1])){layout&&(layout[1]='like Safari');data=(data=data[0],data<400?1:data<500?2:data<526?3:data<533?4:data<534?'4+':data<535?5:data<537?6:data<538?7:data<601?8:'8');}else{layout&&(layout[1]='like Chrome');data=data[1]||(data=data[0],data<530?1:data<532?2:data<532.05?3:data<533?4:data<534.03?5:data<534.07?6:data<534.10?7:data<534.13?8:data<534.16?9:data<534.24?10:data<534.30?11:data<535.01?12:data<535.02?'13+':data<535.07?15:data<535.11?16:data<535.19?17:data<536.05?18:data<536.10?19:data<537.01?20:data<537.11?'21+':data<537.13?23:data<537.18?24:data<537.24?25:data<537.36?26:layout!='Blink'?'27':'28');}
layout&&(layout[1]+=' '+(data+=typeof data=='number'?'.x':/[.+]/.test(data)?'':'+'));if(name=='Safari'&&(!version||parseInt(version)>45)){version=data;}}
if(name=='Opera'&&(data=/\bzbov|zvav$/.exec(os))){name+=' ';description.unshift('desktop mode');if(data=='zvav'){name+='Mini';version=null;}else{name+='Mobile';}
os=os.replace(RegExp(' *'+data+'$'),'');}
else if(name=='Safari'&&/\bChrome\b/.exec(layout&&layout[1])){description.unshift('desktop mode');name='Chrome Mobile';version=null;if(/\bOS X\b/.test(os)){manufacturer='Apple';os='iOS 4.3+';}else{os=null;}}
if(version&&version.indexOf((data=/[\d.]+$/.exec(os)))==0&&ua.indexOf('/'+data+'-')>-1){os=trim(os.replace(data,''));}
if(layout&&!/\b(?:Avant|Nook)\b/.test(name)&&(/Browser|Lunascape|Maxthon/.test(name)||name!='Safari'&&/^iOS/.test(os)&&/\bSafari\b/.test(layout[1])||/^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|Web)/.test(name)&&layout[1])){(data=layout[layout.length-1])&&description.push(data);}
if(description.length){description=['('+description.join('; ')+')'];}
if(manufacturer&&product&&product.indexOf(manufacturer)<0){description.push('on '+manufacturer);}
if(product){description.push((/^on /.test(description[description.length-1])?'':'on ')+product);}
if(os){data=/ ([\d.+]+)$/.exec(os);isSpecialCasedOS=data&&os.charAt(os.length-data[0].length-1)=='/';os={'architecture':32,'family':(data&&!isSpecialCasedOS)?os.replace(data[0],''):os,'version':data?data[1]:null,'toString':function(){var version=this.version;return this.family+((version&&!isSpecialCasedOS)?' '+version:'')+(this.architecture==64?' 64-bit':'');}};}
if((data=/\b(?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(arch))&&!/\bi686\b/i.test(arch)){if(os){os.architecture=64;os.family=os.family.replace(RegExp(' *'+data),'');}
if(name&&(/\bWOW64\b/i.test(ua)||(useFeatures&&/\w(?:86|32)$/.test(nav.cpuClass||nav.platform)&&!/\bWin64; x64\b/i.test(ua)))){description.unshift('32-bit');}}
else if(os&&/^OS X/.test(os.family)&&name=='Chrome'&&parseFloat(version)>=39){os.architecture=64;}
ua||(ua=null);var platform={};platform.description=ua;platform.layout=layout&&layout[0];platform.manufacturer=manufacturer;platform.name=name;platform.prerelease=prerelease;platform.product=product;platform.ua=ua;platform.version=name&&version;platform.os=os||{'architecture':null,'family':null,'version':null,'toString':function(){return 'null';}};platform.parse=parse;platform.toString=toStringPlatform;if(platform.version){description.unshift(version);}
if(platform.name){description.unshift(name);}
if(os&&name&&!(os==String(os).split(' ')[0]&&(os==name.split(' ')[0]||product))){description.push(product?'('+os+')':'on '+os);}
if(description.length){platform.description=description.join(' ');}
return platform;}
var platform=parse();if(typeof define=='function'&&typeof define.amd=='object'&&define.amd){root.platform=platform;define(function(){return platform;});}
else if(freeExports&&freeModule){forOwn(platform,function(value,key){freeExports[key]=value;});}
else{root.platform=platform;}}.call(this));
File diff suppressed because one or more lines are too long
+143 -8
View File
@@ -4,22 +4,34 @@
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
{" (Add * to the end of field to match substring)"," (Добавете * в края на полето, за да съответства на подниза)"}.
{"{{ app_name }} already installed?","{{ app_name }} инсталиран ли е?"}.
{" has set the subject to: "," е задал темата на: "}.
{"{{ inviter }} has invited you to connect!","{{ inviter }} ви покани да се свържете!"}.
{"# participants","# участници"}.
{"A description of the node","Описание на нода"}.
{"A friendly name for the node","Удобно име на нода"}.
{"A fully-featured desktop chat client for Windows and Linux.","Пълнофункционален чат клиент за Windows и Linux."}.
{"A lean Jabber/XMPP client for Android. It aims at usability, low overhead and security, and works on low-end Android devices starting with Android 4.0.","Изчистен Jabber/XMPP клиент за Android. Насочен е към функционалност, лек и сигурен. Работи на устройства с Android от нисък клас, започвайки с Android 4.0."}.
{"A lightweight and powerful XMPP client for iPhone and iPad. It provides an easy way to talk and share moments with your friends.","Лек и мощен XMPP клиент за iPhone и iPad. Предоставя лесен начин да говорите и споделяте моменти с приятелите си."}.
{"A modern open-source chat client for iPhone and iPad. It is easy to use and has a clean user interface.","Модерен чат клиент с отворен код за iPhone и iPad. Лесен за използване, с изчистен потребителски интерфейс."}.
{"A modern open-source chat client for Mac. It is easy to use and has a clean user interface.","Модерен чат клиент с отворен код за Mac. Лесен за използване, с изчистен потребителски интерфейс."}.
{"A modern open-source chat client for the desktop. It focuses on providing a clean and reliable Jabber/XMPP experience while having your privacy in mind.","Модерен клиент за чат с отворен код за настолни компютри. Фокусира се върху предоставянето на чисто и надеждно Jabber/XMPP изживяване, като същевременно се грижи за вашата поверителност."}.
{"A password is required to enter this room","Необходима е парола за влизане в тази стая"}.
{"A Web Page","Уеб страница"}.
{"Accept invite using {{ app_name }}","Приемете поканата, използвайки {{ app_name }}"}.
{"Accept","Приемам"}.
{"Access denied by service policy","Достъпът е отказан спрямо политиката на услугата"}.
{"Access model","Модел на достъп"}.
{"Account doesn't exist","Профилът не съществува"}.
{"Action on user","Действие върху потребител"}.
{"Add a hat to a user","Добави шапка към потребител"}.
{"Add {{ inviter }} to your contact list","Добавете {{ inviter }} към вашия списък с контакти"}.
{"Add Contact","Добавете контакти"}.
{"Add User","Добави потребител"}.
{"Administration of ","Администриране на "}.
{"Administration","Администриране"}.
{"Administrator privileges required","Изискватт се администраторски права"}.
{"After clicking the button you will be taken to {{ app_name }} to finish setting up your new {{ site_name }} account.","След като щракнете върху бутона, ще бъдете пренасочени към {{ app_name }}, за да завършите настройката на новия вашия нов {{ site_name }} профил."}.
{"After successfully installing {{ app_name }}, come back to this page and <strong>continue with Step 2</strong>.","След като инсталирате успешно {{ app_name }}, върнете се на тази страница и <strong>продължете със стъпка 2</strong>."}.
{"All activity","Цялата статистика"}.
{"All Users","Всички потребители"}.
{"Allow subscription","Разреши абониране"}.
@@ -46,8 +58,13 @@
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Всеки, който има абонамент за присъствие на двете или от: може да се абонира и да извлича елементи"}.
{"Anyone with Voice","Всеки, с възможност за гласово обаждане"}.
{"Anyone","Всеки"}.
{"API Commands","API Команди"}.
{"Apple Store Logo","Apple Store лого"}.
{"April","Април"}.
{"Attribute 'channel' is required for this request","Атрибутът 'канал' е задължителен за тази заявка"}.
{"Arguments","Аргументи"}.
{"As a final reminder, your account details are shown below:","Като последно напомняне, данните за вашия профил са показани по-долу:"}.
{"Assign a hat to a user","Присвои шапка към потребител"}.
{"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","Атрибутът 'нод' не е разрешен тук"}.
@@ -59,6 +76,9 @@
{"Backup to File at ","Архивиране във файл на "}.
{"Backup","Резервно копие"}.
{"Bad format","Лош формат"}.
{"BAD REQUEST","BAD REQUEST"}.
{"Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.","Beagle IM от Tigase, Inc. е лек и мощен XMPP клиент за macOS."}.
{"Beagle IM Logo","Beagle IM лого"}.
{"Birthday","Рожден ден"}.
{"Both the username and the resource are required","Изискват се потребителското име и ресурсът"}.
{"Bytestream already activated","Bytestream вече е активиран"}.
@@ -75,6 +95,7 @@
{"Channel JID","JID на канал"}.
{"Channels","Канали"}.
{"Characters not allowed:","Неразрешени символи:"}.
{"Chat address (JID)","Чат адрес (JID)"}.
{"Chatroom configuration modified","Конфигурацията на стаята за чат е променена"}.
{"Chatroom is created","Стаята за чат е създадена"}.
{"Chatroom is destroyed","Стаята за чат е унищожена"}.
@@ -82,16 +103,29 @@
{"Chatroom is stopped","Стаята за чат е спряна"}.
{"Chatrooms","Чат стаи"}.
{"Choose a username and password to register with this server","Изберете потребителско име и парола, за да се регистрирате на този сървър"}.
{"Choose a username, this will become the first part of your new chat address.","Изберете потребителско име, то ще стане първата част от новия ви чат адрес."}.
{"Choose storage type of tables","Изберете тип за съхранение на таблици"}.
{"Choose whether to approve this entity's subscription.","Изберете дали да одобрите абонамента на този субект."}.
{"City","Град"}.
{"Click the button to open the Dino website where you can download and install it on your PC.","Щракнете върху бутона, за да отворите уебсайта на Dino, където можете да го изтеглите и инсталирате на вашия компютър."}.
{"Client acknowledged more stanzas than sent by server","Клиентът потвърди повече строфи от изпратените от сървъра"}.
{"Close","Затвори"}.
{"Clustering","Клъстеризация"}.
{"Commands","Команди"}.
{"Conference room does not exist","Конферентната стая не съществува"}.
{"Configuration of room ~s","Конфигурация на стая ~s"}.
{"Configuration","Конфигурация"}.
{"Congratulations!","Поздравления!"}.
{"Contact Addresses (normally, room owner or owners)","Адреси за контакт (обикновено собственик или собственици на стая)"}.
{"Contacts","Контакти"}.
{"Conversations is a Jabber/XMPP client for Android 6.0+ smartphones that has been optimized to provide a unique mobile experience.","Conversations е Jabber/XMPP клиент за смартфони с Android 6.0+, оптимизиран да осигури уникално мобилно изживяване."}.
{"Conversations Logo","Conversations лого"}.
{"Country","Държава"}.
{"Create a Hat","Създай Шапка"}.
{"Create Account","Създай профил"}.
{"Create an account","Създайте профил"}.
{"Creating an account will allow to communicate with other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Създаването на профил, ще Ви позволи да комуникирате с други хора в <strong>{{ site_name }}</strong> и други услуги в мрежата XMPP."}.
{"Creating an account will allow to communicate with <strong>{{ inviter }}</strong> and other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Създаването на профил, ще ви позволи да комуникирате с <strong>{{ inviter }}</strong>, други хора в <strong>{{ site_name }}</strong> и други услуги в мрежата XMPP."}.
{"Current Discussion Topic","Текуща тема на дискусита"}.
{"Database failure","Грешка в базата данни"}.
{"Database Tables Configuration at ","Конфигурация на таблиците в базата данни при "}.
@@ -103,8 +137,16 @@
{"Delete User","Изтрий потребителя"}.
{"Deliver event notifications","Достави известията за събития"}.
{"Deliver payloads with event notifications","Достави прикачените обекти с известията за събития"}.
{"Destroy a Hat","Разруши Шапка"}.
{"Dino Logo","Dino лого"}.
{"Disable User","Деактивирай потребителя"}.
{"Disc only copy","Копие само на диска"}.
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Не казвайте паролата си на никого, дори на администраторите на XMPP сървъра."}.
{"Download and install {{ app_name }} below:","Изтеглете и инсталирайте {{ app_name }} по-долу:"}.
{"Download Dino for Linux","Свалете Dino за Linux"}.
{"Download from Mac App Store","Изтегляне от Mac App Store"}.
{"Download Gajim","Свалете Gajim"}.
{"Download Renga for Haiku","Свалете Renga за Haiku"}.
{"Dump Backup to Text File at ","Архивиране в текстов файл при "}.
{"Dump to Text File","Архивиране в текстов файл"}.
{"Duplicated groups are not allowed by RFC6121","Дублирани групи не са разрешени от RFC6121"}.
@@ -126,6 +168,7 @@
{"Enable message archiving","Активирай архивиране на съобщенията"}.
{"Enabling push without 'node' attribute is not supported","Активиране на известията без атрибут 'нод' не се поддържа"}.
{"End User Session","Прекрати сесията на потребителя"}.
{"Enter a secure password that you do not use anywhere else.","Въведете сигурна парола, която не използвате на друго място."}.
{"Enter nickname you want to register","Въведете псевдонима, който желаете да регистрирате"}.
{"Enter path to backup file","Въведете пътя към архивния файл"}.
{"Enter path to jabberd14 spool dir","Въведете пътя към jabberd14 spool директорията"}.
@@ -146,6 +189,7 @@
{"Failed to process option '~s'","Неуспешо обработена опция '~s'"}.
{"Family Name","Фамилно име"}.
{"FAQ Entry","Въвеждане на ЧЗВ"}.
{"F-Droid Store Logo","F-Droid Store лого"}.
{"February","Февруари"}.
{"File larger than ~w bytes","Файлът е по-голям от ~w байта"}.
{"Fill in the form to search for any matching XMPP User","Попълнете формата, за да търсите съвпадащ XMPP потребител"}.
@@ -154,27 +198,44 @@
{"Full List of Room Admins","Пълен списък на администраторите на стаята"}.
{"Full List of Room Owners","Пълен списък на собствениците на стаята"}.
{"Full Name","Пълно име"}.
{"Get List of Online Users","Списък на онлайн потребителите"}.
{"Gajim Logo","Gajim лого"}.
{"Get List of Active Users","Списък с активни потребители"}.
{"Get List of Disabled Users","Списък на деактивираните потребители"}.
{"Get List of Idle Users","Списък на неактивните потребители"}.
{"Get List of Online Users","Списък на онлайн потребители"}.
{"Get List of Registered Users","Списък на регистрираните потребители"}.
{"Get Number of Active Users","Брой на активните потребители"}.
{"Get Number of Disabled Users","Брой на деактивираните потребители"}.
{"Get Number of Idle Users","Брой на неактивните потребители"}.
{"Get Number of Online Users","Брой на онлайн потребителите"}.
{"Get Number of Registered Users","Брой на регистрираните потребители"}.
{"Get Pending","Виж чакащи"}.
{"Get started","Започнете"}.
{"Get User Last Login Time","Покажи времето, когато потребителят е влязъл за последно"}.
{"Get User Roster","Списък с потребители"}.
{"Get User Statistics","Покажи статистика за потребителя"}.
{"Given Name","Наименование"}.
{"Google Play Store Logo","Google Play Store лого"}.
{"Grant voice to this person?","Предоставяне на глас за потребителя?"}.
{"has been banned","е със забранен достъп"}.
{"has been kicked because of a system shutdown","е отстранен поради изключване на системата"}.
{"has been kicked because of an affiliation change","е отстранен поради промяна на принадлежността"}.
{"has been kicked because the room has been changed to members-only","е изгонен, защото стаята е променена и е само за членове"}.
{"has been kicked","е отстранен"}.
{"Hash computed from the list of hats available in a room","Хеш стойност на листа от шапки налични в стаята"}.
{"Hash of the vCard-temp avatar of this room","Хеш на временния vCard аватар на тази стая"}.
{"Hat hue","Цвят на шапката"}.
{"Hat title","Заглавие на шапката"}.
{"Hat URI","URI адрес за шапка"}.
{"Hats limit exceeded","Превишен е лимитът за шапка"}.
{"Hide","Скрий"}.
{"Hint","Подсказка"}.
{"Host unknown","Неизвестен хост"}.
{"Hostname invalid","Невалидно име за хост"}.
{"HTTP File Upload","Качване на файл по HTTP"}.
{"Idle connection","Неактивна връзка"}.
{"If you already have {{ app_name }} installed, we recommend that you continue the account creation process using the app by clicking on the button below:","Ако вече сте инсталирали {{ app_name }}, препоръчваме Ви да продължите процеса на създаване на профил, използвайки приложението, като кликнете върху бутона по-долу:"}.
{"If you don't have an XMPP client installed yet, here's a list of suitable clients for your platform.","Ако все още нямате инсталиран XMPP клиент, ето списък с подходящи клиенти за вашата платформа."}.
{"If you don't see the CAPTCHA image here, visit the web page.","Ако не виждате CAPTCHA изображението, посетете уеб страницата."}.
{"Import Directory","Импорт на директория"}.
{"Import File","Импорт на файл"}.
@@ -193,6 +254,7 @@
{"Incorrect value of 'action' in data form","Неправилна стойност на 'action' във формата за данни"}.
{"Incorrect value of 'path' in data form","Неправилна стойност на 'path' във формата за данни"}.
{"Installed Modules:","Инсталирани модули:"}.
{"Installed ok? Great! <strong>Click or tap the button below</strong> to accept your invite and continue with your account setup:","Инсталира ли се нормално? Чудесно! <strong>Кликнете или докоснете бутона по-долу</strong>, за да приемете поканата си и да продължите с настройката на вашия профил:"}.
{"Install","Инсталирай"}.
{"Insufficient privilege","Недостатъчни права"}.
{"Internal server error","Вътрешна сървърна грешка"}.
@@ -200,6 +262,11 @@
{"Invalid node name","Невалидно име на нода"}.
{"Invalid 'previd' value","Невалидна стойност на 'previd'"}.
{"Invitations are not allowed in this conference","Поканите не са разрешени в тази конференция"}.
{"Invite Expired","Изтекла покана"}.
{"Invite expired","Поканата е изтекла"}.
{"Invite to {{ site_name }}","Покани в {{ site_name }}"}.
{"Invite User","Покани потребител"}.
{"Invite","Покани"}.
{"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) и е бил отстранен от стаята"}.
@@ -209,6 +276,7 @@
{"January","Януари"}.
{"JID normalization denied by service policy","Политиката на услугата не допуска нормализирането на JID"}.
{"JID normalization failed","Нормализирането на JID е неуспешно"}.
{"Join {{ site_name }} with {{ app_name }}","Присъединете се към {{ site_name }} с {{ app_name }}"}.
{"Joined MIX channels of ~ts","Свързани MIX канали на ~ts"}.
{"Joined MIX channels:","Свързани MIX канали:"}.
{"joins the room","се присъединява към стаята"}.
@@ -220,10 +288,13 @@
{"Last message","Последно съобщение"}.
{"Last month","Миналия месец"}.
{"Last year","Миналата година"}.
{"Launch {{ app_name }} and sign in using your account credentials.","Стартирайте {{ app_name }} и влезте, използвайки данни за вашия профил."}.
{"Launch Beagle IM, and select \\'Yes\\' to add a new account. Click the \\'+\\' button under the empty account list and then enter your credentials.","Стартирайте Beagle IM и изберете \\'Да\\', за да добавите нов профил. Кликнете върху бутона \\'+\\' под празния списък с профили и след това въведете вашите идентификационни данни."}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Най-малко значимите битове SHA-256 хеш на текст трябва да са равни на шестнайсетичния етикет"}.
{"leaves the room","напуска стаята"}.
{"List of users with hats","Списък на потребителите с шапки"}.
{"List of Hats","Списък с шапки"}.
{"List users with hats","Избройте потребителите с шапки"}.
{"Log in via web","Влезте през уеб"}.
{"Logged Out","Излязъл"}.
{"Logging","Регистриране на събития"}.
{"Make participants list public","Направи списъка с участниците публичен"}.
@@ -240,9 +311,11 @@
{"Max payload size in bytes","Максимален размер на прикачения обект в байтове"}.
{"Maximum file size","Максимален размер на файла"}.
{"Maximum Number of History Messages Returned by Room","Максимален брой съобщения от хронологията, върнати от стая"}.
{"Maximum number of invites reached","Максималният брой покани е достигнат"}.
{"Maximum number of items to persist","Максимален брой елементи за запазване"}.
{"Maximum Number of Occupants","Максимален брой участници"}.
{"May","Май"}.
{"Members are allowed to invite others","Участниците могат да канят други"}.
{"Membership is required to enter this room","Изисква се членство, за вход в тази стая"}.
{"Memorize your password, or write it in a paper placed in a safe place. In XMPP there isn't an automated way to recover your password if you forget it.","Запомнете паролата си или я запишете на лист хартия, поставен на сигурно място. В XMPP няма автоматичен начин за възстановяване на паролата в случай, че я забравите."}.
{"Mere Availability in XMPP (No Show Value)","Наличност в XMPP (Не показвай стойност)"}.
@@ -257,6 +330,7 @@
{"Moderators Only","Само модератори"}.
{"Moderator","Модератор"}.
{"Module failed to handle the query","Модулът не успя да обработи заявката"}.
{"Monal Logo","Monal лого"}.
{"Monday","Понеделник"}.
{"Multicast","Мултикаст"}.
{"Multiple <item/> elements are not allowed by RFC6121","Повече от един <item/> елемента не се разрешават от RFC6121"}.
@@ -310,19 +384,22 @@
{"Node","Нод"}.
{"None","Нито един"}.
{"Not allowed","Не е разрешено"}.
{"NOT FOUND","NOT FOUND"}.
{"Not Found","Не е намерен"}.
{"Not subscribed","Няма абонамент"}.
{"Notify subscribers when items are removed from the node","Уведоми абонатите, когато елементите бъдат премахнати от нода"}.
{"Notify subscribers when the node configuration changes","Уведоми абонатите, когато конфигурацията на нода се промени"}.
{"Notify subscribers when the node is deleted","Уведоми абонатите, когато нодът бъде изтрит"}.
{"November","Ноември"}.
{"Number of active users","Брой активни потребители"}.
{"Number of answers required","Брой на необходимите отговори"}.
{"Number of disabled users","Брой деактивирани потребители"}.
{"Number of idle users","Брой неактивни потребители"}.
{"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","Октомври"}.
@@ -345,12 +422,15 @@
{"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","Само тези от списъка с позволени могат да се абонират и да извличат елементи"}.
{"Open the app","Отворете приложението"}.
{"Organization Name","Име на организацията"}.
{"Organization Unit","Отдел"}.
{"Other Modules Available:","Други налични модули:"}.
{"Other software","Друг софтуер"}.
{"Outgoing s2s Connections","Изходящи s2s връзки"}.
{"Owner privileges required","Изискват се привилегии на собственик"}.
{"Packet relay is denied by service policy","Предаването на пакети е отказано от политиката на услугата"}.
{"Page navigation","Навигация по страниците"}.
{"Participant ID","ID на участник"}.
{"Participant","Участник"}.
{"Password Verification","Проверка на паролата"}.
@@ -366,6 +446,8 @@
{"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 provide a password! Minimum length: {{ password_min_length }}","Моля, въведете парола! Минимална дължина: {{ password_min_length }}"}.
{"Please provide a valid username!","Моля, въведете валидно потребителско име!"}.
{"Please, wait for a while before sending new voice request","Моля, изчакайте известно време, преди да изпратите нова заявка за гласова връзка"}.
{"Pong","Понг"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Притежаването на атрибут 'ask' не е разрешено от RFC6121"}.
@@ -375,6 +457,7 @@
{"Previous session PID has exited","Предишният PID на сесията е излязъл"}.
{"Previous session PID is dead","PID от предишната сесия не съществува"}.
{"Previous session timed out","Времето на предишната сесия изтече"}.
{"Previous","Предишен"}.
{"private, ","частна, "}.
{"Public","Публичен"}.
{"Publish model","Модел за публикуване"}.
@@ -392,11 +475,18 @@
{"Receive notification of new items only","Получаване на известия само за нови елементи"}.
{"Receive notification of new nodes only","Получаване на известия само за нови нодове"}.
{"Recipient is not in the conference room","Получателят не е в конферентната стая"}.
{"Register an XMPP account","Регистрирай XMPP акаунт"}.
{"Re-Enable User","Активиране на потребител"}.
{"Register an XMPP account","Регистрирай XMPP профил"}.
{"Register on {{ site_name }}","Регистрирайте се на {{ site_name }}"}.
{"Register","Регистрирай"}.
{"Registration Error","Грешка при регистрация"}.
{"Registration error","Грешка при регистриране"}.
{"Registration Form","Форма за регистрация"}.
{"Registration Success","Успешна регистрация"}.
{"Remote copy","Отдалечено копие"}.
{"Remove a hat from a user","Премахни шапка от потребител"}.
{"Remove User","Премахни потребител"}.
{"Renga Logo","Renga лого"}.
{"Replaced by new connection","Заменен от нова връзка"}.
{"Request has timed out","Времето за заявка изтече"}.
{"Request is ignored","Заявката е игнорирано"}.
@@ -408,6 +498,7 @@
{"Restore binary backup immediately:","Възстанови незабавно двоично копие:"}.
{"Restore plain text backup immediately:","Възстановете незабавно копие от обикновен текст:"}.
{"Restore","Възстанови"}.
{"Result","Резултат"}.
{"Roles and Affiliations that May Retrieve Member List","Роли и принадлежности, които могат да извличат списък с членове"}.
{"Roles for which Presence is Broadcasted","Роли, за които се излъчва присъствие"}.
{"Roles that May Send Private Messages","Роли, които могат да изпращат лични съобщения"}.
@@ -421,16 +512,21 @@
{"Roster size","Размер на списъка с контакти"}.
{"Running Nodes","Работещи нодове"}.
{"~s invites you to the room ~s","~s ви кани в стая ~s"}.
{"Sad person holding empty box","Тъжен човек, държащ празна кутия"}.
{"Saturday","Събота"}.
{"Scan invite code","Сканирайте код за покана"}.
{"Scan with mobile device","Сканиране с мобилно устройство"}.
{"Search from the date","Търси от дата"}.
{"Search Results for ","Резултати от търсенето за "}.
{"Search the text","Търси текста"}.
{"Search until the date","Търси до дата"}.
{"Search users in ","Търси потребители в "}.
{"Select","Избери"}.
{"Send announcement to all online users on all hosts","Изпрати съобщение до всички онлайн потребители на всички хостове"}.
{"Send announcement to all online users","Изпрати съобщение до всички онлайн потребители"}.
{"Send announcement to all users on all hosts","Изпрати съобщение до всички потребители на всички хостове"}.
{"Send announcement to all users","Изпрати съобщение до всички потребители"}.
{"Send this invite to your device","Изпратете тази покана до вашето устройство"}.
{"September","Септември"}.
{"Server:","Сървър:"}.
{"Service list retrieval timed out","Времето за изчакване на извличането на списъка с услуги изтече"}.
@@ -441,9 +537,14 @@
{"Show Integral Table","Покажи интегрална таблица"}.
{"Show Occupants Join/Leave","Покажи участници Влязъл/Напускнал"}.
{"Show Ordinary Table","Покажи обикновена таблица"}.
{"Showing apps for <span class='platform-name'>your current platform</span> only. You may also <a href='#' id='show-all-clients-button' tabindex=\"{{ tabidx }}\">view all apps.</a>","Показват се приложения само за <span class='platform-name'>текущата ви платформа</span>. Можете също да <a href='#' id='show-all-clients-button' tabindex=\"{{ tabidx }}\">прегледате всички приложения.</a>"}.
{"Show","Покажи"}.
{"Shut Down Service","Изключи услугата"}.
{"Siskin IM Logo","Siskin IM лого"}.
{"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 клиенти могат да съхраняват паролата Ви в компютъра, но от съображения за сигурност трябва да го правите само на личния си компютър."}.
{"Sorry, it looks like this invite code has expired!","Съжалявам, изглежда, че този код за покана е изтекъл!"}.
{"Sorry, there was a problem registering your account.","За съжаление, възникна проблем с регистрацията на вашия профил."}.
{"Sources Specs:","Спецификации на източниците:"}.
{"Specify the access model","Задай модела за достъп"}.
{"Specify the event message type","Задай типа на съобщението за събитие"}.
@@ -451,13 +552,22 @@
{"Stanza id is not valid","Невалидно ID на строфата"}.
{"Stanza ID","ID на строфа"}.
{"Statically specify a replyto of the node owner(s)","Статично задаване на replyto на собственика(ците) на нода"}.
{"Step 1: Download and install {{ app_name }}","Стъпка 1: Изтеглете и инсталирайте {{ app_name }}"}.
{"Step 1: Install {{ app_name }}","Стъпка 1: Инсталирайте {{ app_name }}"}.
{"Step 2: Activate your account","Стъпка 2: Активирайте профила си"}.
{"Step 2: Connect {{ app_name }} to your new account","Стъпка 2: Свържете {{ app_name }} с новия си профил"}.
{"Stopped Nodes","Спрени нодове"}.
{"Store binary backup:","Запази бинарен архив:"}.
{"Store plain text backup:","Запази архив като обикновен текст:"}.
{"Stream management is already enabled","Управлението на потока вече е активирано"}.
{"Stream management is not enabled","Управлението на потока не е активирано"}.
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting using <strong>{{ app_name }}</strong> you need to first register an account.","<strong>{{ site_name }}</strong> е част от XMPP, сигурна и децентрализирана мрежа за съобщения. За да започнете да чатите, използвайки <strong>{{ app_name }}</strong>, първо трябва да регистрирате профил."}.
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting you need to first register an account.","<strong>{{ site_name }}</strong> е част от XMPP, сигурна и децентрализирана мрежа за съобщения. За да започнете да чатите, първо трябва да регистрирате профил."}.
{"<strong>No suitable software installed right now?</strong> You can also log in to your account through our online web chat!","<strong>В момента нямате инсталиран подходящ софтуер?</strong> Можете, също да влезете в профила си чрез нашия онлайн уеб чат!"}.
{"<strong>Tip:</strong> You can open this invite on your mobile device by scanning a barcode with your camera.","<strong>Съвет:</strong> Можете да отворите тази покана на мобилното си устройство, като сканирате баркод с камерата."}.
{"Subject","Тема"}.
{"Submitted","Изпратено"}.
{"Submit","Изпрати"}.
{"Subscriber Address","Адрес на абоната"}.
{"Subscribers may publish","Абонатите могат да публикуват"}.
{"Subscription requests must be approved and only subscribers may retrieve items","Заявките за абонамент трябва да бъдат одобрени и само абонатите могат да извличат елементи"}.
@@ -485,6 +595,9 @@
{"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 active users","Списъкът на всички активни потребители"}.
{"The list of all disabled users","Списък на всички деактвирани потребители"}.
{"The list of all idle users","Списък на всички неактивни потребители"}.
{"The list of all online users","Списък на всички онлайн потребители"}.
{"The list of all users","Списък на всички потребители"}.
{"The list of JIDs that may associate leaf nodes with a collection","Списъкът с JID, които могат да асоциират листови нодове с колекция"}.
@@ -506,16 +619,20 @@
{"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 role","Ролята"}.
{"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 token provided is either invalid or expired.","Предоставеният токен код е невалиден или изтекъл."}.
{"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 button works only if you have the app installed already!","Този бутон работи, само ако вече имате инсталирано приложението!"}.
{"This is an invite from <strong>{{ inviter }}</strong> to connect and chat on the XMPP network. If you already have an XMPP client installed just press the button below!","Това е покана от <strong>{{ inviter }}</strong> за свързване и чат в XMPP мрежата. Ако вече имате инсталиран XMPP клиент, просто натиснете бутона по-долу!"}.
{"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 профил от този сървър."}.
@@ -524,7 +641,9 @@
{"Thursday","Четвъртък"}.
{"Time delay","Закъснение"}.
{"Timed out waiting for stream resumption","Времето за изчакване за възобновяване на потока изтече"}.
{"To get started, you need to install an app for your platform:","За да започнете, трябва да инсталирате приложение за вашата платформа:"}.
{"To register, visit ~s","За да се регистрирате, посетете ~s"}.
{"To start chatting, you need to enter your new account credentials into your chosen XMPP software.","За да започнете чат, трябва да въведете новите си идентификационни данни в избрания от вас XMPP софтуер."}.
{"To ~ts","До ~ts"}.
{"Token TTL","Токен TTL"}.
{"Too many active bytestreams","Твърде много активни \"bytestreams\" потоци"}.
@@ -557,6 +676,7 @@
{"Updating the vCard is not supported by the vCard storage backend","Актуализирането на vCard не се поддържа от настройката за съхранение на vCard"}.
{"Upgrade","Обнови"}.
{"URL for Archived Discussion Logs","URL адрес за дневници на архивирани дискусии"}.
{"Use a <em>QR code</em> scanner on your mobile device to scan the code below:","Използвайте скенер за <em>QR код</em> на вашето мобилно устройство, за да сканирате кода по-долу:"}.
{"User already exists","Потребителят вече съществува"}.
{"User (jid)","Потребител (jid)"}.
{"User JID","Потребител JID"}.
@@ -566,6 +686,9 @@
{"User session not found","Потребителската сесия не е намерена"}.
{"User session terminated","Потребителската сесия е прекратена"}.
{"User ~ts","Потребител ~ts"}.
{"Username invalid","Невалидно потребителско име"}.
{"Username is reserved","Потребителското име е резервирано"}.
{"Username","Потребителско име"}.
{"Username:","Потребителско име:"}.
{"Users are not allowed to register accounts so quickly","Не е разрешено потребителите да регистрират профили толкова бързо"}.
{"Users Last Activity","Последна активност на потребителите"}.
@@ -584,6 +707,7 @@
{"Visitor","Посетител"}.
{"Voice requests are disabled in this conference","Гласовите обаждания са деактивирани в тази конференция"}.
{"Voice request","Заявка за гласово обаждане"}.
{"Web client which allows to join the room anonymously","Уеб клиентът, който позволява анонимно свързване със стаята"}.
{"Wednesday","Сряда"}.
{"When a new subscription is processed and whenever a subscriber comes online","Когато се обработва нов абонамент и всеки път, когато абонат се появи онлайн"}.
{"When a new subscription is processed","Когато се обработва нов абонамент"}.
@@ -601,6 +725,7 @@
{"Wrong parameters in the web formulary","Грешни параметри в уеб формуляра"}.
{"Wrong xmlns","Грешен xmlns"}.
{"XMPP Account Registration","Регистриране на XMPP профил"}.
{"XMPP client for Haiku","XMPP клиент за Haiku"}.
{"XMPP Domains","XMPP домейни"}.
{"XMPP Show Value of Away","XMPP покажи стойност на Отсъства"}.
{"XMPP Show Value of Chat","XMPP покажи стойност на Чат"}.
@@ -610,8 +735,17 @@
{"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 connect to {{ site_name }} using any XMPP-compatible software. If your preferred software is not listed above, you may still <a href=\"{{ registration_url }}\" tabindex='{{ tabidx }}'>register an account manually</a>.","Можете да се свържете с {{ site_name }}, използвайки всеки XMPP-съвместим софтуер. Ако предпочитаният от вас софтуер не е посочен по-горе, все още можете <a href=\"{{ registration_url }}\" tabindex='{{ tabidx }}'>да регистрирате акаунт ръчно</a>."}.
{"You can later change your password using an XMPP client.","По-късно можете да промените паролата си с помощта на XMPP клиент."}.
{"You can now set up {{ app_name }} and connect it to your new account.","Вече можете да настроите {{ app_name }} и да го свържете с вашия нов профил."}.
{"You can start chatting right away with {{ app_name }}. Let's get started!","Можете да започнете да чатите веднага с {{ app_name }}. Да започваме!"}.
{"You can transfer this invite to your mobile device by scanning a code with your camera.","Можете да прехвърлите тази покана на мобилното си устройство, като сканирате код с камерата на вашето устройство."}.
{"You have been banned from this room","Достъпът ви до тази стая е забранен"}.
{"You have been invited to chat on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Поканени сте да чатите в {{ site_name }}, част от защитената и децентрализирана мрежа за съобщения XMPP."}.
{"You have been invited to chat on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Поканени сте да чатите в <strong>{{ site_name }}</strong>, част от защитената и децентрализирана мрежа за съобщения XMPP."}.
{"You have been invited to chat with <strong>{{ inviter }}</strong> on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Поканени сте да чатите с <strong>{{ inviter }}</strong> на {{ site_name }}, част от защитената и децентрализирана мрежа за съобщения XMPP."}.
{"You have been invited to chat with <strong>{{ inviter }}</strong> on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Поканени сте да чатите с <strong>{{ inviter }}</strong>на <strong>{{ site_name }}</strong>, част от защитената и децентрализирана мрежа за съобщения XMPP."}.
{"You have created an account on <strong>{{ site_name }}</strong>.","Създадохте профил в <strong>{{ site_name }}</strong>."}.
{"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"}.
@@ -619,7 +753,8 @@
{"You need an x:data capable client to search","За да търсите, Ви е нужен клиент, който поддържа x:data"}.
{"Your active privacy list has denied the routing of this stanza.","Вашият активен списък за поверителност отказа маршрутизирането на тази строфа."}.
{"Your contact offline message queue is full. The message has been discarded.","Достигнат е максималният брой офлайн съобщения за вашия контакт. Съобщението е отхвърлено."}.
{"Your password is stored encrypted on the server and will not be accessible after you close this page. Keep it safe and never share it with anyone.","Вашата парола се съхранява криптирана на сървъра и няма да бъде достъпна, след като затворите тази страница. Пазете я в безопасност и не я споделяйте с никого."}.
{"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 XMPP account was successfully registered.","Вашият XMPP профил, беше регистриран успешно."}.
{"Your XMPP account was successfully unregistered.","Вашият XMPP профил, беше успешно премахнат."}.
{"You're not allowed to create nodes","Нямате право да създавате нодове"}.
+147 -12
View File
@@ -4,22 +4,34 @@
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
{" (Add * to the end of field to match substring)"," (Afegix * al final d'un camp per a buscar subcadenes)"}.
{"{{ app_name }} already installed?","Ja està instal·lat {{ app_name }}?"}.
{" has set the subject to: "," ha posat el tema: "}.
{"{{ inviter }} has invited you to connect!","{{ inviter }} t'ha invitat a connectar-te!"}.
{"# participants","# participants"}.
{"A description of the node","Una descripció del node"}.
{"A friendly name for the node","Un nom per al node"}.
{"A fully-featured desktop chat client for Windows and Linux.","Un client de xat molt complet d'escriptori per a Windows i Linux."}.
{"A lean Jabber/XMPP client for Android. It aims at usability, low overhead and security, and works on low-end Android devices starting with Android 4.0.","Un client Jabber/XMPP lleuger per a Android. Està orientat a la usabilitat, la seguretat i el baix consum, i funciona en aparats Android antics a partir de Android 4.0."}.
{"A lightweight and powerful XMPP client for iPhone and iPad. It provides an easy way to talk and share moments with your friends.","Un client XMPP lleuger i potent per a iPhone e iPad. Proporciona una forma senzilla de xarrar i compartir moments amb les teues amistats."}.
{"A modern open-source chat client for iPhone and iPad. It is easy to use and has a clean user interface.","Un client de xat modern i de software lliure per a iPhone i iPad. Es simple d'usar i te una interfície d'usuari neta."}.
{"A modern open-source chat client for Mac. It is easy to use and has a clean user interface.","Un client de xat modern i de software lliure per a Mac. Es simple d'usar i te una interfície d'usuari neta."}.
{"A modern open-source chat client for the desktop. It focuses on providing a clean and reliable Jabber/XMPP experience while having your privacy in mind.","Un client de xat modern i de software lliure per a l'escriptori. Està enfocat en proporcionar una experiència Jabber/XMPP neta i comfiable, mentre mantenes la teva privacitat en ment."}.
{"A password is required to enter this room","Es necessita contrasenya per a entrar en aquesta sala"}.
{"A Web Page","Una Pàgina Web"}.
{"Accept invite using {{ app_name }}","Accepta la invitació usant {{ app_name }}"}.
{"Accept","Acceptar"}.
{"Access denied by service policy","Accés denegat per la política del servei"}.
{"Access model","Model d'Accés"}.
{"Account doesn't exist","El compte no existeix"}.
{"Action on user","Acció en l'usuari"}.
{"Add a hat to a user","Afegir un barret a un usuari"}.
{"Add {{ inviter }} to your contact list","Afegir {{ inviter }} a la teua llista de contactes"}.
{"Add Contact","Afegir Contacte"}.
{"Add User","Afegir usuari"}.
{"Administration of ","Administració de "}.
{"Administration","Administració"}.
{"Administrator privileges required","Es necessita tenir privilegis d'administrador"}.
{"After clicking the button you will be taken to {{ app_name }} to finish setting up your new {{ site_name }} account.","Al polsar el boto, s'obrirà {{ app_name }} per a terminar de configurar el teu compte a {{ site_name }}."}.
{"After successfully installing {{ app_name }}, come back to this page and <strong>continue with Step 2</strong>.","Després d'instal·lar correctament {{ app_name }}, torna ací i <strong>continua amb el Pas 2</strong>."}.
{"All activity","Tota l'activitat"}.
{"All Users","Tots els usuaris"}.
{"Allow subscription","Permetre subscripció"}.
@@ -46,7 +58,12 @@
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Qualsevol amb una subscripció de presencia de 'both' o 'from' pot subscriure's i publicar elements"}.
{"Anyone with Voice","Qualsevol amb Veu"}.
{"Anyone","Qualsevol"}.
{"API Commands","Comandaments API"}.
{"Apple Store Logo","Logo de la Apple Store"}.
{"April","Abril"}.
{"Arguments","Arguments"}.
{"As a final reminder, your account details are shown below:","Com a recordatori final, el detalls del teu compte es mostren ací:"}.
{"Assign a hat to a user","Asignar un barret a un usuari"}.
{"Attribute 'channel' is required for this request","L'atribut 'channel' és necessari per a aquesta petició"}.
{"Attribute 'id' is mandatory for MIX messages","L'atribut 'id' es necessari per a missatges MIX"}.
{"Attribute 'jid' is not allowed here","L'atribut 'jid' no està permès ací"}.
@@ -59,6 +76,9 @@
{"Backup to File at ","Desar còpia de seguretat a fitxer en "}.
{"Backup","Guardar còpia de seguretat"}.
{"Bad format","Format erroni"}.
{"BAD REQUEST","MALA PETICIÓ"}.
{"Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.","Beagle IM de Tigase, Inc. es un client XMPP lleuger i poderós per a macOS."}.
{"Beagle IM Logo","Logo de Beagle IM"}.
{"Birthday","Aniversari"}.
{"Both the username and the resource are required","Es requereixen tant el nom d'usuari com el recurs"}.
{"Bytestream already activated","El Bytestream ja està activat"}.
@@ -75,6 +95,7 @@
{"Channel JID","JID del Canal"}.
{"Channels","Canals"}.
{"Characters not allowed:","Caràcters no permesos:"}.
{"Chat address (JID)","Direcció de xarrar (JID)"}.
{"Chatroom configuration modified","Configuració de la sala de xat modificada"}.
{"Chatroom is created","La sala s'ha creat"}.
{"Chatroom is destroyed","La sala s'ha destruït"}.
@@ -82,29 +103,50 @@
{"Chatroom is stopped","La sala s'ha aturat"}.
{"Chatrooms","Sales de xat"}.
{"Choose a username and password to register with this server","Tria nom d'usuari i contrasenya per a registrar-te en aquest servidor"}.
{"Choose a username, this will become the first part of your new chat address.","Elegeix un nom de compte, que serà la primera part de la direcció del teu compte."}.
{"Choose storage type of tables","Selecciona el tipus d'almacenament de les taules"}.
{"Choose whether to approve this entity's subscription.","Tria si aproves aquesta entitat de subscripció."}.
{"City","Ciutat"}.
{"Click the button to open the Dino website where you can download and install it on your PC.","Polsa el botó per a obrir la pàgina web de Dino on podràs descarregar el programa per a instalarlo al teu ordinador."}.
{"Client acknowledged more stanzas than sent by server","El client ha reconegut més paquets dels que ha enviat el servidor"}.
{"Close","Tancar"}.
{"Clustering","Clustering"}.
{"Commands","Comandaments"}.
{"Conference room does not exist","La sala de conferències no existeix"}.
{"Configuration of room ~s","Configuració de la sala ~s"}.
{"Configuration","Configuració"}.
{"Congratulations!","Enhorabona!"}.
{"Contact Addresses (normally, room owner or owners)","Adreces de contacte (normalment, propietaris de la sala)"}.
{"Contacts","Contactes"}.
{"Conversations is a Jabber/XMPP client for Android 6.0+ smartphones that has been optimized to provide a unique mobile experience.","Conversations es un client Jabber/XMPP per a mòbils Android 6.0+ que ha sigut optimitzat per a proporcionar una experiència mòbil unica."}.
{"Conversations Logo","Logo de Conversations"}.
{"Country","Pais"}.
{"Create a Hat","Crear un barret"}.
{"Create Account","Crear un Compte"}.
{"Create an account","Crear un compte"}.
{"Creating an account will allow to communicate with other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Crear un compte et permetrà comunicar-te amb altra gent a <strong>{{ site_name }}</strong> i a altres serveis de la xarxa XMPP."}.
{"Creating an account will allow to communicate with <strong>{{ inviter }}</strong> and other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Crear un compte e permetrà comunicar-te amb <strong>{{ inviter }}</strong> i altra gent a <strong>{{ site_name }}</strong> i a altres serveis de la xarxa XMPP."}.
{"Current Discussion Topic","Assumpte de discussió actual"}.
{"Database failure","Error a la base de dades"}.
{"Database Tables Configuration at ","Configuració de la base de dades en "}.
{"Database","Base de dades"}.
{"December","Decembre"}.
{"Default users as participants","Els usuaris són participants per defecte"}.
{"Delete message of the day on all hosts","Elimina el missatge del dis de tots els hosts"}.
{"Delete message of the day on all hosts","Elimina el missatge del dia de tots els dominis"}.
{"Delete message of the day","Eliminar el missatge del dia"}.
{"Delete User","Eliminar Usuari"}.
{"Deliver event notifications","Entrega de notificacions d'events"}.
{"Deliver payloads with event notifications","Enviar payloads junt a les notificacions d'events"}.
{"Destroy a Hat","Destruir un barret"}.
{"Dino Logo","Logo de Dino"}.
{"Disable User","Deshabilitar un Usuari"}.
{"Disc only copy","Còpia sols en disc"}.
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","No li donis la teva contrasenya a ningú, ni tan sols als administradors del servidor XMPP."}.
{"Download and install {{ app_name }} below:","Descarrega e instal·la {{ app_name }} ací baix:"}.
{"Download Dino for Linux","Descarrega Dino per a Linux"}.
{"Download from Mac App Store","Descarrega de la Tenda d'Apps de Mac"}.
{"Download Gajim","Descarregar Gajim"}.
{"Download Renga for Haiku","Descarrega Renga per a Haiku"}.
{"Dump Backup to Text File at ","Exporta còpia de seguretat a fitxer de text en "}.
{"Dump to Text File","Exportar a fitxer de text"}.
{"Duplicated groups are not allowed by RFC6121","No estan permesos els grups duplicats al RFC6121"}.
@@ -126,6 +168,7 @@
{"Enable message archiving","Activar l'emmagatzematge de missatges"}.
{"Enabling push without 'node' attribute is not supported","No està suportat activar Push sense l'atribut 'node'"}.
{"End User Session","Finalitzar Sesió d'Usuari"}.
{"Enter a secure password that you do not use anywhere else.","Introdueix una contrasenya segura que no estiguis usant en cap altre lloc."}.
{"Enter nickname you want to register","Introdueix el sobrenom que vols registrar"}.
{"Enter path to backup file","Introdueix ruta al fitxer de còpia de seguretat"}.
{"Enter path to jabberd14 spool dir","Introdueix la ruta al directori de jabberd14 spools"}.
@@ -136,7 +179,7 @@
{"Exclude Jabber IDs from CAPTCHA challenge","Excloure Jabber IDs de la comprovació CAPTCHA"}.
{"Export all tables as SQL queries to a file:","Exporta totes les taules a un fitxer SQL:"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportar dades de tots els usuaris del servidor a arxius PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportar dades d'usuaris d'un host a arxius PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportar dades d'usuaris d'un domini a arxius PIEFXIS (XEP-0227):"}.
{"External component failure","Error al component extern"}.
{"External component timeout","Temps esgotat al component extern"}.
{"Failed to activate bytestream","Errada al activar bytestream"}.
@@ -146,6 +189,7 @@
{"Failed to process option '~s'","Ha fallat el processat de la opció '~s'"}.
{"Family Name","Cognom"}.
{"FAQ Entry","Entrada a la FAQ"}.
{"F-Droid Store Logo","Logo de la F-Droid Store"}.
{"February","Febrer"}.
{"File larger than ~w bytes","El fitxer es més gran que ~w bytes"}.
{"Fill in the form to search for any matching XMPP User","Emplena camps per a buscar usuaris XMPP que concorden"}.
@@ -154,27 +198,44 @@
{"Full List of Room Admins","Llista completa de administradors de la sala"}.
{"Full List of Room Owners","Llista completa de propietaris de la sala"}.
{"Full Name","Nom complet"}.
{"Gajim Logo","Logo de Gajim"}.
{"Get List of Active Users","Obté la llista d'usuaris actius"}.
{"Get List of Disabled Users","Obté la llista d'usuaris deshabilitats"}.
{"Get List of Idle Users","Obté la llista d'usuaris inactius"}.
{"Get List of Online Users","Obté la llista d'usuaris en línia"}.
{"Get List of Registered Users","Obté la llista d'usuaris registrats"}.
{"Get Number of Active Users","Obtenir Número d'Usuaris Actius"}.
{"Get Number of Disabled Users","Obtenir Número d'Usuaris Deshabilitats"}.
{"Get Number of Idle Users","Obtenir Número d'Usuaris Inactius"}.
{"Get Number of Online Users","Obtenir Número d'Usuaris Connectats"}.
{"Get Number of Registered Users","Obtenir Número d'Usuaris Registrats"}.
{"Get Pending","Obtenir Pendents"}.
{"Get started","Comencem"}.
{"Get User Last Login Time","Obtenir la última connexió d'Usuari"}.
{"Get User Roster","Obtenir llista de contactes de l'usuari"}.
{"Get User Statistics","Obtenir Estadístiques d'Usuari"}.
{"Given Name","Nom propi"}.
{"Google Play Store Logo","Logo de la Google Play Store"}.
{"Grant voice to this person?","Concedir veu a aquesta persona?"}.
{"has been banned","ha sigut bloquejat"}.
{"has been kicked because of a system shutdown","ha sigut expulsat perquè el sistema va a apagar-se"}.
{"has been kicked because of an affiliation change","ha sigut expulsat a causa d'un canvi d'afiliació"}.
{"has been kicked because the room has been changed to members-only","ha sigut expulsat perquè la sala ara és només per a membres"}.
{"has been kicked","ha sigut expulsat"}.
{"Hash computed from the list of hats available in a room","Hash computat de la llista de barrets disponibles a una sala"}.
{"Hash of the vCard-temp avatar of this room","Hash del avatar a vCard-temp d'esta sala"}.
{"Hat hue","To de color del barret"}.
{"Hat title","Títol del barret"}.
{"Hat URI","URI del barret"}.
{"Hats limit exceeded","El límit de tràfic ha sigut sobrepassat"}.
{"Host unknown","Host desconegut"}.
{"Hide","Amagar"}.
{"Hint","Sugeriment"}.
{"Host unknown","Domini desconegut"}.
{"Hostname invalid","Nom de domini no vàlid"}.
{"HTTP File Upload","HTTP File Upload"}.
{"Idle connection","Connexió sense us"}.
{"If you already have {{ app_name }} installed, we recommend that you continue the account creation process using the app by clicking on the button below:","Si ja tens instal·lat {{ app_name }}, et recomanem que continues la creació del teu compte usant eixa app, polsa el boto:"}.
{"If you don't have an XMPP client installed yet, here's a list of suitable clients for your platform.","Si encara no tens un client XMPP instal·lat, mira esta llista de clients disponibles per a la teva plataforma."}.
{"If you don't see the CAPTCHA image here, visit the web page.","Si no veus la imatge CAPTCHA açí, visita la pàgina web."}.
{"Import Directory","Importar directori"}.
{"Import File","Importar fitxer"}.
@@ -193,6 +254,7 @@
{"Incorrect value of 'action' in data form","Valor incorrecte de 'action' al formulari de dades"}.
{"Incorrect value of 'path' in data form","Valor incorrecte de 'path' al formulari de dades"}.
{"Installed Modules:","Mòduls instal·lats:"}.
{"Installed ok? Great! <strong>Click or tap the button below</strong> to accept your invite and continue with your account setup:","S'ha instal·lat correctament? Perfecte! <strong>Polsa en el següent boto</strong> per a acceptar l'invitació i continuar preparant el teu compte:"}.
{"Install","Instal·lar"}.
{"Insufficient privilege","Privilegi insuficient"}.
{"Internal server error","Error intern del servidor"}.
@@ -200,6 +262,11 @@
{"Invalid node name","Nom de node no vàlid"}.
{"Invalid 'previd' value","Valor no vàlid de 'previd'"}.
{"Invitations are not allowed in this conference","Les invitacions no estan permeses en aquesta sala de conferència"}.
{"Invite expired","La invitació ha expirat"}.
{"Invite Expired","La Invitació ha Expirat"}.
{"Invite to {{ site_name }}","Invitació a {{ site_name }}"}.
{"Invite User","Invitar Usuari"}.
{"Invite","Invitar"}.
{"IP addresses","Adreça IP"}.
{"is now known as","ara es conegut com"}.
{"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"}.
@@ -209,6 +276,7 @@
{"January","Gener"}.
{"JID normalization denied by service policy","S'ha denegat la normalització del JID per política del servei"}.
{"JID normalization failed","Ha fallat la normalització del JID"}.
{"Join {{ site_name }} with {{ app_name }}","Uneix-te a {{ site_name }} amb {{ app_name }}"}.
{"Joined MIX channels of ~ts","Canals MIX units de ~ts"}.
{"Joined MIX channels:","Canals MIX units:"}.
{"joins the room","entra a la sala"}.
@@ -220,10 +288,13 @@
{"Last message","Últim missatge"}.
{"Last month","Últim mes"}.
{"Last year","Últim any"}.
{"Launch {{ app_name }} and sign in using your account credentials.","Inicia {{ app_name }} i entra al compte usant les teves credencials."}.
{"Launch Beagle IM, and select \\'Yes\\' to add a new account. Click the \\'+\\' button under the empty account list and then enter your credentials.","Inicia Beagle IM, i selecciona \\'Sí\\' per a afegir un nou compte. Polsa el botó \\'+\\' baix la llista de comptes buida i ja podràs introduir les teues credencials."}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Els bits menys significants del hash SHA-256 del text deurien ser iguals a l'etiqueta hexadecimal"}.
{"leaves the room","surt de la sala"}.
{"List of users with hats","Llista d'usuaris amb barrets"}.
{"List of Hats","Llista de barrets"}.
{"List users with hats","Llista d'usuaris amb barrets"}.
{"Log in via web","Entrar usant la web"}.
{"Logged Out","Desconectat"}.
{"Logging","Registre"}.
{"Make participants list public","Crear una llista de participants pública"}.
@@ -240,9 +311,11 @@
{"Max payload size in bytes","Màxim tamany del payload en bytes"}.
{"Maximum file size","Mida màxima de fitxer"}.
{"Maximum Number of History Messages Returned by Room","Numero màxim de missatges de l'historia que retorna la sala"}.
{"Maximum number of invites reached","Ja has arribat al número màxim d'invitacions"}.
{"Maximum number of items to persist","Número màxim d'elements que persistixen"}.
{"Maximum Number of Occupants","Número màxim d'ocupants"}.
{"May","Maig"}.
{"Members are allowed to invite others","Els membres poden invitar a altres"}.
{"Membership is required to enter this room","Necessites ser membre d'aquesta sala per a poder entrar"}.
{"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.","Memoritza la teva contrasenya, o escriu-la en un paper guardat a un lloc segur. A XMPP no hi ha una forma automatitzada de recuperar la teva contrasenya si la oblides."}.
{"Mere Availability in XMPP (No Show Value)","Simplement disponibilitat a XMPP (sense valor de 'show')"}.
@@ -257,6 +330,7 @@
{"Moderator","Moderador"}.
{"Moderators Only","Només moderadors"}.
{"Module failed to handle the query","El modul ha fallat al gestionar la petició"}.
{"Monal Logo","Logo de Monal"}.
{"Monday","Dilluns"}.
{"Multicast","Multicast"}.
{"Multiple <item/> elements are not allowed by RFC6121","No estan permesos múltiples elements <item/> per RFC6121"}.
@@ -311,18 +385,21 @@
{"None","Cap"}.
{"Not allowed","No permès"}.
{"Not Found","No Trobat"}.
{"NOT FOUND","NO TROBAT"}.
{"Not subscribed","No subscrit"}.
{"Notify subscribers when items are removed from the node","Notificar subscriptors quan els elements són eliminats del node"}.
{"Notify subscribers when the node configuration changes","Notificar subscriptors quan canvia la configuració del node"}.
{"Notify subscribers when the node is deleted","Notificar subscriptors quan el node és eliminat"}.
{"November","Novembre"}.
{"Number of active users","Número d'usuaris actius"}.
{"Number of answers required","Número de respostes requerides"}.
{"Number of disabled users","Número d'Usuaris Deshabilitats"}.
{"Number of idle users","Número d'usuaris inactius"}.
{"Number of occupants","Número d'ocupants"}.
{"Number of Offline Messages","Número de missatges offline"}.
{"Number of online users","Número d'usuaris connectats"}.
{"Number of registered users","Número d'Usuaris Registrats"}.
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Número de segons després dels quals es purgaran automàticament elements, o `max` per a no tindre altre límit més que el màxim imposat pel servidor"}.
{"Occupants are allowed to invite others","Els ocupants poden invitar a altres"}.
{"Occupants are allowed to query others","Els ocupants poden enviar peticions a altres"}.
{"Occupants May Change the Subject","Els ocupants poden canviar el Tema"}.
{"October","Octubre"}.
@@ -345,12 +422,15 @@
{"Only service administrators are allowed to send service messages","Sols els administradors del servei tenen permís per a enviar missatges de servei"}.
{"Only those on a whitelist may associate leaf nodes with the collection","Només qui estiga a una llista blanca pot associar nodes fulla amb la col·lecció"}.
{"Only those on a whitelist may subscribe and retrieve items","Només qui estiga a una llista blanca pot subscriure's i recuperar elements"}.
{"Open the app","Obrir l'app"}.
{"Organization Name","Nom de la organizació"}.
{"Organization Unit","Unitat de la organizació"}.
{"Other Modules Available:","Altres mòduls disponibles:"}.
{"Other software","Altres programes"}.
{"Outgoing s2s Connections","Connexions s2s d'eixida"}.
{"Owner privileges required","Es requerixen privilegis de propietari de la sala"}.
{"Packet relay is denied by service policy","S'ha denegat el reenviament del paquet per política del servei"}.
{"Page navigation","Navegació de pàgina"}.
{"Participant ID","ID del Participant"}.
{"Participant","Participant"}.
{"Password Verification","Verificació de la Contrasenya"}.
@@ -366,6 +446,8 @@
{"Ping query is incorrect","La petició de Ping es incorrecta"}.
{"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.","Recorda que aquestes opcions només fan còpia de seguretat de la base de dades Mnesia. Si estàs utilitzant el mòdul d'ODBC també deus de fer una còpia de seguretat de la base de dades de SQL a part."}.
{"Please provide a password! Minimum length: {{ password_min_length }}","Per favor proporciona una contrasenya ! Llargària minima: {{ password_min_length }}"}.
{"Please provide a valid username!","Per favor proporciona un nom vàlid per al teu compte!"}.
{"Please, wait for a while before sending new voice request","Si us plau, espera una mica abans d'enviar una nova petició de veu"}.
{"Pong","Pong"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Posseir l'atribut 'ask' no està permès per RFC6121"}.
@@ -375,6 +457,7 @@
{"Previous session PID has exited","El procés de la sessió prèvia ha sortit"}.
{"Previous session PID is dead","El procés de la sessió prèvia està mort"}.
{"Previous session timed out","La sessió prèvia ha caducat"}.
{"Previous","Anterior"}.
{"private, ","privat, "}.
{"Public","Public"}.
{"Publish model","Model de publicació"}.
@@ -392,11 +475,18 @@
{"Receive notification of new items only","Rebre notificació només de nous elements"}.
{"Receive notification of new nodes only","Rebre notificació només de nous nodes"}.
{"Recipient is not in the conference room","El receptor no està en la sala de conferència"}.
{"Re-Enable User","Rehabilitar usuari"}.
{"Register an XMPP account","Registrar un compte XMPP"}.
{"Register on {{ site_name }}","Registrar a {{ site_name }}"}.
{"Register","Registrar"}.
{"Registration error","Error al fer el registre"}.
{"Registration Error","Error al fer el Registre"}.
{"Registration Form","Formulari de Registre"}.
{"Registration Success","Registre completat correctament"}.
{"Remote copy","Còpia remota"}.
{"Remove a hat from a user","Eliminar un barret d'un usuari"}.
{"Remove User","Eliminar usuari"}.
{"Renga Logo","Logo de Renga"}.
{"Replaced by new connection","Reemplaçat per una nova connexió"}.
{"Request has timed out","La petició ha caducat"}.
{"Request is ignored","La petició ha sigut ignorada"}.
@@ -408,6 +498,7 @@
{"Restore binary backup immediately:","Restaurar una còpia de seguretat binària ara mateix:"}.
{"Restore plain text backup immediately:","Restaurar una còpia de seguretat en format de text pla ara mateix:"}.
{"Restore","Restaurar"}.
{"Result","Resultat"}.
{"Roles and Affiliations that May Retrieve Member List","Rols i Afiliacions que poden recuperar la llista de membres"}.
{"Roles for which Presence is Broadcasted","Rols per als que sí se difon la seua presencia"}.
{"Roles that May Send Private Messages","Rols que poden enviar missatges privats"}.
@@ -421,29 +512,39 @@
{"Roster size","Mida de la llista"}.
{"Running Nodes","Nodes funcionant"}.
{"~s invites you to the room ~s","~s et convida a la sala ~s"}.
{"Sad person holding empty box","Persona trista agafant una caixa buida"}.
{"Saturday","Dissabte"}.
{"Scan invite code","Escaneja el codi d'invitació"}.
{"Scan with mobile device","Escanejar amb el mòbil"}.
{"Search from the date","Buscar des de la data"}.
{"Search Results for ","Resultats de la búsqueda "}.
{"Search the text","Buscar el text"}.
{"Search until the date","Buscar fins la data"}.
{"Search users in ","Cerca usuaris en "}.
{"Send announcement to all online users on all hosts","Enviar anunci a tots els usuaris connectats a tots els hosts"}.
{"Select","Seleccionar"}.
{"Send announcement to all online users on all hosts","Enviar anunci a tots els usuaris connectats a tots els dominis"}.
{"Send announcement to all online users","Enviar anunci a tots els usuaris connectats"}.
{"Send announcement to all users on all hosts","Enviar anunci a tots els usuaris de tots els hosts"}.
{"Send announcement to all users on all hosts","Enviar anunci a tots els usuaris de tots els dominis"}.
{"Send announcement to all users","Enviar anunci a tots els usuaris"}.
{"Send this invite to your device","Envia esta invitació al teu dispositiu"}.
{"September","Setembre"}.
{"Server:","Servidor:"}.
{"Service list retrieval timed out","L'intent de recuperar la llista de serveis ha caducat"}.
{"Session state copying timed out","La copia del estat de la sessió ha caducat"}.
{"Set message of the day and send to online users","Configurar el missatge del dia i enviar a tots els usuaris"}.
{"Set message of the day on all hosts and send to online users","Escriure missatge del dia en tots els hosts i enviar-ho als usuaris connectats"}.
{"Set message of the day on all hosts and send to online users","Escriure missatge del dia en tots els dominis i enviar-ho als usuaris connectats"}.
{"Shared Roster Groups","Grups de contactes compartits"}.
{"Show Integral Table","Mostrar Taula Integral"}.
{"Show Occupants Join/Leave","Mostrar Entrades/Eixides dels Ocupants"}.
{"Show Ordinary Table","Mostrar Taula Ordinaria"}.
{"Showing apps for <span class='platform-name'>your current platform</span> only. You may also <a href='#' id='show-all-clients-button' tabindex=\"{{ tabidx }}\">view all apps.</a>","Mostrant apps només per a <span class='platform-name'>la teua plataforma actual</span>. Tambè pots <a href='#' id='show-all-clients-button' tabindex=\"{{ tabidx }}\">vore totes les apps.</a>"}.
{"Show","Mostrar"}.
{"Shut Down Service","Apager el Servei"}.
{"Siskin IM Logo","Logo de Siskin IM"}.
{"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.","Alguns clients XMPP poden emmagatzemar la teva contrasenya al ordinador, però només hauries de fer això al teu ordinador personal, per raons de seguretat."}.
{"Sorry, it looks like this invite code has expired!","Perdona, però pareix que esta invitació ja ha expirat!"}.
{"Sorry, there was a problem registering your account.","Perdona, però hi ha hagut un error creant el compte."}.
{"Sources Specs:","Especificacions de Codi Font:"}.
{"Specify the access model","Especificar el model d'accés"}.
{"Specify the event message type","Especifica el tipus de missatge d'event"}.
@@ -451,12 +552,21 @@
{"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"}.
{"Step 1: Download and install {{ app_name }}","Pas 1: Descarrega e instal·la {{ app_name }}"}.
{"Step 1: Install {{ app_name }}","Pas 1: Instal·la {{ app_name }}"}.
{"Step 2: Activate your account","Pas 2: Activa el teu compte"}.
{"Step 2: Connect {{ app_name }} to your new account","Pas 2: Connecta {{ app_name }} al teu nou compte"}.
{"Stopped Nodes","Nodes parats"}.
{"Store binary backup:","Guardar una còpia de seguretat binària:"}.
{"Store plain text backup:","Guardar una còpia de seguretat en format de text pla:"}.
{"Stream management is already enabled","L'administració de la connexió (stream management) ja està activada"}.
{"Stream management is not enabled","L'administració de la conexió (stream management) no està activada"}.
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting using <strong>{{ app_name }}</strong> you need to first register an account.","<strong>{{ site_name }}</strong> és part de XMPP, una xarxa de missatgeria segura i descentralitzada. Per a començar a xarrar usant <strong>{{ app_name }}</strong> primer tens que registrar un compte."}.
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting you need to first register an account.","<strong>{{ site_name }}</strong> és part de la xarxa XMPP de missatgeria segura i descentralitzada. Per a començar a xarrar, primer tindries que crear-te un compte."}.
{"<strong>No suitable software installed right now?</strong> You can also log in to your account through our online web chat!","<strong>No tens instal·lat cap programa compatible?</strong> També pots connectarte al teu compte amb el nostre xat web en linia!"}.
{"<strong>Tip:</strong> You can open this invite on your mobile device by scanning a barcode with your camera.","<strong>Truquet:</strong> Pots obrir esta invitació al teu mòbil escanejant el codi amb la camera de fotos."}.
{"Subject","Tema"}.
{"Submit","Enviar"}.
{"Submitted","Enviat"}.
{"Subscriber Address","Adreça del Subscriptor"}.
{"Subscribers may publish","Els subscriptors poden publicar"}.
@@ -474,7 +584,7 @@
{"The body text of the last received message","El contingut del text de l'ultim missatge rebut"}.
{"The CAPTCHA is valid.","El CAPTCHA es vàlid."}.
{"The CAPTCHA verification has failed","La verificació CAPTCHA ha fallat"}.
{"The captcha you entered is wrong","El CAPTCHA que has proporcionat és incorrecte"}.
{"The captcha you entered is wrong","El captcha que has proporcionat és incorrecte"}.
{"The child nodes (leaf or collection) associated with a collection","El nodes fills (fulla o col·leccions) associats amb una col·lecció"}.
{"The collections with which a node is affiliated","Les col.leccions amb les que un node està afiliat"}.
{"The DateTime at which a leased subscription will end or has ended","La Data i Hora a la que una subscripció prestada terminarà o ha terminat"}.
@@ -485,6 +595,9 @@
{"The JIDs of those to contact with questions","Els JIDs a qui contactar amb preguntes"}.
{"The JIDs of those with an affiliation of owner","Els JIDs de qui tenen una afiliació de propietaris"}.
{"The JIDs of those with an affiliation of publisher","Els JIDs de qui tenen una afiliació de publicadors"}.
{"The list of all active users","La llista de tots els usuaris actius"}.
{"The list of all disabled users","La llista de tots els usuaris deshabilitats"}.
{"The list of all idle users","La llista de tots els usuaris inactius"}.
{"The list of all online users","La llista de tots els usuaris en línia"}.
{"The list of all users","La llista de tots els usuaris"}.
{"The list of JIDs that may associate leaf nodes with a collection","La llista de JIDs que poden associar nodes fulla amb una col·lecció"}.
@@ -506,16 +619,20 @@
{"The presence states for which an entity wants to receive notifications","El estats de presencia per als quals una entitat vol rebre notificacions"}.
{"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 role","El rol"}.
{"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 token provided is either invalid or expired.","El token proporcionat no es vàlid o ja ha expirat."}.
{"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: "}.
{"There was an error creating the account: ","Hi ha hagut un error creant el compte: "}.
{"There was an error deleting the account: ","Hi ha hagut un error esborrant el compte: "}.
{"This button works only if you have the app installed already!","Aquest botó funciona només si ja tens la app instal·lada!"}.
{"This is an invite from <strong>{{ inviter }}</strong> to connect and chat on the XMPP network. If you already have an XMPP client installed just press the button below!","Esta es una invitació de <strong>{{ inviter }}</strong> per a connectar i xarrar en la xarxa XMPP. Si ja tens un client XMPP instal·lat, ja pots polsar el boto de baix!"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Això no distingeix majúscules de minúscules: macbeth es el mateix que MacBeth i 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.","Aquesta pàgina permet crear un compte XMPP en aquest servidor XMPP. El teu JID (Jabber ID; Identificador Jabber) tindrà aquesta forma: usuari@servidor. Si us plau, llegeix amb cura les instruccions per emplenar correctament els camps."}.
{"This page allows to unregister an XMPP account in this XMPP server.","Aquesta pàgina permet esborrar un compte XMPP en aquest servidor XMPP."}.
@@ -524,7 +641,9 @@
{"Thursday","Dijous"}.
{"Time delay","Temps de retard"}.
{"Timed out waiting for stream resumption","Massa temps esperant que es resumisca la connexió"}.
{"To get started, you need to install an app for your platform:","Per a començar, tens que instal·lar alguna app:"}.
{"To register, visit ~s","Per a registrar-te, visita ~s"}.
{"To start chatting, you need to enter your new account credentials into your chosen XMPP software.","Per a començar a xarrar, tens que proporcionar les credencials del teu no compte al programa XMPP escollit."}.
{"To ~ts","A ~ts"}.
{"Token TTL","Token TTL"}.
{"Too many active bytestreams","N'hi ha massa Bytestreams actius"}.
@@ -551,12 +670,13 @@
{"Unsupported <index/> element","Element <index/> no soportat"}.
{"Unsupported version","Versió no suportada"}.
{"Update message of the day (don't send)","Actualitzar el missatge del dia (no enviar)"}.
{"Update message of the day on all hosts (don't send)","Actualitza el missatge del dia en tots els hosts (no enviar)"}.
{"Update message of the day on all hosts (don't send)","Actualitza el missatge del dia en tots els dominis (no enviar)"}.
{"Update specs to get modules source, then install desired ones.","Actualitza les especificacions per obtindre el codi font dels mòduls, després instal·la els que vulgues."}.
{"Update Specs","Actualitzar Especificacions"}.
{"Updating the vCard is not supported by the vCard storage backend","El sistema d'almacenament de vCard no te capacitat per a actualitzar la vCard"}.
{"Upgrade","Actualitza"}.
{"URL for Archived Discussion Logs","URL dels Arxius de Discussions"}.
{"Use a <em>QR code</em> scanner on your mobile device to scan the code below:","Usa un escanejador de <em>codis QR</em> al te mòbil per a escanejar aquest codi:"}.
{"User already exists","El usuari ja existeix"}.
{"User JID","JID del usuari"}.
{"User (jid)","Usuari (jid)"}.
@@ -566,6 +686,9 @@
{"User session not found","Sessió d'usuari no trobada"}.
{"User session terminated","Sessió d'usuari terminada"}.
{"User ~ts","Usuari ~ts"}.
{"Username invalid","El nom d'usuari no es vàlid"}.
{"Username is reserved","El nom d'usuari està reservat"}.
{"Username","Nom d'usuari"}.
{"Username:","Nom d'usuari:"}.
{"Users are not allowed to register accounts so quickly","Els usuaris no tenen permís per a crear comptes tan depresa"}.
{"Users Last Activity","Última activitat d'usuari"}.
@@ -578,12 +701,13 @@
{"Value 'set' of 'type' attribute is not allowed","El valor 'set' a l'atribut 'type' no és permès"}.
{"vCard User Search","vCard recerca d'usuari"}.
{"View joined MIX channels","Vore els canals MIX units"}.
{"Virtual Hosts","Hosts virtuals"}.
{"Virtual Hosts","Dominis Virtuals"}.
{"Visitors are not allowed to change their nicknames in this room","Els visitants no tenen permés canviar el seus Nicknames en esta sala"}.
{"Visitors are not allowed to send messages to all occupants","Els visitants no poden enviar missatges a tots els ocupants"}.
{"Visitor","Visitant"}.
{"Voice request","Petició de veu"}.
{"Voice requests are disabled in this conference","Les peticions de veu es troben desactivades en aquesta conferència"}.
{"Web client which allows to join the room anonymously","Client web que permet entrar a la sala anonimament"}.
{"Wednesday","Dimecres"}.
{"When a new subscription is processed and whenever a subscriber comes online","Quan es processa una nova subscripció i un subscriptor es connecta"}.
{"When a new subscription is processed","Quan es processa una nova subscripció"}.
@@ -601,6 +725,7 @@
{"Wrong parameters in the web formulary","Paràmetres incorrectes en el formulari web"}.
{"Wrong xmlns","El xmlns ès incorrecte"}.
{"XMPP Account Registration","Registre de compte XMPP"}.
{"XMPP client for Haiku","Client XMPP per a Haiku"}.
{"XMPP Domains","Dominis XMPP"}.
{"XMPP Show Value of Away","Valor 'show' de XMPP: Ausent"}.
{"XMPP Show Value of Chat","Valor 'show' de XMPP: Disposat per a xarrar"}.
@@ -610,8 +735,17 @@
{"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 connect to {{ site_name }} using any XMPP-compatible software. If your preferred software is not listed above, you may still <a href=\"{{ registration_url }}\" tabindex='{{ tabidx }}'>register an account manually</a>.","Pots connectar-te a {{ site_name }} usant qualsevol programa compatible amb XMPP. Si el teu programa preferit no està en esta llista, pots <a href=\"{{ registration_url }}\" tabindex='{{ tabidx }}'>registrarte el teu compte manualment</a>."}.
{"You can later change your password using an XMPP client.","Podràs canviar la teva contrasenya més endavant utilitzant un client XMPP."}.
{"You can now set up {{ app_name }} and connect it to your new account.","Ara pots configurar {{ app_name }} i connectar al teu nou compte."}.
{"You can start chatting right away with {{ app_name }}. Let's get started!","Ja pots començar a xarrar usant {{ app_name }}. Comencem!"}.
{"You can transfer this invite to your mobile device by scanning a code with your camera.","Pots transferir esta invitació al teu mòbil si escanejes el codi amb la càmera de fotos."}.
{"You have been banned from this room","Has sigut bloquejat en aquesta sala"}.
{"You have been invited to chat on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Has rebut una invitació per a xarrar a {{ site_name }}, que és part de la xarxa XMPP de missatgeria segura i descentralitzada."}.
{"You have been invited to chat on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Has rebut una invitació per a xarrar a <strong>{{ site_name }}</strong>, que és part de la xarxa XMPP de missatgeria segura i descentralitzada."}.
{"You have been invited to chat with <strong>{{ inviter }}</strong> on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Has rebut una invitació a xarrar amb <strong>{{ inviter }}</strong> a {{ site_name }}, que és part de la xarxa XMPP de missatgeria segura i descentralitzada."}.
{"You have been invited to chat with <strong>{{ inviter }}</strong> on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","T'han invitat a xarrar amb <strong>{{ inviter }}</strong> a <strong>{{ site_name }}</strong>, que és part de la xarxa XMPP de missatgeria segura i descentralitzada."}.
{"You have created an account on <strong>{{ site_name }}</strong>.","Has creat un compte en <strong>{{ site_name }}</strong>."}.
{"You have joined too many conferences","Has entrat en massa sales de conferència"}.
{"You must fill in field \"Nickname\" in the form","Deus d'omplir el camp \"Nickname\" al formulari"}.
{"You need a client that supports x:data and CAPTCHA to register","Necessites un client amb suport x:data i de CAPTCHA para poder registrar-te"}.
@@ -619,6 +753,7 @@
{"You need an x:data capable client to search","Necessites un client amb suport x:data per a poder buscar"}.
{"Your active privacy list has denied the routing of this stanza.","La teva llista de privacitat activa ha denegat l'encaminament d'aquesta stanza."}.
{"Your contact offline message queue is full. The message has been discarded.","La teua cua de missatges offline és plena. El missatge ha sigut descartat."}.
{"Your password is stored encrypted on the server and will not be accessible after you close this page. Keep it safe and never share it with anyone.","La teva contrasenya es guardarà xifrada al servidor, i no serà accessible una vegada que tanques esta pàgina. Mantin la contrasenya segura i no la compartis amb ningú mes."}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","La teua petició de subscripció i/o missatges a ~s han sigut bloquejats. Per a desbloquejar-los, visita ~s"}.
{"Your XMPP account was successfully registered.","El teu compte XMPP ha sigut creat correctament."}.
{"Your XMPP account was successfully unregistered.","El teu compte XMPP ha sigut esborrat correctament."}.
+83 -9
View File
@@ -4,15 +4,24 @@
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
{" has set the subject to: "," změnil(a) téma na: "}.
{"A description of the node","Popis uzlu"}.
{"A friendly name for the node","Přívětivé jméno pro uzel"}.
{"A fully-featured desktop chat client for Windows and Linux.","Plně funkční desktopový chatovací klient pro Windows a Linux."}.
{"A lightweight and powerful XMPP client for iPhone and iPad. It provides an easy way to talk and share moments with your friends.","Lehký a výkonný XMPP klient pro iPhone a iPad. Nabízí snadný způsob, jak komunikovat a sdílet okamžiky s přáteli."}.
{"A modern open-source chat client for iPhone and iPad. It is easy to use and has a clean user interface.","Moderní chatovací klient s otevřeným zdrojovým kódem pro iPhone a iPad. Snadno se používá a má čisté uživatelské rozhraní."}.
{"A modern open-source chat client for Mac. It is easy to use and has a clean user interface.","Moderní chatovací klient s otevřeným zdrojovým kódem pro Mac. Snadno se používá a má čisté uživatelské rozhraní."}.
{"A password is required to enter this room","Pro vstup do místnosti musíte zadat heslo"}.
{"Accept invite using {{ app_name }}","Přijmout pozvánku pomocí {{ app_name }}"}.
{"Accept","Přijmout"}.
{"Access denied by service policy","Přístup byl zamítnut nastavením služby"}.
{"Action on user","Akce aplikovaná na uživatele"}.
{"Add Contact","Přidat kontakt"}.
{"Add User","Přidat uživatele"}.
{"Administration of ","Administrace "}.
{"Administration","Administrace"}.
{"Administrator privileges required","Potřebujete práva administrátora"}.
{"After clicking the button you will be taken to {{ app_name }} to finish setting up your new {{ site_name }} account.","Po kliknutí na tlačítko budete přesměrováni do {{ app_name }}, kde dokončíte nastavení svého nového účtu na {{ site_name }}."}.
{"After successfully installing {{ app_name }}, come back to this page and <strong>continue with Step 2</strong>.","Po úspěšné instalaci {{ app_name }} se vraťte na tuto stránku a <strong>pokračujte krokem 2</strong>."}.
{"All activity","Všechny aktivity"}.
{"All Users","Všichni uživatelé"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Povolit tomuto Jabber ID odebírat tento pubsub uzel?"}.
@@ -25,7 +34,9 @@
{"Allow visitors to send status text in presence updates","Povolit návštěvníkům posílat stavové zprávy ve statusu"}.
{"Allow visitors to send voice requests","Povolit uživatelům posílat žádosti o voice práva"}.
{"Announcements","Oznámení"}.
{"API Commands","API příkazy"}.
{"April",". dubna"}.
{"As a final reminder, your account details are shown below:","Pro připomenutí, níže jsou uvedeny údaje o vašem účtu:"}.
{"August",". srpna"}.
{"Automatic node creation is not enabled","Automatické vytváření uzlů není povoleno"}.
{"Backup Management","Správa zálohování"}.
@@ -33,6 +44,7 @@
{"Backup to File at ","Záloha do souboru na "}.
{"Backup","Zálohovat"}.
{"Bad format","Nesprávný formát"}.
{"Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.","Beagle IM od Tigase, Inc. je lehký a výkonný klient pro macOS."}.
{"Birthday","Datum narození"}.
{"Both the username and the resource are required","Uživatelské jméno i zdroj jsou požadované položky"}.
{"Bytestream already activated","Bytestream již byl aktivován"}.
@@ -51,14 +63,18 @@
{"Chatroom is stopped","Místnost zastavena"}.
{"Chatrooms","Místnosti"}.
{"Choose a username and password to register with this server","Zadejte jméno uživatele a heslo pro registraci na tomto serveru"}.
{"Choose a username, this will become the first part of your new chat address.","Zvolte si uživatelské jméno, to se stane první částí Vaší chatovací adresy."}.
{"Choose storage type of tables","Vyberte typ úložiště pro tabulky"}.
{"Choose whether to approve this entity's subscription.","Zvolte, zda chcete schválit odebírání touto entitou."}.
{"City","Město"}.
{"Click the button to open the Dino website where you can download and install it on your PC.","Kliknutím na tlačítko se otevře webová stránka, odkud si můžete stáhnout aplikaci Dino a nainstalovat ji na svůj počítač."}.
{"Close","Zavřít"}.
{"Commands","Příkazy"}.
{"Conference room does not exist","Místnost neexistuje"}.
{"Configuration of room ~s","Konfigurace místnosti ~s"}.
{"Configuration","Konfigurace"}.
{"Country","Země"}.
{"Creating an account will allow to communicate with other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Vytvořením účtu budete moci komunikovat s ostatními lidmi na serveru <strong>{{ site_name }}</strong> i na ostatních serverech v rámci sítě XMPP."}.
{"Database failure","Chyba databáze"}.
{"Database Tables Configuration at ","Konfigurace databázových tabulek "}.
{"Database","Databáze"}.
@@ -70,6 +86,10 @@
{"Deliver event notifications","Doručovat upozornění na události"}.
{"Deliver payloads with event notifications","Doručovat náklad s upozorněním na událost"}.
{"Disc only copy","Jen kopie disku"}.
{"Download and install {{ app_name }} below:","Stáhněte a nainstalujte {{ app_name }}:"}.
{"Download Dino for Linux","Stáhnout Dino pro Linux"}.
{"Download Gajim","Stahnout Gajim"}.
{"Download Renga for Haiku","Stáhnout Renga pro Haiku"}.
{"Dump Backup to Text File at ","Uložit zálohu do textového souboru na "}.
{"Dump to Text File","Uložit do textového souboru"}.
{"Edit Properties","Upravit vlastnosti"}.
@@ -85,6 +105,7 @@
{"Enable message archiving","Povolit ukládání historie zpráv"}.
{"Enabling push without 'node' attribute is not supported","Aktivováno push bez atributu 'node' není podporováno"}.
{"End User Session","Ukončit sezení uživatele"}.
{"Enter a secure password that you do not use anywhere else.","Zadejte bezpečné heslo, které nikde jinde nepoužíváte."}.
{"Enter nickname you want to register","Zadejte přezdívku, kterou chcete zaregistrovat"}.
{"Enter path to backup file","Zadajte cestu k souboru se zálohou"}.
{"Enter path to jabberd14 spool dir","Zadejte cestu k jabberd14 spool adresáři"}.
@@ -117,9 +138,11 @@
{"has been banned","byl(a) zablokován(a)"}.
{"has been kicked because of a system shutdown","byl(a) vyhozen(a), protože dojde k vypnutí systému"}.
{"has been kicked because of an affiliation change","byl(a) vyhozen(a) kvůli změně přiřazení"}.
{"has been kicked because the room has been changed to members-only","byl(a) vyhozen(a), protože mísnost je nyní pouze pro členy"}.
{"has been kicked because the room has been changed to members-only","byl(a) vyhozen(a), protože místnost je nyní pouze pro členy"}.
{"has been kicked","byl(a) vyhozen(a) z místnosti"}.
{"Hide","Skrýt"}.
{"Host unknown","Neznámý hostitel"}.
{"If you don't have an XMPP client installed yet, here's a list of suitable clients for your platform.","Pokud ještě nemáte nainstalovaného klienta XMPP, zde je seznam vhodných klientů pro vaši platformu."}.
{"If you don't see the CAPTCHA image here, visit the web page.","Pokud zde nevidíte obrázek CAPTCHA, přejděte na webovou stránku."}.
{"Import Directory","Import adresáře"}.
{"Import File","Import souboru"}.
@@ -141,6 +164,7 @@
{"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"}.
{"Invite expired","Platnost pozvánky vypršela"}.
{"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"}.
@@ -152,21 +176,24 @@
{"joins the room","vstoupil(a) do místnosti"}.
{"July",". července"}.
{"June",". června"}.
{"Just created","Právě vytvořen"}.
{"Last Activity","Poslední aktivita"}.
{"Last login","Poslední přihlášení"}.
{"Last message","Poslední zpráva"}.
{"Last month","Poslední měsíc"}.
{"Last year","Poslední rok"}.
{"Launch {{ app_name }} and sign in using your account credentials.","Spusťte {{ app_name }} a přihlaste se pomocí Vašich přihlašovacích údajů."}.
{"leaves the room","opustil(a) místnost"}.
{"Logged Out","Odhlášen"}.
{"Make participants list public","Nastavit seznam účastníků jako veřejný"}.
{"Make room CAPTCHA protected","Chránit místnost pomocí CAPTCHA"}.
{"Make room members-only","Zpřístupnit místnost jen členům"}.
{"Make room moderated","Nastavit místnost jako moderovanou"}.
{"Make room password protected","Chránit místnost heslem"}.
{"Make room persistent","Nastavit místnost jako stálou"}.
{"Make room public searchable","Nastavit místnost jako veřejnou"}.
{"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 file size","Maximální velikost souboru"}.
{"Maximum Number of Occupants","Maximální počet účastníků"}.
{"May",". května"}.
{"Membership is required to enter this room","Pro vstup do místnosti musíte být členem"}.
@@ -193,7 +220,7 @@
{"No body provided for announce message","Zpráva neobsahuje text"}.
{"No data form found","Nebyl nalezen datový formulář"}.
{"No Data","Žádná data"}.
{"No features available","Žádné funce nejsou dostupné"}.
{"No features available","Žádné funkce nejsou dostupné"}.
{"No hook has processed this command","Žádný hook nebyl zpracován tímto příkazem"}.
{"No info about last activity found","Nebyla žádná informace o poslední aktivitě"}.
{"No 'item' element found","Element 'item' nebyl nalezen"}.
@@ -219,6 +246,7 @@
{"Nodeprep has failed","Nodeprep chyboval"}.
{"Nodes","Uzly"}.
{"None","Nic"}.
{"Not allowed","Nepovoleno"}.
{"Not Found","Nenalezeno"}.
{"Not subscribed","Není odebíráno"}.
{"Notify subscribers when items are removed from the node","Upozornit odběratele na odstranění položek z uzlu"}.
@@ -236,14 +264,13 @@
{"Only deliver notifications to available users","Doručovat upozornění jen právě přihlášeným uživatelům"}.
{"Only <enable/> or <disable/> tags are allowed","Pouze značky <enable/> nebo <disable/>jsou povoleny"}.
{"Only <list/> element is allowed in this query","Pouze element <list/> je povolen v tomto dotazu"}.
{"Only members may query archives of this room","Pouze moderátoři mají povoleno měnit téma místnosti"}.
{"Only moderators and participants are allowed to change the subject in this room","Jen moderátoři a účastníci mají povoleno měnit téma této místnosti"}.
{"Only moderators are allowed to change the subject in this room","Jen moderátoři mají povoleno měnit téma místnosti"}.
{"Only moderators can approve voice requests","Pouze moderátoři mohou schválit žádosti o voice práva"}.
{"Only occupants are allowed to send messages to the conference","Jen členové mají povolené zasílat zprávy do místnosti"}.
{"Only occupants are allowed to send queries to the conference","Jen členové mohou odesílat požadavky (query) do místnosti"}.
{"Only occupants are allowed to send messages to the conference","Pouze členové mají povolené zasílat zprávy do místnosti"}.
{"Only occupants are allowed to send queries to the conference","Pouze členové mohou odesílat požadavky (query) do místnosti"}.
{"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 Name","Název organizace"}.
{"Organization Unit","Oddělení"}.
{"Other Modules Available:","Ostatní dostupné moduly:"}.
{"Outgoing s2s Connections","Odchozí s2s spojení"}.
@@ -260,10 +287,14 @@
{"Ping query is incorrect","Ping dotaz je nesprávný"}.
{"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.","Podotýkáme, že tato nastavení budou zálohována do zabudované databáze Mnesia. Pokud používáte ODBC modul, musíte zálohovat svoji SQL databázi samostatně."}.
{"Please provide a password! Minimum length: {{ password_min_length }}","Prosím vyplňte heslo! Minimální délka hesla: {{ password_min_length }}"}.
{"Please provide a valid username!","Prosím, zadejte platné uživatelské jméno!"}.
{"Please, wait for a while before sending new voice request","Prosím, počkejte chvíli před posláním nové žádosti o voice práva"}.
{"Pong","Pong"}.
{"Present real Jabber IDs to","Odhalovat skutečná Jabber ID"}.
{"Previous","Předchozí"}.
{"private, ","soukromá, "}.
{"Public","Veřejný"}.
{"Publish-Subscribe","Publish-Subscribe"}.
{"PubSub subscriber request","Žádost odběratele PubSub"}.
{"Purge all items when the relevant publisher goes offline","Smazat všechny položky, pokud se příslušný poskytovatel odpojí"}.
@@ -273,10 +304,13 @@
{"RAM copy","Kopie RAM"}.
{"Really delete message of the day?","Skutečně smazat zprávu dne?"}.
{"Recipient is not in the conference room","Příjemce se nenachází v místnosti"}.
{"Re-Enable User","Znovu povolit uživatele"}.
{"Register on {{ site_name }}","Registrovat se na {{ site_name }}"}.
{"Register","Zaregistrovat se"}.
{"Remote copy","Vzdálená kopie"}.
{"Remove User","Odstranit uživatele"}.
{"Replaced by new connection","Nahrazeno novým spojením"}.
{"Request has timed out","Časový limit požadavku vypršel"}.
{"Resources","Zdroje"}.
{"Restart Service","Restartovat službu"}.
{"Restore Backup from File at ","Obnovit zálohu ze souboru na "}.
@@ -284,6 +318,7 @@
{"Restore binary backup immediately:","Okamžitě obnovit binární zálohu:"}.
{"Restore plain text backup immediately:","Okamžitě obnovit zálohu z textového souboru:"}.
{"Restore","Obnovit"}.
{"Result","Výsledek"}.
{"Roles for which Presence is Broadcasted","Role, pro které je zpráva o stavu šířena"}.
{"Room Configuration","Nastavení místnosti"}.
{"Room creation is denied by service policy","Pravidla služby nepovolují vytvořit místnost"}.
@@ -293,49 +328,77 @@
{"Roster groups allowed to subscribe","Skupiny kontaktů, které mohou odebírat"}.
{"Roster size","Velikost seznamu kontaktů"}.
{"Running Nodes","Běžící uzly"}.
{"Sad person holding empty box","Smutný člověk držící prázdnou krabici"}.
{"Saturday","Sobota"}.
{"Scan invite code","Naskenovat kód pozvánky"}.
{"Scan with mobile device","Skenovat pomocí mobilního zařízení"}.
{"Search from the date","Hledat od data"}.
{"Search Results for ","Výsledky hledání pro "}.
{"Search the text","Hledat text"}.
{"Search until the date","Hledat do data"}.
{"Search users in ","Hledat uživatele v "}.
{"Select","Vybrat"}.
{"Send announcement to all online users on all hosts","Odeslat oznámení všem online uživatelům na všech hostitelích"}.
{"Send announcement to all online users","Odeslat oznámení všem online uživatelům"}.
{"Send announcement to all users on all hosts","Odeslat oznámení všem uživatelům na všech hostitelích"}.
{"Send announcement to all users","Odeslat oznámení všem uživatelům"}.
{"Send this invite to your device","Zaslat tuto pozvánku na Vaše zařízení"}.
{"September",". září"}.
{"Server:","Server:"}.
{"Service list retrieval timed out","Časový limit pro načtení seznamu služeb vypršel"}.
{"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 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"}.
{"Shut Down Service","Vypnout službu"}.
{"Sorry, it looks like this invite code has expired!","Je nám líto, ale zdá se, že platnost pozvánky vypršela!"}.
{"Specify the access model","Uveďte přístupový model"}.
{"Specify the event message type","Zvolte typ zpráv pro události"}.
{"Specify the publisher model","Specifikovat model pro publikování"}.
{"Step 1: Download and install {{ app_name }}","Krok 1: Stáhněte si a nainstalujte {{ app_name }}"}.
{"Step 1: Install {{ app_name }}","Krok 1: Instalace {{ app_name }}"}.
{"Step 2: Activate your account","Krok 2: Aktivujte svůj účet"}.
{"Step 2: Connect {{ app_name }} to your new account","Step 2: Připojte se pomocí {{ app_name }} k Vašemu novému účtu"}.
{"Stopped Nodes","Zastavené uzly"}.
{"Store binary backup:","Uložit binární zálohu:"}.
{"Store plain text backup:","Uložit zálohu do textového souboru:"}.
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting using <strong>{{ app_name }}</strong> you need to first register an account.","<strong>{{ site_name }}</strong> je součástí XMPP, bezpečné a decentralizované sítě pro zasílání zpráv. Abyste mohli začít chatovat pomocí aplikace <strong>{{ app_name }}</strong>, musíte se nejprve registrovat."}.
{"<strong>Tip:</strong> You can open this invite on your mobile device by scanning a barcode with your camera.","<strong>Tip:</strong> Tuto pozvánku můžete otevřít na svém mobilním zařízení naskenováním kódu fotoaparátem."}.
{"Subject","Předmět"}.
{"Submit","Odeslat"}.
{"Submitted","Odeslané"}.
{"Subscriber Address","Adresa odběratele"}.
{"Subscriptions are not allowed","Předplatné není povoleno"}.
{"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 already exists","Účet již existuje"}.
{"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 datetime when the node was created","Datum a čas vytvoření uzlu"}.
{"The default language of the node","Výchozí jazyk uzlu"}.
{"The feature requested is not supported by the conference","Požadovaná vlastnost není podporována touto místností"}.
{"The list of all online users","Seznam všech online uživatelů"}.
{"The list of all users","Seznam všech uživatelů"}.
{"The NodeID of the relevant node","NodeID příslušného uzlu"}.
{"The number of subscribers to the node","Počet odběratelů uzlu"}.
{"The number of unread or undelivered messages","Počet nepřečtených nebo nedoručených zpráv"}.
{"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 passwords are different","Hesla nejsou stejná"}.
{"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 role","Role"}.
{"The sender of the last received message","Odesílatel poslední doručené zprávy"}.
{"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 button works only if you have the app installed already!","Toto tlačítko funguje pouze v případě, že máte nainstalovanou vhodnou aplikaci!"}.
{"This room is not anonymous","Tato místnost není anonymní"}.
{"Thursday","Čtvrtek"}.
{"Time delay","Časový posun"}.
@@ -358,10 +421,12 @@
{"Unsupported <index/> element","Nepodporovaný <index/> element"}.
{"Update message of the day (don't send)","Aktualizovat zprávu dne (neodesílat)"}.
{"Update message of the day on all hosts (don't send)","Aktualizovat zprávu dne pro všechny hostitele (neodesílat)"}.
{"Use a <em>QR code</em> scanner on your mobile device to scan the code below:","Naskenujte kód níže pomocí skeneru <em>QR kódů</em> na Vašem mobilním zařízení:"}.
{"User already exists","Uživatel již existuje"}.
{"User JID","Jabber ID uživatele"}.
{"User (jid)","Uživatel (JID)"}.
{"User Management","Správa uživatelů"}.
{"User removed","Uživatel odstraněn"}.
{"User session not found","Sezení uživatele nebylo nalezeno"}.
{"User session terminated","Sezení uživatele bylo ukončeno"}.
{"Username:","Uživatelské jméno:"}.
@@ -384,13 +449,22 @@
{"Wednesday","Středa"}.
{"When to send the last published item","Kdy odeslat poslední publikovanou položku"}.
{"Whether to allow subscriptions","Povolit odebírání"}.
{"Wrong xmlns","Chybné xmlns"}.
{"XMPP client for Haiku","XMPP klient pro Haiku"}.
{"XMPP Domains","XMPP domény"}.
{"You are being removed from the room because of a system shutdown","Budete vyloučeni z místnosti kvůli vypnutí systému"}.
{"You are not allowed to send private messages","Nemáte povoleno posílat soukromé zprávy"}.
{"You can transfer this invite to your mobile device by scanning a code with your camera.","Tuto pozvánku můžete přenést do svého mobilního zařízení naskenováním kódu pomocí fotoaparátu."}.
{"You have been banned from this room","Byl jste vyloučen z této místnosti"}.
{"You have joined too many conferences","Vstoupil jste do příliš velkého množství místností"}.
{"You have been invited to chat with <strong>{{ inviter }}</strong> on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Byli jste pozváni do chatu s <strong>{{ inviter }}</strong> na serveru <strong>{{ site_name }}</strong>, který je součástí XMPP - bezpečné a decentralizované sítě pro zasílání zpráv."}.
{"You have joined too many conferences","Vstoupili jste do příliš velkého množství místností"}.
{"You must fill in field \"Nickname\" in the form","Musíte vyplnit políčko \"Přezdívka\" ve formuláři"}.
{"You need a client that supports x:data and CAPTCHA to register","Pro registraci potřebujete klienta s podporou x:data a CAPTCHA"}.
{"You need a client that supports x:data to register the nickname","Pro registraci přezdívky potřebujete klienta s podporou x:data"}.
{"You need an x:data capable client to search","K vyhledávání potřebujete klienta podporujícího x:data"}.
{"Your active privacy list has denied the routing of this stanza.","Vaše nastavení soukromí znemožnilo směrování této stance."}.
{"Your contact offline message queue is full. The message has been discarded.","Fronta offline zpráv pro váš kontakt je plná. Zpráva byla zahozena."}.
{"Your password is stored encrypted on the server and will not be accessible after you close this page. Keep it safe and never share it with anyone.","Vaše heslo je zašifrováno a uloženo na serveru a až zavřete tuto stránku, nebude již dostupné. Uložte si ho do bezpečí a nikdy ho s nikým nesdílejte."}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Nesmíte posílat zprávy na ~s. Pro povolení navštivte ~s"}.
{"Your XMPP account was successfully registered.","Váš účet XMPP byl úspěšně zaregistrován."}.
{"You're not allowed to create nodes","Nemáte povoleno vytvářet uzly"}.
+148 -7
View File
@@ -4,22 +4,34 @@
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
{" (Add * to the end of field to match substring)"," (Fügen Sie * am Ende des Feldes hinzu um nach Teilzeichenketten zu suchen)"}.
{"{{ app_name }} already installed?","{{ app_name }} bereits installiert?"}.
{" has set the subject to: "," hat das Thema geändert auf: "}.
{"{{ inviter }} has invited you to connect!","{{ inviter }} will sich mit dir verbinden!"}.
{"# participants","# Teilnehmer"}.
{"A description of the node","Eine Beschreibung des Knotens"}.
{"A friendly name for the node","Ein benutzerfreundlicher Name für den Knoten"}.
{"A fully-featured desktop chat client for Windows and Linux.","Ein funktionsreicher Desktop-Client für Windows und Linux."}.
{"A lean Jabber/XMPP client for Android. It aims at usability, low overhead and security, and works on low-end Android devices starting with Android 4.0.","Ein schlanker Jabber/XMPP-Client für Android mit Fokus Benutzerfreundlichkeit und Sicherheit. Er funktioniert auch mit langsameren Android-Geräten mit Android 4.0 oder neuer."}.
{"A lightweight and powerful XMPP client for iPhone and iPad. It provides an easy way to talk and share moments with your friends.","Ein schlanker aber funktionsreicher XMPP-Client für iPhone und iPad. Ein einfacher Weg um mit Deinen Freunden zu kommunizieren und Erinnerungen zu teilen."}.
{"A modern open-source chat client for iPhone and iPad. It is easy to use and has a clean user interface.","Ein moderner open-source Chatclient für iPhone und iPad mit einfacher und übersichtlicher Benutzeroberfläche."}.
{"A modern open-source chat client for Mac. It is easy to use and has a clean user interface.","Ein moderner open-source Chatclient für Mac mit einfacher und übersichtlicher Benutzeroberfläche."}.
{"A modern open-source chat client for the desktop. It focuses on providing a clean and reliable Jabber/XMPP experience while having your privacy in mind.","Ein moderner open-source Jabber/XMPP Chatclient für den Desktop mit Fokus auf Einfachheit und Zuverlässigkeit, aber auch Schutz deiner Privatsphäre."}.
{"A password is required to enter this room","Ein Passwort ist erforderlich um diesen Raum zu betreten"}.
{"A Web Page","Eine Webseite"}.
{"Accept invite using {{ app_name }}","Einladung mittels {{ app_name }} annehmen"}.
{"Accept","Akzeptieren"}.
{"Access denied by service policy","Zugriff aufgrund der Dienstrichtlinien verweigert"}.
{"Access model","Zugriffsmodell"}.
{"Account doesn't exist","Konto existiert nicht"}.
{"Action on user","Aktion auf Benutzer"}.
{"Add a hat to a user","Funktion zu einem Benutzer hinzufügen"}.
{"Add {{ inviter }} to your contact list","Füge {{ inviter }} zu deiner Kontaktliste hinzu"}.
{"Add Contact","Kontakt hinzufügen"}.
{"Add User","Benutzer hinzufügen"}.
{"Administration of ","Administration von "}.
{"Administration","Verwaltung"}.
{"Administrator privileges required","Administratorrechte erforderlich"}.
{"After clicking the button you will be taken to {{ app_name }} to finish setting up your new {{ site_name }} account.","Nach dem Drücken des Buttons wirst du nach {{ app_name }} umgeleitet um dort die Einrichtung deines neuen Kontos auf {{ site_name }} fertigzustellen."}.
{"After successfully installing {{ app_name }}, come back to this page and <strong>continue with Step 2</strong>.","Nachdem du {{ app_name }} erfolgreich installiert hast, komme zu dieser Seite zurück und <strong>fahre mit Schritt 2 fort</strong>!"}.
{"All activity","Alle Aktivitäten"}.
{"All Users","Alle Benutzer"}.
{"Allow subscription","Abonnement erlauben"}.
@@ -46,7 +58,12 @@
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Jeder mit einem Präsenzabonnement von beiden oder davon darf Items abonnieren oder abrufen"}.
{"Anyone with Voice","Jeder mit Stimme"}.
{"Anyone","Jeder"}.
{"API Commands","API Befehle"}.
{"Apple Store Logo","Apple Store Logo"}.
{"April","April"}.
{"Arguments","Argumente"}.
{"As a final reminder, your account details are shown below:","Zur Erinnerung hier nochmal deine Kontodetails:"}.
{"Assign a hat to a user","Hut zu einem Benutzer hinzufügen"}.
{"Attribute 'channel' is required for this request","Attribut 'channel' ist für diese Anforderung erforderlich"}.
{"Attribute 'id' is mandatory for MIX messages","Attribut 'id' ist verpflichtend für MIX-Nachrichten"}.
{"Attribute 'jid' is not allowed here","Attribut 'jid' ist hier nicht erlaubt"}.
@@ -59,6 +76,9 @@
{"Backup to File at ","Backup in Datei bei "}.
{"Backup","Backup"}.
{"Bad format","Ungültiges Format"}.
{"BAD REQUEST","UNGÜLTIGE ANFRAGE"}.
{"Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.","Beagle IM von Tigase Inc. ist eine schlanker aber funktionsreicher XMPP-Client für macOS."}.
{"Beagle IM Logo","Beagle IM Logo"}.
{"Birthday","Geburtsdatum"}.
{"Both the username and the resource are required","Sowohl der Benutzername als auch die Ressource sind erforderlich"}.
{"Bytestream already activated","Bytestream bereits aktiviert"}.
@@ -75,6 +95,7 @@
{"Channel JID","Kanal-JID"}.
{"Channels","Kanäle"}.
{"Characters not allowed:","Nicht erlaubte Zeichen:"}.
{"Chat address (JID)","Chat-Adresse (JID)"}.
{"Chatroom configuration modified","Chatraum-Konfiguration geändert"}.
{"Chatroom is created","Chatraum ist erstellt"}.
{"Chatroom is destroyed","Chatraum ist entfernt"}.
@@ -82,16 +103,29 @@
{"Chatroom is stopped","Chatraum ist beendet"}.
{"Chatrooms","Chaträume"}.
{"Choose a username and password to register with this server","Wählen Sie zum Registrieren auf diesem Server einen Benutzernamen und ein Passwort"}.
{"Choose a username, this will become the first part of your new chat address.","Wähle eine Benutzernamen! Dies wird zum ersten Teil deiner neuen Chat-Adresse."}.
{"Choose storage type of tables","Wähle Speichertyp der Tabellen"}.
{"Choose whether to approve this entity's subscription.","Wählen Sie, ob das Abonnement dieser Entität genehmigt werden soll."}.
{"City","Stadt"}.
{"Click the button to open the Dino website where you can download and install it on your PC.","Klicke auf den Button um Dino's Webseite zu öffnen, wo du ihn für deinen PC herunterladen und installieren kannst."}.
{"Client acknowledged more stanzas than sent by server","Client bestätigte mehr Stanzas als vom Server gesendet"}.
{"Close","Schließen"}.
{"Clustering","Clustering"}.
{"Commands","Befehle"}.
{"Conference room does not exist","Konferenzraum existiert nicht"}.
{"Configuration of room ~s","Konfiguration des Raumes ~s"}.
{"Configuration","Konfiguration"}.
{"Congratulations!","Gratuliere!"}.
{"Contact Addresses (normally, room owner or owners)","Kontaktadresse (normalerweise Raumbesitzer)"}.
{"Contacts","Kontakte"}.
{"Conversations is a Jabber/XMPP client for Android 6.0+ smartphones that has been optimized to provide a unique mobile experience.","Conversations ist ein Jabber/XMPP-Client für Android 6.0+, der für mobile Endgeräte optimiert wurde."}.
{"Conversations Logo","Conversations Logo"}.
{"Country","Land"}.
{"Create a Hat","Einen Hut erstellen"}.
{"Create Account","Konto anlegen"}.
{"Create an account","Konto anlegen"}.
{"Creating an account will allow to communicate with other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Ein Konto erlaubt es dir mit anderen Leuten auf <strong>{{ site_name }}</strong> und anderen Diensten des XMPP-Netwerkes zu kommunizieren."}.
{"Creating an account will allow to communicate with <strong>{{ inviter }}</strong> and other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Ein Konto erlaubt es dir mit <strong>{{ inviter }}</strong> und anderen Leuten auf <strong>{{ site_name }}</strong> und anderen Diensten des XMPP-Netwerkes zu kommunizieren."}.
{"Current Discussion Topic","Aktuelles Diskussionsthema"}.
{"Database failure","Datenbankfehler"}.
{"Database Tables Configuration at ","Datenbanktabellen-Konfiguration bei "}.
@@ -103,8 +137,16 @@
{"Delete User","Benutzer löschen"}.
{"Deliver event notifications","Ereignisbenachrichtigungen zustellen"}.
{"Deliver payloads with event notifications","Nutzdaten mit Ereignisbenachrichtigungen zustellen"}.
{"Destroy a Hat","Einen Hut zerstören"}.
{"Dino Logo","Dino Logo"}.
{"Disable User","Benutzer deaktivieren"}.
{"Disc only copy","Nur auf Festplatte"}.
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Geben Sie niemandem Ihr Passwort, auch nicht den Administratoren des XMPP-Servers."}.
{"Download and install {{ app_name }} below:","Herunterladen und Installieren von {{ app_name }}:"}.
{"Download Dino for Linux","Dino für Linux herunterladen"}.
{"Download from Mac App Store","Vom Mac App Store herunterladen"}.
{"Download Gajim","Gajim herunterladen"}.
{"Download Renga for Haiku","Renga für Haiku herunterladen"}.
{"Dump Backup to Text File at ","Gib Backup in Textdatei aus bei "}.
{"Dump to Text File","Ausgabe in Textdatei"}.
{"Duplicated groups are not allowed by RFC6121","Doppelte Gruppen sind laut RFC6121 nicht erlaubt"}.
@@ -121,11 +163,12 @@
{"ejabberd","ejabberd"}.
{"Email Address","E-Mail-Adresse"}.
{"Email","E-Mail"}.
{"Enable hats","Funktion einschalten"}.
{"Enable hats","Hüte Funktion einschalten"}.
{"Enable logging","Protokollierung aktivieren"}.
{"Enable message archiving","Nachrichtenarchivierung aktivieren"}.
{"Enabling push without 'node' attribute is not supported","push ohne 'node'-Attribut zu aktivieren wird nicht unterstützt"}.
{"End User Session","Benutzersitzung beenden"}.
{"Enter a secure password that you do not use anywhere else.","Gib bitte ein sicheres Passwort ein, das du nirgends sonst verwendest!"}.
{"Enter nickname you want to register","Geben Sie den Spitznamen ein den Sie registrieren wollen"}.
{"Enter path to backup file","Geben Sie den Pfad zur Backupdatei ein"}.
{"Enter path to jabberd14 spool dir","Geben Sie den Pfad zum jabberd14-Spoolverzeichnis ein"}.
@@ -146,6 +189,7 @@
{"Failed to process option '~s'","Konnte Option '~s' nicht verarbeiten"}.
{"Family Name","Nachname"}.
{"FAQ Entry","FAQ-Eintrag"}.
{"F-Droid Store Logo","F-Droid Store Logo"}.
{"February","Februar"}.
{"File larger than ~w bytes","Datei größer als ~w Bytes"}.
{"Fill in the form to search for any matching XMPP User","Füllen Sie das Formular aus, um nach jeglichen passenden XMPP-Benutzern zu suchen"}.
@@ -154,26 +198,44 @@
{"Full List of Room Admins","Vollständige Liste der Raumadmins"}.
{"Full List of Room Owners","Vollständige Liste der Raumbesitzer"}.
{"Full Name","Vollständiger Name"}.
{"Gajim Logo","Gajim Logo"}.
{"Get List of Active Users","Liste der aktiven Benutzer abrufen"}.
{"Get List of Disabled Users","Liste der deaktivierten Benutzer abrufen"}.
{"Get List of Idle Users","Liste der inaktiven Benutzer abrufen"}.
{"Get List of Online Users","Liste der angemeldeten Benutzer abrufen"}.
{"Get List of Registered Users","Liste der registrierten Benutzer abrufen"}.
{"Get Number of Active Users","Anzahl der aktiven Benutzer abrufen"}.
{"Get Number of Disabled Users","Anzahl der deaktivierten Benutzer abrufen"}.
{"Get Number of Idle Users","Anzahl der inaktiven Benutzer abrufen"}.
{"Get Number of Online Users","Anzahl der angemeldeten Benutzer abrufen"}.
{"Get Number of Registered Users","Anzahl der registrierten Benutzer abrufen"}.
{"Get Pending","Ausstehende abrufen"}.
{"Get started","Leg los!"}.
{"Get User Last Login Time","letzte Anmeldezeit des Benutzers abrufen"}.
{"Get User Roster","Kontaktliste abrufen"}.
{"Get User Statistics","Benutzerstatistiken abrufen"}.
{"Given Name","Vorname"}.
{"Google Play Store Logo","Google Play Store Logo"}.
{"Grant voice to this person?","Dieser Person Sprachrechte erteilen?"}.
{"has been banned","wurde gebannt"}.
{"has been kicked because of a system shutdown","wurde wegen einer Systemabschaltung hinausgeworfen"}.
{"has been kicked because of an affiliation change","wurde wegen einer Änderung der Zugehörigkeit hinausgeworfen"}.
{"has been kicked because the room has been changed to members-only","wurde hinausgeworfen weil der Raum zu Nur-Mitglieder geändert wurde"}.
{"has been kicked","wurde hinausgeworfen"}.
{"Hat title","Funktionstitel"}.
{"Hat URI","Funktions-URI"}.
{"Hats limit exceeded","Funktionslimit wurde überschritten"}.
{"Hash computed from the list of hats available in a room","Hash wurde von der Liste der Hüte im Raum berechnet"}.
{"Hash of the vCard-temp avatar of this room","Hash des vCard-temp Avatars dieses Raums"}.
{"Hat hue","Hutfarbe"}.
{"Hat title","Huttitle"}.
{"Hat URI","Hüte Funktions-URI"}.
{"Hats limit exceeded","Hütelimit wurde überschritten"}.
{"Hide","Verbergen"}.
{"Hint","Hinweis"}.
{"Host unknown","Host unbekannt"}.
{"Hostname invalid","Hostname unbekannt"}.
{"HTTP File Upload","HTTP-Dateiupload"}.
{"Idle connection","Inaktive Verbindung"}.
{"If you already have {{ app_name }} installed, we recommend that you continue the account creation process using the app by clicking on the button below:","Solltest du {{ app_name }} bereits installiert haben, empfehlen wir dir die Einrichtung des Kontos mittels dieser App durchzuführen indem du auf den Button unten klickst:"}.
{"If you don't have an XMPP client installed yet, here's a list of suitable clients for your platform.","Solltest du noch keinen XMPP-Client installiert haben, haben wir hier eine Liste geeigneter Clients für deine Platform."}.
{"If you don't see the CAPTCHA image here, visit the web page.","Wenn Sie das CAPTCHA-Bild nicht sehen, besuchen Sie die Webseite."}.
{"Import Directory","Verzeichnis importieren"}.
{"Import File","Datei importieren"}.
@@ -192,6 +254,7 @@
{"Incorrect value of 'action' in data form","Falscher Wert von 'action' in Datenformular"}.
{"Incorrect value of 'path' in data form","Falscher Wert von 'path' in Datenformular"}.
{"Installed Modules:","Installierte Module:"}.
{"Installed ok? Great! <strong>Click or tap the button below</strong> to accept your invite and continue with your account setup:","Fertig mit der Installation? Prima! <strong>Drück auf den Button unten</strong> um deine Einaldung anzunehmen und mit der Einrichtung deines Kontos fortzufahren:"}.
{"Install","Installieren"}.
{"Insufficient privilege","Unzureichende Privilegien"}.
{"Internal server error","Interner Serverfehler"}.
@@ -199,6 +262,11 @@
{"Invalid node name","Ungültiger Knotenname"}.
{"Invalid 'previd' value","Ungültiger 'previd'-Wert"}.
{"Invitations are not allowed in this conference","Einladungen sind in dieser Konferenz nicht erlaubt"}.
{"Invite expired","Die Einladung ist abgelaufen"}.
{"Invite Expired","Die Einladung ist abgelaufen"}.
{"Invite to {{ site_name }}","Einladung für {{ site_name }}"}.
{"Invite User","Person einladen"}.
{"Invite","Einladung"}.
{"IP addresses","IP-Adressen"}.
{"is now known as","ist nun bekannt als"}.
{"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"}.
@@ -208,6 +276,7 @@
{"January","Januar"}.
{"JID normalization denied by service policy","JID-Normalisierung aufgrund der Dienstrichtlinien verweigert"}.
{"JID normalization failed","JID-Normalisierung fehlgeschlagen"}.
{"Join {{ site_name }} with {{ app_name }}","Konto auf {{ site_name }} mittels {{ app_name }} anlegen"}.
{"Joined MIX channels of ~ts","Beigetretene MIX-Channels von ~ts"}.
{"Joined MIX channels:","Beigetretene MIX-Channels:"}.
{"joins the room","betritt den Raum"}.
@@ -219,10 +288,13 @@
{"Last message","Letzte Nachricht"}.
{"Last month","Letzter Monat"}.
{"Last year","Letztes Jahr"}.
{"Launch {{ app_name }} and sign in using your account credentials.","Starte {{ app_name }} und logge dich mit deinen Anmeldedaten ein."}.
{"Launch Beagle IM, and select \\'Yes\\' to add a new account. Click the \\'+\\' button under the empty account list and then enter your credentials.","Starte Beagle IM und wähle \\'Yes\\' um ein neues Konto hinzuzufügen. Drücke auf das \\'+\\' unter der leeren Account-Liste und gib dann deine Anmeldedaten ein."}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Niederwertigstes Bit des SHA-256-Hashes des Textes sollte hexadezimalem Label gleichen"}.
{"leaves the room","verlässt den Raum"}.
{"List of users with hats","Liste der Benutzer mit Funktionen"}.
{"List of Hats","Liste aller Hüte"}.
{"List users with hats","Benutzer mit Funktionen auflisten"}.
{"Log in via web","Via Web anmelden"}.
{"Logged Out","Abgemeldet"}.
{"Logging","Protokollierung"}.
{"Make participants list public","Teilnehmerliste öffentlich machen"}.
@@ -239,9 +311,11 @@
{"Max payload size in bytes","Maximale Nutzdatengröße in Bytes"}.
{"Maximum file size","Maximale Dateigröße"}.
{"Maximum Number of History Messages Returned by Room","Maximale Anzahl der vom Raum zurückgegebenen History-Nachrichten"}.
{"Maximum number of invites reached","Maximale Anzahl all Einladungen erreicht"}.
{"Maximum number of items to persist","Maximale Anzahl persistenter Items"}.
{"Maximum Number of Occupants","Maximale Anzahl der Teilnehmer"}.
{"May","Mai"}.
{"Members are allowed to invite others","Mitglieder dürfen andere einladen"}.
{"Membership is required to enter this room","Mitgliedschaft ist erforderlich um diesen Raum zu betreten"}.
{"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.","Merken Sie sich Ihr Passwort, oder schreiben Sie es auf einen Zettel den Sie sicher verwahren. Bei XMPP gibt es keine automatische Möglichkeit, das Passwort wiederherzustellen falls Sie es vergessen."}.
{"Mere Availability in XMPP (No Show Value)","Bloße Verfügbarkeit in XMPP (kein Anzeigewert)"}.
@@ -256,6 +330,7 @@
{"Moderator","Moderator"}.
{"Moderators Only","nur Moderatoren"}.
{"Module failed to handle the query","Modul konnte die Anfrage nicht verarbeiten"}.
{"Monal Logo","Monal Logo"}.
{"Monday","Montag"}.
{"Multicast","Multicast"}.
{"Multiple <item/> elements are not allowed by RFC6121","Mehrere <item/>-Elemente sind laut RFC6121 nicht erlaubt"}.
@@ -310,18 +385,21 @@
{"None","Keine"}.
{"Not allowed","Nicht erlaubt"}.
{"Not Found","Nicht gefunden"}.
{"NOT FOUND","NICHT GEFUNDEN"}.
{"Not subscribed","Nicht abonniert"}.
{"Notify subscribers when items are removed from the node","Abonnenten benachrichtigen, wenn Items vom Knoten entfernt werden"}.
{"Notify subscribers when the node configuration changes","Abonnenten benachrichtigen, wenn sich die Knotenkonfiguration ändert"}.
{"Notify subscribers when the node is deleted","Abonnenten benachrichtigen, wenn der Knoten gelöscht wird"}.
{"November","November"}.
{"Number of active users","Anzahl der aktiven Benutzer"}.
{"Number of answers required","Anzahl der erforderlichen Antworten"}.
{"Number of disabled users","Anzahl der deaktivierten Benutzer"}.
{"Number of idle users","Anzahl der inaktiven Benutzer"}.
{"Number of occupants","Anzahl der Teilnehmer"}.
{"Number of Offline Messages","Anzahl der Offline-Nachrichten"}.
{"Number of online users","Anzahl der angemeldeten Benutzer"}.
{"Number of registered users","Anzahl der registrierten Benutzer"}.
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Anzahl der Sekunden, nach denen Elemente automatisch gelöscht werden sollen, oder `max`, wenn es keine spezifische Grenze gibt, außer einer vom Server festgelegten Höchstgrenze"}.
{"Occupants are allowed to invite others","Teilnehmer dürfen andere einladen"}.
{"Occupants are allowed to query others","Teilnehmer dürfen andere abfragen"}.
{"Occupants May Change the Subject","Teilnehmer dürfen das Thema ändern"}.
{"October","Oktober"}.
@@ -344,12 +422,15 @@
{"Only service administrators are allowed to send service messages","Nur Service-Administratoren dürfen Servicenachrichten senden"}.
{"Only those on a whitelist may associate leaf nodes with the collection","Nur jemand auf einer Whitelist darf Blattknoten mit der Sammlung verknüpfen"}.
{"Only those on a whitelist may subscribe and retrieve items","Nur jemand auf einer Whitelist darf Items abonnieren und abrufen"}.
{"Open the app","App öffnen"}.
{"Organization Name","Name der Organisation"}.
{"Organization Unit","Abteilung"}.
{"Other Modules Available:","Andere Module verfügbar:"}.
{"Other software","Andere Software"}.
{"Outgoing s2s Connections","Ausgehende s2s-Verbindungen"}.
{"Owner privileges required","Besitzerrechte erforderlich"}.
{"Packet relay is denied by service policy","Paket-Relay aufgrund der Dienstrichtlinien verweigert"}.
{"Page navigation","Seiten-Navigation"}.
{"Participant ID","Teilnehmer-ID"}.
{"Participant","Teilnehmer"}.
{"Password Verification","Passwort bestätigen"}.
@@ -358,12 +439,15 @@
{"Password:","Passwort:"}.
{"Path to Dir","Pfad zum Verzeichnis"}.
{"Path to File","Pfad zur Datei"}.
{"Payload semantic type information","Semantische Typinformation des Payloads"}.
{"Period: ","Zeitraum: "}.
{"Persist items to storage","Items dauerhaft speichern"}.
{"Persistent","Persistent"}.
{"Ping query is incorrect","Ping-Anfrage ist falsch"}.
{"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.","Beachten Sie, dass diese Optionen nur die eingebaute Mnesia-Datenbank sichern. Wenn Sie das ODBC-Modul verwenden, müssen Sie auch Ihre SQL-Datenbank separat sichern."}.
{"Please provide a password! Minimum length: {{ password_min_length }}","Bitte gibt ein Passwort ein! Mindestens {{ password_min_length }} Zeichen."}.
{"Please provide a valid username!","Bitte gib einen gültigen Benutzernamen ein!"}.
{"Please, wait for a while before sending new voice request","Bitte warten Sie ein wenig, bevor Sie eine weitere Sprachrecht-Anforderung senden"}.
{"Pong","Pong"}.
{"Possessing 'ask' attribute is not allowed by RFC6121","Ein 'ask'-Attribut zu besitzen ist laut RFC6121 nicht erlaubt"}.
@@ -373,6 +457,7 @@
{"Previous session PID has exited","Vorherige Sitzungs-PID wurde beendet"}.
{"Previous session PID is dead","Vorherige Sitzungs-PID ist tot"}.
{"Previous session timed out","Zeitüberschreitung bei vorheriger Sitzung"}.
{"Previous","Zurück"}.
{"private, ","privat, "}.
{"Public","Öffentlich"}.
{"Publish model","Veröffentlichungsmodell"}.
@@ -390,11 +475,18 @@
{"Receive notification of new items only","Benachrichtigung nur von neuen Items erhalten"}.
{"Receive notification of new nodes only","Benachrichtigung nur von neuen Knoten erhalten"}.
{"Recipient is not in the conference room","Empfänger ist nicht im Konferenzraum"}.
{"Re-Enable User","Benutzer wieder aktivieren"}.
{"Register an XMPP account","Ein XMPP-Konto registrieren"}.
{"Register on {{ site_name }}","Registriere dich auf {{ site_name }}"}.
{"Register","Anmelden"}.
{"Registration error","Fehler beim registrieren"}.
{"Registration Error","Fehler beim Registrieren"}.
{"Registration Form","Registrierungsformular"}.
{"Registration Success","Registrierung erfolgreich"}.
{"Remote copy","Fernkopie"}.
{"Remove a hat from a user","Eine Funktion bei einem Benutzer entfernen"}.
{"Remove User","Benutzer löschen"}.
{"Renga Logo","Renga Logo"}.
{"Replaced by new connection","Durch neue Verbindung ersetzt"}.
{"Request has timed out","Zeitüberschreitung bei Anforderung"}.
{"Request is ignored","Anforderung wird ignoriert"}.
@@ -406,6 +498,7 @@
{"Restore binary backup immediately:","Stelle binäres Backup sofort wieder her:"}.
{"Restore plain text backup immediately:","Stelle Klartext-Backup sofort wieder her:"}.
{"Restore","Wiederherstellung"}.
{"Result","Ergebnis"}.
{"Roles and Affiliations that May Retrieve Member List","Rollen und Zugehörigkeiten die Mitgliederliste abrufen dürfen"}.
{"Roles for which Presence is Broadcasted","Rollen für welche die Präsenz übertragen wird"}.
{"Roles that May Send Private Messages","Rollen die Privatnachrichten senden dürfen"}.
@@ -419,16 +512,21 @@
{"Roster size","Kontaktlistengröße"}.
{"Running Nodes","Laufende Knoten"}.
{"~s invites you to the room ~s","~s lädt Sie in den Raum ~s ein"}.
{"Sad person holding empty box","Eine traurige Person mit einer leeren Schachtel"}.
{"Saturday","Samstag"}.
{"Scan invite code","Einladungscode einscannen"}.
{"Scan with mobile device","Mit Mobilgerät einscannen"}.
{"Search from the date","Suche ab Datum"}.
{"Search Results for ","Suchergebnisse für "}.
{"Search the text","Text durchsuchen"}.
{"Search until the date","Suche bis Datum"}.
{"Search users in ","Suche Benutzer in "}.
{"Select","Auswählen"}.
{"Send announcement to all online users on all hosts","Ankündigung an alle angemeldeten Benutzer auf allen Hosts senden"}.
{"Send announcement to all online users","Ankündigung an alle angemeldeten Benutzer senden"}.
{"Send announcement to all users on all hosts","Ankündigung an alle Benutzer auf allen Hosts senden"}.
{"Send announcement to all users","Ankündigung an alle Benutzer senden"}.
{"Send this invite to your device","Sende diese Einladung auf dein Gerät"}.
{"September","September"}.
{"Server:","Server:"}.
{"Service list retrieval timed out","Zeitüberschreitung bei Abfrage der Serviceliste"}.
@@ -437,10 +535,16 @@
{"Set message of the day on all hosts and send to online users","Nachricht des Tages auf allen Hosts setzen und an alle angemeldeten Benutzer senden"}.
{"Shared Roster Groups","Gruppen der gemeinsamen Kontaktliste"}.
{"Show Integral Table","Integral-Tabelle anzeigen"}.
{"Show Occupants Join/Leave","Betreten und Verlassen von Teilnehmern anzeigen"}.
{"Show Ordinary Table","Gewöhnliche Tabelle anzeigen"}.
{"Show","Anzeigen"}.
{"Showing apps for <span class='platform-name'>your current platform</span> only. You may also <a href='#' id='show-all-clients-button' tabindex=\"{{ tabidx }}\">view all apps.</a>","Wir zeigen dir nur Apps für <span class='platform-name'>deine aktuelle Platform</span> an. Du kannst dir gerne auch <a href='#' id='show-all-clients-button' tabindex=\"{{ tabidx }}\">sämtliche Apps anzeigen lassen</a>."}.
{"Shut Down Service","Dienst herunterfahren"}.
{"Siskin IM Logo","Siskin IM Logo"}.
{"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.","Einige XMPP-Clients speichern Ihr Passwort auf dem Computer. Aus Sicherheitsgründen sollten Sie das nur auf Ihrem persönlichen Computer tun."}.
{"Sorry, it looks like this invite code has expired!","Entschuldigung, es sieht so aus als wäre diese Einladung abgelaufen!"}.
{"Sorry, there was a problem registering your account.","Es trat leider ein Fehler beim Erstellen des Kontos auf."}.
{"Sources Specs:","Quellenspezifikationen:"}.
{"Specify the access model","Geben Sie das Zugangsmodell an"}.
{"Specify the event message type","Geben Sie den Ereignisnachrichtentyp an"}.
@@ -448,12 +552,21 @@
{"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"}.
{"Step 1: Download and install {{ app_name }}","Schritt 1: {{ app_name }} herunterladen und installieren"}.
{"Step 1: Install {{ app_name }}","Schritt 1: Installiere {{ app_name }}"}.
{"Step 2: Activate your account","Schritt 2: Konto aktivieren"}.
{"Step 2: Connect {{ app_name }} to your new account","Schritt 2: Verbinde {{ app_name }} mit deinem neuen Konto"}.
{"Stopped Nodes","Angehaltene Knoten"}.
{"Store binary backup:","Speichere binäres Backup:"}.
{"Store plain text backup:","Speichere Klartext-Backup:"}.
{"Stream management is already enabled","Stream-Verwaltung ist bereits aktiviert"}.
{"Stream management is not enabled","Stream-Verwaltung ist nicht aktiviert"}.
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting using <strong>{{ app_name }}</strong> you need to first register an account.","<strong>{{ site_name }}</strong> ist Teil von XMPP, ein sicheres und dezentrales Sofortnachrichten-Netzwerk. Um mittels <strong>{{ app_name }}</strong> chatten zu können musst du zunächst ein Konto anlegen."}.
{"<strong>{{ site_name }}</strong> is part of XMPP, a secure and decentralized messaging network. To begin chatting you need to first register an account.","<strong>{{ site_name }}</strong> is Teil von XMPP, ein sicheres und dezentrales Sofortnachrichten-Netzwerk. Um chatten zu können musst du zunächst ein Konto anlegen."}.
{"<strong>No suitable software installed right now?</strong> You can also log in to your account through our online web chat!","<strong>Du hast keine passende Software zur Hand im Moment?</strong> Du kannst dich auch mit unserem online Webchat anmelden!"}.
{"<strong>Tip:</strong> You can open this invite on your mobile device by scanning a barcode with your camera.","<strong>Tipp:</strong> du kannst diese Einladung auf deinem mobilen Endgerät öffnen indem du einen Barcode mit deiner Kamera scannst."}.
{"Subject","Betreff"}.
{"Submit","Senden"}.
{"Submitted","Gesendet"}.
{"Subscriber Address","Abonnenten-Adresse"}.
{"Subscribers may publish","Abonnenten dürfen veröffentlichen"}.
@@ -482,6 +595,9 @@
{"The JIDs of those to contact with questions","Die JIDs jener, die bei Fragen zu kontaktieren sind"}.
{"The JIDs of those with an affiliation of owner","Die JIDs jener mit einer Zugehörigkeit von Besitzer"}.
{"The JIDs of those with an affiliation of publisher","Die JIDs jener mit einer Zugehörigkeit von Veröffentlicher"}.
{"The list of all active users","Die Liste aller aktiven Benutzer"}.
{"The list of all disabled users","Die Liste aller deaktivierten Benutzer"}.
{"The list of all idle users","Die Liste aller inaktiven Benutzer"}.
{"The list of all online users","Die Liste aller angemeldeter Benutzer"}.
{"The list of all users","Die Liste aller Benutzer"}.
{"The list of JIDs that may associate leaf nodes with a collection","Die Liste der JIDs die Blattknoten mit einer Sammlung verknüpfen dürfen"}.
@@ -503,15 +619,20 @@
{"The presence states for which an entity wants to receive notifications","Die Präsenzzustände für welche eine Entität Benachrichtigungen erhalten will"}.
{"The query is only allowed from local users","Die Anfrage ist nur von lokalen Benutzern erlaubt"}.
{"The query must not contain <item/> elements","Die Anfrage darf keine <item/>-Elemente enthalten"}.
{"The role","Die Rolle"}.
{"The room subject can be modified by participants","Das Raum-Thema kann von Teilnehmern geändert werden"}.
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","Die Art der Knotendaten, üblicherweise durch den Namespace der Nutzdaten angegeben (falls vorhanden)"}.
{"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 token provided is either invalid or expired.","Der Einladungscode ist entweder ungültig oder abgelaufen."}.
{"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: "}.
{"There was an error creating the account: ","Es trat ein Fehler beim Erstellen des Kontos auf: "}.
{"There was an error deleting the account: ","Es trat ein Fehler beim Löschen des Kontos auf: "}.
{"This button works only if you have the app installed already!","Dieser Button funktioniert nur, wenn du die App bereits installiert hast!"}.
{"This is an invite from <strong>{{ inviter }}</strong> to connect and chat on the XMPP network. If you already have an XMPP client installed just press the button below!","Dies ist eine Kontakt-Einladung von <strong>{{ inviter }}</strong> um miteinander über XMPP zu chatten. Solltest du bereits einen XMPP-Client haben, so drücke einfach auf den Button hier unten!"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Dies ist schreibungsunabhängig: macbeth ist gleich MacBeth und 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.","Diese Seite erlaubt das Anlegen eines XMPP-Kontos auf diesem XMPP-Server. Ihre JID (Jabber-ID) wird diese Form aufweisen: benutzername@server. Bitte lesen Sie die Anweisungen genau durch, um die Felder korrekt auszufüllen."}.
{"This page allows to unregister an XMPP account in this XMPP server.","Diese Seite erlaubt es, ein XMPP-Konto von diesem XMPP-Server zu entfernen."}.
@@ -520,7 +641,9 @@
{"Thursday","Donnerstag"}.
{"Time delay","Zeitverzögerung"}.
{"Timed out waiting for stream resumption","Zeitüberschreitung beim Warten auf Streamfortsetzung"}.
{"To get started, you need to install an app for your platform:","Um loszulegen musst du eine App für deine Platform installieren:"}.
{"To register, visit ~s","Um sich zu registrieren, besuchen Sie ~s"}.
{"To start chatting, you need to enter your new account credentials into your chosen XMPP software.","Um mit dem Chatten zu beginnen, musst du deine neuen Anmeldedaten in der XMPP Software deiner Wahl eintragen."}.
{"To ~ts","An ~ts"}.
{"Token TTL","Token-TTL"}.
{"Too many active bytestreams","Zu viele aktive Bytestreams"}.
@@ -550,17 +673,23 @@
{"Update message of the day on all hosts (don't send)","Aktualisiere Nachricht des Tages auf allen Hosts (nicht senden)"}.
{"Update specs to get modules source, then install desired ones.","Aktualisieren Sie die Spezifikationen, um den Quellcode der Module zu erhalten und installieren Sie dann die gewünschten Module."}.
{"Update Specs","Spezifikationen aktualisieren"}.
{"Updating the vCard is not supported by the vCard storage backend","Aktualisierung der vCard wird vom vCard-Speicher-Backend nicht unterstützt"}.
{"Upgrade","Upgrade"}.
{"URL for Archived Discussion Logs","URL für archivierte Diskussionsprotokolle"}.
{"Use a <em>QR code</em> scanner on your mobile device to scan the code below:","Benutze einen <em>QR-Code</em> Scanner auf deinem mobilen Endgerät um den Code hier unten zu scannen:"}.
{"User already exists","Benutzer existiert bereits"}.
{"User (jid)","Benutzer (JID)"}.
{"User JID","Benutzer-JID"}.
{"User Management","Benutzerverwaltung"}.
{"User not allowed to perform an IQ set on another user's vCard.","Benutzer darf kein IQ-set auf die vCard eines anderen ausführen."}.
{"User removed","Benutzer entfernt"}.
{"User session not found","Benutzersitzung nicht gefunden"}.
{"User session terminated","Benutzersitzung beendet"}.
{"User ~ts","Benutzer ~ts"}.
{"User","Benutzer"}.
{"Username invalid","Benutzername ungültig"}.
{"Username is reserved","Benutzername ist reserviert"}.
{"Username","Benutzername"}.
{"Username:","Benutzername:"}.
{"Users are not allowed to register accounts so quickly","Benutzer dürfen Konten nicht so schnell registrieren"}.
{"Users Last Activity","Letzte Benutzeraktivität"}.
@@ -578,6 +707,7 @@
{"Visitors are not allowed to send messages to all occupants","Besucher dürfen nicht an alle Teilnehmer Nachrichten versenden"}.
{"Voice requests are disabled in this conference","Sprachrecht-Anforderungen sind in diesem Raum deaktiviert"}.
{"Voice request","Sprachrecht-Anforderung"}.
{"Web client which allows to join the room anonymously","Web-Client, der es ermöglicht, dem Raum anonym beizutreten"}.
{"Wednesday","Mittwoch"}.
{"When a new subscription is processed and whenever a subscriber comes online","Sobald ein neues Abonnement verarbeitet wird und wann immer ein Abonnent sich anmeldet"}.
{"When a new subscription is processed","Sobald ein neues Abonnement verarbeitet wird"}.
@@ -595,6 +725,7 @@
{"Wrong parameters in the web formulary","Falsche Parameter im Webformular"}.
{"Wrong xmlns","Falscher xmlns"}.
{"XMPP Account Registration","XMPP-Konto-Registrierung"}.
{"XMPP client for Haiku","XMPP-Client für Haiku"}.
{"XMPP Domains","XMPP-Domänen"}.
{"XMPP Show Value of Away","XMPP-Anzeigewert von Abwesend"}.
{"XMPP Show Value of Chat","XMPP-Anzeigewert von Chat"}.
@@ -604,8 +735,17 @@
{"You are being removed from the room because of a system shutdown","Sie werden wegen einer Systemabschaltung aus dem Raum entfernt"}.
{"You are not allowed to send private messages","Sie dürfen keine privaten Nachrichten senden"}.
{"You are not joined to the channel","Sie sind dem Raum nicht beigetreten"}.
{"You can connect to {{ site_name }} using any XMPP-compatible software. If your preferred software is not listed above, you may still <a href=\"{{ registration_url }}\" tabindex='{{ tabidx }}'>register an account manually</a>.","Du kannst dich mit {{ site_name }} über jede XMPP-kompatible Software verbinden. Sollte deine gewünschte Software hier oben nicht aufgeführt sein, so kannst du zumindest <a href=\"{{ registration_url }}\" tabindex='{{ tabidx }}'>einen Account manuell anlegen</a>."}.
{"You can later change your password using an XMPP client.","Sie können Ihr Passwort später mit einem XMPP-Client ändern."}.
{"You can now set up {{ app_name }} and connect it to your new account.","Jetzt kannst du {{ app_name }} einrichten und mit deinem neuen Konto verknüpfen."}.
{"You can start chatting right away with {{ app_name }}. Let's get started!","Mittels {{ app_name }} kannst du direkt mit dem Chatten loslegen. Auf geht's!"}.
{"You can transfer this invite to your mobile device by scanning a code with your camera.","Du kannst diese Einladung auf dein Mobilgerät übertragen indem du den Code mit Deiner Kamera einscannst."}.
{"You have been banned from this room","Sie wurden aus diesem Raum verbannt"}.
{"You have been invited to chat on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Du wurdest auf <strong>{{ site_name }}</strong> zum Chat eingeladen, Teil des sicheren und dezentralen XMPP-Sofortnachrichten-Netzwerkes."}.
{"You have been invited to chat on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Du wurdest auf <strong>{{ site_name }}</strong> zum Chat eingeladen. <strong>{{ site_name }}</strong> ist Teil des sicheren und dezentralen XMPP-Sofortnachrichten-Netzwerkes."}.
{"You have been invited to chat with <strong>{{ inviter }}</strong> on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Du wurdest von <strong>{{ inviter }}</strong> auf {{ site_name }} zum Chat eingeladen. {{ site_name }} ist Teil des sicheren und dezentralen XMPP-Sofortnachrichten-Netzwerkes."}.
{"You have been invited to chat with <strong>{{ inviter }}</strong> on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Du wurdest von <strong>{{ inviter }}</strong> auf <strong>{{ site_name }}</strong> zum Chat eingeladen. <strong>{{ site_name }}</strong> ist Teil des sicheren und dezentralen XMPP-Sofortnachrichten-Netzwerkes."}.
{"You have created an account on <strong>{{ site_name }}</strong>.","Du hast ein Konto auf <strong>{{ site_name }}</strong> angelegt."}.
{"You have joined too many conferences","Sie sind zu vielen Konferenzen beigetreten"}.
{"You must fill in field \"Nickname\" in the form","Sie müssen das Feld \"Spitzname\" im Formular ausfüllen"}.
{"You need a client that supports x:data and CAPTCHA to register","Sie benötigen einen Client der x:data und CAPTCHA unterstützt, um sich zu registrieren"}.
@@ -613,6 +753,7 @@
{"You need an x:data capable client to search","Sie benötigen einen Client der x:data unterstützt, um zu suchen"}.
{"Your active privacy list has denied the routing of this stanza.","Ihre aktive Privacy-Liste hat das Routing dieses Stanzas verweigert."}.
{"Your contact offline message queue is full. The message has been discarded.","Die Offline-Nachrichten-Warteschlange Ihres Kontaktes ist voll. Die Nachricht wurde verworfen."}.
{"Your password is stored encrypted on the server and will not be accessible after you close this page. Keep it safe and never share it with anyone.","Dein Passwort wird verschlüsselt auf dem Server gespeichert und wird nicht mehr im Klartext verfügbar sein, nachdem du diese Seite geschlossen hast. Verwahre es an einem sicheren Ort und teile es mit niemandem!"}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Ihre Abonnement-Anforderung und/oder Nachrichten an ~s wurden blockiert. Um Ihre Abonnement-Anforderungen freizugeben, besuchen Sie ~s"}.
{"Your XMPP account was successfully registered.","Ihr XMPP-Konto wurde erfolgreich registriert."}.
{"Your XMPP account was successfully unregistered.","Ihr XMPP-Konto wurde erfolgreich entfernt."}.
+47 -2
View File
@@ -12,7 +12,7 @@
{"A Web Page","Μία ιστοσελίδα"}.
{"Accept","Αποδοχή"}.
{"Access denied by service policy","Άρνηση πρόσβασης, λόγω τακτικής παροχής υπηρεσιών"}.
{"Access model","Καθορίστε το μοντέλο πρόσβασης"}.
{"Access model","Μοντέλο πρόσβασης"}.
{"Account doesn't exist","Ο λογαριασμός δεν υπάρχει"}.
{"Action on user","Eνέργεια για το χρήστη"}.
{"Add User","Προσθήκη Χρήστη"}.
@@ -45,7 +45,9 @@
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Όποιος έχει συνδρομή παρουσίας και των δύο ή από μπορεί να εγγραφεί και να ανακτήσει στοιχεία"}.
{"Anyone with Voice","Οποιοσδήποτε με Φωνή"}.
{"Anyone","Οποιοσδήποτε"}.
{"API Commands","Εντολές του API"}.
{"April","Απρίλιος"}.
{"Arguments","Επιχειρήματα"}.
{"Attribute 'channel' is required for this request","Το δηλωτικό 'channel' απαιτείται για αυτό το Ερώτημα"}.
{"Attribute 'id' is mandatory for MIX messages","Το δηλωτικό 'id' επιτακτικό για μηνύματα MIX"}.
{"Attribute 'jid' is not allowed here","Το δηλωτικό 'jid' δεν επιτρέπεται εδώ"}.
@@ -71,6 +73,7 @@
{"Changing role/affiliation is not allowed","Η αλλαγή ρόλου/ομάδας δεν επιτρέπεται"}.
{"Channel already exists","Το κανάλι υπάρχει ήδη"}.
{"Channel does not exist","Το κανάλι δεν υπάρχει"}.
{"Channel JID","JID καναλιού"}.
{"Channels","Κανάλια"}.
{"Characters not allowed:","Χαρακτήρες που δεν επιτρέπονται:"}.
{"Chatroom configuration modified","Η ρύθμιση παραμέτρων της αίθουσας σύνεδριασης τροποποιηθηκε"}.
@@ -84,6 +87,7 @@
{"Choose whether to approve this entity's subscription.","Επιλέξτε αν θα εγκρίθεί η εγγραφή αυτής της οντότητας."}.
{"City","Πόλη"}.
{"Client acknowledged more stanzas than sent by server","Ο πελάτης γνωρίζει περισσότερα δωμάτια από αυτά που στάλθηκαν από τον εξυπηρετητή"}.
{"Clustering","Συσταδοποίηση"}.
{"Commands","Εντολές"}.
{"Conference room does not exist","Η αίθουσα σύνεδριασης δεν υπάρχει"}.
{"Configuration of room ~s","Διαμόρφωση δωματίου ~ s"}.
@@ -119,6 +123,7 @@
{"ejabberd","ejabberd"}.
{"Email Address","Ηλεκτρονική Διεύθυνση"}.
{"Email","Ηλεκτρονικό ταχυδρομείο"}.
{"Enable hats","Ενεργοποίηση καπέλων"}.
{"Enable logging","Ενεργοποίηση καταγραφής"}.
{"Enable message archiving","Ενεργοποιήστε την αρχειοθέτηση μηνυμάτων"}.
{"Enabling push without 'node' attribute is not supported","Η ενεργοποίηση της ώθησης χωρίς το χαρακτηριστικό 'κόμβος' δεν υποστηρίζεται"}.
@@ -151,6 +156,8 @@
{"Full List of Room Admins","Πλήρης Κατάλογος Διαχειριστών αιθουσών"}.
{"Full List of Room Owners","Πλήρης Κατάλογος Ιδιοκτητών αιθουσών"}.
{"Full Name","Ονοματεπώνυμο"}.
{"Get List of Online Users","Λίστα online χρηστών"}.
{"Get List of Registered Users","Λίστα εγγεγραμμένων χρηστών"}.
{"Get Number of Online Users","Έκθεση αριθμού συνδεδεμένων χρηστών"}.
{"Get Number of Registered Users","Έκθεση αριθμού εγγεγραμμένων χρηστών"}.
{"Get Pending","Λήψη των εκκρεμοτήτων"}.
@@ -163,6 +170,10 @@
{"has been kicked because of an affiliation change","έχει αποβληθεί λόγω αλλαγής υπαγωγής"}.
{"has been kicked because the room has been changed to members-only","αποβλήθηκε επειδή η αίθουσα αλλάξε γιά μέλη μόνο"}.
{"has been kicked","αποβλήθηκε"}.
{"Hash of the vCard-temp avatar of this room","Hash του vCard-temp avatar αυτού του δωματίου"}.
{"Hat title","Τίτλος καπέλου"}.
{"Hat URI","Καπέλο URI"}.
{"Hats limit exceeded","Υπέρβαση του ορίου καπέλων"}.
{"Host unknown","Άγνωστος εξυπηρετητής"}.
{"HTTP File Upload","Ανέβασμα αρχείου"}.
{"Idle connection","Αδρανής σύνδεση"}.
@@ -183,6 +194,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","Μη έγκυρο χαρακτηριστικό 'από' στο προωθούμενο μήνυμα"}.
@@ -198,6 +211,8 @@
{"January","Ιανουάριος"}.
{"JID normalization denied by service policy","Απετράπη η κανονικοποίηση του JID, λόγω της τακτικής Παροχής Υπηρεσιών"}.
{"JID normalization failed","Απετράπη η κανονικοποίηση του JID"}.
{"Joined MIX channels of ~ts","Ενσωματωμένα κανάλια MIX του ~ts"}.
{"Joined MIX channels:","Ενσωματωμένα κανάλια MIX:"}.
{"joins the room","συνδέεται στην αίθουσα"}.
{"July","Ιούλιος"}.
{"June","Ιούνιος"}.
@@ -209,6 +224,8 @@
{"Last year","Πέρυσι"}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Τα ψηφία μικρότερης αξίας του αθροίσματος SHA-256 του κειμένου θα έπρεπε να ισούνται με την δεκαεξαδική ετικέτα"}.
{"leaves the room","εγκαταλείπει την αίθουσα"}.
{"List users with hats","Λίστα χρηστών με καπέλα"}.
{"Logged Out","Αποσυνδεδεμένος"}.
{"Logging","Καταγραφή"}.
{"Make participants list public","Κάντε δημόσιο τον κατάλογο συμμετεχόντων"}.
{"Make room CAPTCHA protected","Κάντε την αίθουσα προστατεύομενη με CAPTCHA"}.
@@ -220,6 +237,7 @@
{"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 payload size in bytes","Μέγιστο μέγεθος φορτίου σε bytes"}.
{"Maximum file size","Μέγιστο μέγεθος αρχείου"}.
{"Maximum Number of History Messages Returned by Room","Μέγιστος αριθμός μηνυμάτων Ιστορικού που επιστρέφονται από την Αίθουσα"}.
@@ -290,6 +308,7 @@
{"Node ~p","Κόμβος ~p"}.
{"Nodeprep has failed","Το Nodeprep απέτυχε"}.
{"Nodes","Κόμβοι"}.
{"Node","Κόμβος"}.
{"None","Κανένα"}.
{"Not allowed","Δεν επιτρέπεται"}.
{"Not Found","Δε βρέθηκε"}.
@@ -303,7 +322,8 @@
{"Number of Offline Messages","Πλήθος μηνυμάτων Χωρίς Σύνδεση"}.
{"Number of online users","Αριθμός συνδεδεμένων χρηστών"}.
{"Number of registered users","Αριθμός εγγεγραμμένων χρηστών"}.
{"Occupants are allowed to invite others","Οι συμμετέχοντες μπορούν να προσκαλέσουν και άλλους"}.
{"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 query others","Οι κάτοικοι επιτρέπεται να ρωτούν άλλους"}.
{"Occupants May Change the Subject","Επιτρέψτε στους χρήστες να αλλάζουν το Θέμα"}.
{"October","Οκτώβριος"}.
{"OK","Εντάξει"}.
@@ -317,6 +337,7 @@
{"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","Μόνο οι συμμετέχοντες επιτρέπεται να στείλουν ερωτήματα στη διάσκεψη"}.
@@ -326,9 +347,11 @@
{"Only those on a whitelist may subscribe and retrieve items","Μόνο όσοι βρίσκονται στη λίστα επιτρεπόμενων μπορούν να εγγραφούν και να ανακτήσουν αντικείμενα"}.
{"Organization Name","Όνομα Οργανισμού"}.
{"Organization Unit","Μονάδα Οργανισμού"}.
{"Other Modules Available:","Διαθέσιμες άλλες ενότητες:"}.
{"Outgoing s2s Connections","Εξερχόμενες S2S Συνδέσεις"}.
{"Owner privileges required","Aπαιτούνται προνόμια ιδιοκτήτη"}.
{"Packet relay is denied by service policy","Απαγορεύεται η αναμετάδοση πακέτων, λόγω της τακτικής Παροχής Υπηρεσιών"}.
{"Participant ID","ID συμμετέχοντος"}.
{"Participant","Συμμετέχων"}.
{"Password Verification","Επαλήθευση κωδικού πρόσβασης"}.
{"Password Verification:","Επαλήθευση κωδικού πρόσβασης:"}.
@@ -336,6 +359,7 @@
{"Password:","Κωδικός πρόσβασης:"}.
{"Path to Dir","Τοποθεσία κατάλογου αρχείων"}.
{"Path to File","Τοποθεσία Αρχείου"}.
{"Payload semantic type information","Πληροφορίες σημασιολογικού τύπου ωφέλιμου φορτίου"}.
{"Period: ","Περίοδος: "}.
{"Persist items to storage","Μόνιμη αποθήκευση στοιχείων"}.
{"Persistent","Μόνιμη"}.
@@ -371,6 +395,7 @@
{"Register an XMPP account","Καταχωρείστε έναν XMPP λογαριασμό χρήστη"}.
{"Register","Καταχωρήστε"}.
{"Remote copy","Εξ αποστάσεως αντίγραφο"}.
{"Remove a hat from a user","Αφαίρεση ενός καπέλου από έναν χρήστη"}.
{"Remove User","Αφαίρεση χρήστη"}.
{"Replaced by new connection","Αντικαταστάθηκε από μια νέα σύνδεση"}.
{"Request has timed out","Το αίτημα έληξε"}.
@@ -383,6 +408,7 @@
{"Restore binary backup immediately:","Επαναφορά δυαδικού αντιγράφου ασφαλείας αμέσως:"}.
{"Restore plain text backup immediately:","Επαναφορά αντιγράφου ασφαλείας από αρχείο κειμένου αμέσως:"}.
{"Restore","Επαναφορά Αντιγράφου Ασφαλείας"}.
{"Result","Αποτέλεσμα"}.
{"Roles and Affiliations that May Retrieve Member List","Ρόλοι και δεσμοί που μπορούν να λάβουν την λίστα μελών"}.
{"Roles for which Presence is Broadcasted","Ρόλοι των οποίων η παρουσία δηλώνεται δημόσια"}.
{"Roles that May Send Private Messages","Ρόλοι που επιτρέπεται να αποστέλλουν ιδιωτικά μηνύματα"}.
@@ -414,13 +440,16 @@
{"Set message of the day on all hosts and send to online users","Ορίστε μήνυμα ημέρας και άμεση αποστολή στους συνδεδεμένους χρήστες σε όλους τους κεντρικούς υπολογιστές"}.
{"Shared Roster Groups","Κοινές Ομάδες Καταλόγων Επαφών"}.
{"Show Integral Table","Δείτε Ολοκληρωτικό Πίνακα"}.
{"Show Occupants Join/Leave","Εμφάνιση ενοίκων Join/Leave"}.
{"Show Ordinary Table","Δείτε Κοινό Πίνακα"}.
{"Shut Down Service","Τερματισμός Υπηρεσίας"}.
{"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.","Ορισμένοι πελάτες XMPP μπορούν να αποθηκεύσουν τον κωδικό πρόσβασής σας στον υπολογιστή, αλλά θα πρέπει να το κάνετε μόνο στον προσωπικό σας υπολογιστή για λόγους ασφαλείας."}.
{"Sources Specs:","Πηγές Προδιαγραφές:"}.
{"Specify the access model","Καθορίστε το μοντέλο πρόσβασης"}.
{"Specify the event message type","Καθορίστε τον τύπο μηνύματος συμβάντος"}.
{"Specify the publisher model","Καθορίστε το μοντέλο εκδότη"}.
{"Stanza id is not valid","Το Stanza id δεν είναι έγκυρο"}.
{"Stanza ID","Ταυτότητα Δωματίου"}.
{"Statically specify a replyto of the node owner(s)","Προσδιορίστε (στατικά) το Απάντηση Προς του ιδιοκτήτη-ων του κόμβου"}.
{"Stopped Nodes","Σταματημένοι Κόμβοι"}.
@@ -430,6 +459,7 @@
{"Stream management is not enabled","Η διαχείριση Ροών δεν είναι ενεργοποιημένη"}.
{"Subject","Θέμα"}.
{"Submitted","Υποβλήθηκε"}.
{"Submit","Υποβολή"}.
{"Subscriber Address","Διεύθυνση Συνδρομητή"}.
{"Subscribers may publish","Οι συνδρομητές μπορούν να δημοσιεύσουν"}.
{"Subscription requests must be approved and only subscribers may retrieve items","Τα αιτήματα για συνδρομή πρέπει να εγκριθούν και μόνο οι συνδρομητές μπορούν να λάβουν αντικείμενα"}.
@@ -457,7 +487,10 @@
{"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","Ο κατάλογος όλων των online χρηστών"}.
{"The list of all users","Ο κατάλογος όλων των χρηστών"}.
{"The list of JIDs that may associate leaf nodes with a collection","Λίστα των JIDs που μπορούν να σχετίζουν leaf κόμβους με μια Συλλογή"}.
{"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","Ο κόμβος είναι κόμβος Συλλογής"}.
@@ -476,6 +509,7 @@
{"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","Η stanza ΠΡΕΠΕΙ να περιέχει μόνο ένα στοιχείο <active />, ένα στοιχείο <default /> ή ένα στοιχείο <list />"}.
{"The subscription identifier associated with the subscription request","Το αναγνωριστικό συνδρομής συσχετίστηκε με το αίτημα συνδρομής"}.
@@ -505,6 +539,7 @@
{"Too many unacked stanzas","Πάρα πολλές μη αναγνωρισμένες stanzas"}.
{"Too many users in this conference","Πάρα πολλοί χρήστες σε αυτή τη διάσκεψη"}.
{"Traffic rate limit is exceeded","Υπέρφορτωση"}.
{"~ts's MAM Archive","Αρχείο MAM του ~ts"}.
{"~ts's Offline Messages Queue","~ts's Χωρίς Σύνδεση Μηνύματα"}.
{"Tuesday","Τρίτη"}.
{"Unable to generate a CAPTCHA","Αδύνατη η δημιουργία CAPTCHA"}.
@@ -512,17 +547,23 @@
{"Unauthorized","Χωρίς Εξουσιοδότηση"}.
{"Unexpected action","Απροσδόκητη ενέργεια"}.
{"Unexpected error condition: ~p","Απροσδόκητες συνθήκες σφάλματος: ~p"}.
{"Uninstall","Απεγκατάσταση"}.
{"Unregister an XMPP account","Καταργήση λογαριασμού XMPP"}.
{"Unregister","Καταργήση εγγραφής"}.
{"Unsupported <index/> element","Μη υποστηριζόμενο στοιχείο <index />"}.
{"Unsupported version","Μη υποστηριζόμενη έκδοση"}.
{"Update message of the day (don't send)","Ενημέρωση μηνύματος ημέρας (χωρίς άμεση αποστολή)"}.
{"Update message of the day on all hosts (don't send)","Ενημέρωση μηνύματος ημέρας σε όλους τους κεντρικούς υπολογιστές (χωρίς άμεση αποστολή)"}.
{"Update specs to get modules source, then install desired ones.","Ενημερώστε τις προδιαγραφές για να λάβετε την πηγή των ενοτήτων και, στη συνέχεια, εγκαταστήστε τις επιθυμητές."}.
{"Update Specs","Προδιαγραφές ενημέρωσης"}.
{"Updating the vCard is not supported by the vCard storage backend","Η ενημέρωση της vCard δεν υποστηρίζεται από το backend αποθήκευσης vCard"}.
{"Upgrade","Αναβάθμιση"}.
{"URL for Archived Discussion Logs","URL αρχειοθετημένων καταγραφών συζητήσεων"}.
{"User already exists","Ο χρήστης υπάρχει ήδη"}.
{"User JID","JID Χρήστη"}.
{"User (jid)","Χρήστης (jid)"}.
{"User Management","Διαχείριση χρηστών"}.
{"User not allowed to perform an IQ set on another user's vCard.","Ο χρήστης δεν επιτρέπεται να εκτελέσει ένα σετ IQ στην vCard ενός άλλου χρήστη."}.
{"User removed","Ο Χρήστης αφαιρέθηκε"}.
{"User session not found","Η περίοδος σύνδεσης χρήστη δεν βρέθηκε"}.
{"User session terminated","Η περίοδος σύνδεσης χρήστη τερματίστηκε"}.
@@ -538,12 +579,14 @@
{"Value of '~s' should be integer","Η τιμή του '~s' θα πρέπει να είναι ακέραιος"}.
{"Value 'set' of 'type' attribute is not allowed","Δεν επιτρέπεται η παράμετρος 'set' του 'type'"}.
{"vCard User Search","vCard Αναζήτηση χρηστών"}.
{"View joined MIX channels","Προβολή ενταγμένων καναλιών MIX"}.
{"Virtual Hosts","Eικονικοί κεντρικοί υπολογιστές"}.
{"Visitors are not allowed to change their nicknames in this room","Οι επισκέπτες δεν επιτρέπεται να αλλάξουν τα ψευδώνυμα τους σε αυτή την αίθουσα"}.
{"Visitors are not allowed to send messages to all occupants","Οι επισκέπτες δεν επιτρέπεται να στείλουν μηνύματα σε όλους τους συμμετέχοντες"}.
{"Visitor","Επισκέπτης"}.
{"Voice requests are disabled in this conference","Τα αιτήματα φωνής είναι απενεργοποιημένα, σε αυτό το συνέδριο"}.
{"Voice request","Αίτημα φωνής"}.
{"Web client which allows to join the room anonymously","Web client που επιτρέπει την ανώνυμη είσοδο στην αίθουσα"}.
{"Wednesday","Τετάρτη"}.
{"When a new subscription is processed and whenever a subscriber comes online","Όταν μία νέα συνδρομή βρίσκεται εν επεξεργασία και όποτε ένας συνδρομητής συνδεθεί"}.
{"When a new subscription is processed","Όταν μία νέα συνδρομή βρίσκεται εν επεξεργασία"}.
@@ -556,6 +599,7 @@
{"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","Ποιός μπορεί να συσχετίζει leaf nodes με μία συλλογή"}.
{"Wrong parameters in the web formulary","Εσφαλμένες παράμετροι στην διαμόρφωση τυπικότητας του δυκτίου"}.
{"Wrong xmlns","Εσφαλμένο xmlns"}.
@@ -567,6 +611,7 @@
{"XMPP Show Value of XA (Extended Away)","Δείξε τιμή XMPP Αξία του Λίαν Απομακρυσμένος"}.
{"XMPP URI of Associated Publish-Subscribe Node","XMPP URI του συσχετισμένου κόμβου Δημοσίευσης-Εγγραφής"}.
{"You are being removed from the room because of a system shutdown","Απαιτείται η απομάκρυνσή σας από την αίθουσα, λόγω τερματισμού συστήματος"}.
{"You are not allowed to send private messages","Δεν επιτρέπεται η αποστολή ιδιωτικών μηνυμάτων"}.
{"You are not joined to the channel","Δεν λαμβάνετε μέρος στο κανάλι"}.
{"You can later change your password using an XMPP client.","Μπορείτε αργότερα να αλλάξετε τον κωδικό πρόσβασής σας χρησιμοποιώντας ένα πρόγραμμα-πελάτη XMPP."}.
{"You have been banned from this room","Σας έχει απαγορευθεί η είσοδος σε αυτή την αίθουσα"}.
+1
View File
@@ -295,6 +295,7 @@
{"Store binary backup:","Konservu duuman sekurkopion:"}.
{"Store plain text backup:","Skribu sekurkopion en plata tekstdosiero"}.
{"Subject","Temo"}.
{"Submit","Sendu"}.
{"Submitted","Sendita"}.
{"Subscriber Address","Abonanta adreso"}.
{"Subscribers may publish","Abonantoj rajtas publici"}.

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