Compare commits

...

336 Commits

Author SHA1 Message Date
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
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
434 changed files with 14643 additions and 3940 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;"
+178
View File
@@ -0,0 +1,178 @@
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'
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
############################################################## 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::"
+18 -8
View File
@@ -1,6 +1,6 @@
#' Define default build variables
ARG OTP_VSN='27.3.4.1'
ARG ELIXIR_VSN='1.18.4'
ARG OTP_VSN='28.3.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 \
nodejs npm ca-certificates \
autoconf \
automake \
bash \
@@ -52,12 +53,22 @@ ARG BUILD_DIR
COPY / $BUILD_DIR/
WORKDIR $BUILD_DIR
RUN npm init -y \
&& npm install --silent jquery@3.7.1 bootstrap@4.6.2 \
&& mkdir -p /rootfs/usr/share/javascript/bootstrap4/css \
&& mkdir -p /rootfs/usr/share/javascript/bootstrap4/js \
&& mkdir -p /rootfs/usr/share/javascript/jquery/ \
&& cp -r node_modules/bootstrap/dist/css/bootstrap.min* /rootfs/usr/share/javascript/bootstrap4/css \
&& cp -r node_modules/bootstrap/dist/js/bootstrap.min* /rootfs/usr/share/javascript/bootstrap4/js \
&& cp -r node_modules/jquery/dist/jquery.min* /rootfs/usr/share/javascript/jquery/
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 +176,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 +210,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"]
+16 -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"
@@ -232,6 +243,7 @@ modules:
default_room_options:
mam: true
mod_muc_admin: {}
mod_muc_occupantid: {}
mod_offline:
access_max_user_messages: max_user_offline_messages
mod_ping: {}
+152 -11
View File
@@ -67,6 +67,7 @@ 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"}"
@@ -121,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"
@@ -136,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()
@@ -195,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 "--------------------------------------------------------------------"
@@ -311,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."
@@ -363,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"
@@ -374,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
@@ -385,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
@@ -439,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)
@@ -491,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
@@ -501,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
;;
+341 -211
View File
@@ -4,7 +4,6 @@ on:
push:
paths-ignore:
- '.devcontainer/**'
- 'examples/**'
- 'lib/**'
- 'man/**'
- 'priv/**'
@@ -12,95 +11,47 @@ 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: ['25', '26', '27', '28']
runs-on: ubuntu-24.04
services:
redis:
image: public.ecr.aws/docker/library/redis
ports:
- 6379:6379
otp: ['27']
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 }}
hexpm-mirrors: |
https://cdn.jsdelivr.net/hex
https://builds.hex.pm
- 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
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: libexpat1-dev libgd-dev libpam0g-dev
libsqlite3-dev libwebp-dev libyaml-dev
- 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 -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;"
- 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')}}
_build/default/lib/
key: ci-${{ matrix.otp }}-${{hashFiles('rebar.config')}}
- name: Compile
run: |
@@ -108,72 +59,196 @@ jobs:
./configure --with-rebar=./rebar3 \
--prefix=/tmp/ejabberd \
--enable-all \
--disable-elixir \
--disable-mssql \
--disable-odbc
--disable-elixir
sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
make
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: ['27']
steps:
- uses: erlef/setup-beam@v1
with:
otp-version: ${{ matrix.otp }}
hexpm-mirrors: |
https://cdn.jsdelivr.net/hex
https://builds.hex.pm
- 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 elvis
if: matrix.otp >= '26'
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.
dynamic:
needs: compile
runs-on: ubuntu-24.04-arm
strategy:
matrix:
otp: ['27']
steps:
- uses: erlef/setup-beam@v1
with:
otp-version: ${{ matrix.otp }}
hexpm-mirrors: |
https://cdn.jsdelivr.net/hex
https://builds.hex.pm
- uses: awalsh128/cache-apt-pkgs-action@latest
if: matrix.otp < '27'
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 == '27'
continue-on-error: true
uses: XMPP-Interop-Testing/xmpp-interop-tests-action@v1.5.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: ['27']
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 }}
hexpm-mirrors: |
https://cdn.jsdelivr.net/hex
https://builds.hex.pm
- 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
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')
@@ -185,20 +260,45 @@ 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
if: always()
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",
@@ -206,96 +306,126 @@ 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: ['27']
steps:
- uses: erlef/setup-beam@v1
with:
filters: |
sql:
- 'sql/**'
- 'src/mod_admin_update_sql.erl'
otp-version: ${{ matrix.otp }}
hexpm-mirrors: |
https://cdn.jsdelivr.net/hex
https://builds.hex.pm
- 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 -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;"
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:
+112 -264
View File
@@ -26,38 +26,28 @@ on:
jobs:
################################################################ Rebars #####
rebars:
name: Rebars
runs-on: ubuntu-24.04-arm
strategy:
fail-fast: false
matrix:
otp: ['20', '25', '26', '27', '28']
otp: ['25', '26', '27', '28']
rebar: ['rebar', 'rebar3']
exclude:
- otp: '27'
rebar: 'rebar'
- otp: '28'
rebar: 'rebar'
runs-on: ubuntu-24.04
container:
image: public.ecr.aws/docker/library/erlang:${{ matrix.otp }}
steps:
- uses: actions/checkout@v4
- name: Get old 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: Get recent compatible Rebar binaries
if: matrix.otp > 23 && matrix.otp < 25
if: matrix.otp < 25
run: |
rm rebar
rm rebar3
@@ -69,20 +59,17 @@ jobs:
- 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: Unlock eredis dependency
if: matrix.rebar == 'rebar3' && matrix.otp < 21
run: rebar3 unlock eredis
_build/default/lib/
key: runtime-${{ matrix.otp }}-${{matrix.rebar}}-${{hashFiles('rebar.config')}}
- name: Compile
run: |
@@ -91,124 +78,77 @@ jobs:
--prefix=/tmp/ejabberd \
--with-min-erlang=9.0.5 \
--enable-all \
--disable-elixir \
--disable-tools \
--disable-odbc
--disable-elixir
make
- 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.14', '1.15', '1.16', '1.17', '1.18']
runs-on: ubuntu-24.04
elixir: ['1.14', '1.18', '1.19']
container:
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.config')}}
- 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
@@ -218,105 +158,59 @@ jobs:
./autogen.sh
./configure --with-rebar=./rebar3 \
--prefix=/tmp/ejabberd \
--enable-all \
--disable-odbc
make
--enable-all
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.14', '1.15', '1.16', '1.17', '1.18']
runs-on: ubuntu-24.04
elixir: ['1.14', '1.18', '1.19']
container:
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::"
@@ -326,20 +220,21 @@ 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.exs')}}
- 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
@@ -352,79 +247,32 @@ jobs:
--enable-all
make
- run: make hooks
- run: make options
- run: make xref
- run: make dialyzer
- run: make elvis
if: matrix.otp > '25'
- run: make edoc
- name: Run rel
run: |
make rel
_build/prod/rel/ejabberd/bin/ejabberdctl start \
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
- name: 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
+183
View File
@@ -0,0 +1,183 @@
name: Weekly
on:
schedule:
- cron: '30 9 * * 0'
jobs:
############################################################### Compile #####
test:
runs-on: ubuntu-24.04-arm
strategy:
matrix:
otp: ['25', '26', '27', '28']
steps:
- uses: actions/checkout@v6
- uses: erlef/setup-beam@v1
with:
otp-version: ${{ matrix.otp }}
hexpm-mirrors: |
https://cdn.jsdelivr.net/hex
https://builds.hex.pm
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: libexpat1-dev libgd-dev libpam0g-dev
libsqlite3-dev libwebp-dev libyaml-dev
- name: Compile
run: |
./autogen.sh
./configure --with-rebar=./rebar3 \
--prefix=/tmp/ejabberd \
--enable-all \
--disable-elixir \
--disable-mssql \
--disable-odbc
sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
make
########################################################## 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 test-eunit
- 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
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"}}'
+216
View File
@@ -1,3 +1,219 @@
## 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
+6 -1
View File
@@ -28,7 +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.14.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.
@@ -65,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
---------------------
+74 -33
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
@@ -270,7 +280,10 @@ 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 `!`
This example, registers an `admin@localhost` account when the container is first created.
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),
@@ -284,8 +297,37 @@ and shows the ejabberd starts (check also the [full example](#customized-example
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
@@ -721,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 \
@@ -1061,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/) |
|:----------------------|:------------------|:-----------------------|
@@ -1072,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.4.1-alpine <br /> Elixir 1.18.4 | Alpine 3.19 <br /> Erlang/OTP 26.2 <br /> Elixir 1.15.7 |
| Software | Erlang/OTP 28.3.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](#ejabberd-contrib) | included | not included |
| [ejabberdapi](#ejabberdapi) | included :orange_circle: | 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 |
+26 -15
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
@@ -392,28 +400,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" \
@@ -706,7 +716,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]"
+15 -9
View File
@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 25.07` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 26.01` | 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]),
@@ -192,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)])],
@@ -318,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)
@@ -359,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])
+64 -37
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,7 +767,7 @@
<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>
@@ -785,7 +803,7 @@
<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>
@@ -800,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>
@@ -830,7 +857,7 @@
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0485.html"/>
<xmpp:version>0.1.1</xmpp:version>
<xmpp:version>1.0.0</xmpp:version>
<xmpp:since>25.07</xmpp:since>
<xmpp:status>complete</xmpp:status>
<xmpp:note>mod_pubsub_serverinfo</xmpp:note>
+1 -1
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"
+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
#
+151 -10
View File
@@ -121,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"
@@ -129,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()
@@ -299,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."
@@ -318,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"
@@ -329,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
@@ -340,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
@@ -393,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)
@@ -442,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
@@ -452,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 "$@"
+1
View File
@@ -16,6 +16,7 @@
{elvis_style, function_naming_convention, disable},
{elvis_style, god_modules, #{limit => 300}},
{elvis_style, invalid_dynamic_call, 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},
-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
+69
View File
@@ -0,0 +1,69 @@
%%%----------------------------------------------------------------------
%%%
%%% 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,
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
+10 -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,
@@ -72,4 +66,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 -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
+18
View File
@@ -0,0 +1,18 @@
-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">>).
-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
+3 -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
@@ -31,5 +31,6 @@
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()} | '_',
+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
@@ -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()
}).
@@ -126,7 +126,8 @@
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(),
+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
+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 @@
%%%-------------------------------------------------------------------
%%% @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
+766 -53
View File
File diff suppressed because it is too large Load Diff
+12 -67
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(),
@@ -85,20 +85,9 @@ defmodule Ejabberd.MixProject do
result = [{:d, :ELIXIR_ENABLED}] ++
cond_options() ++
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 +99,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 +108,20 @@ defmodule Ejabberd.MixProject do
[{:cache_tab, "~> 1.0"},
{:dialyxir, "~> 1.2", only: [:test], runtime: false},
{:eimp, "~> 1.0"},
{:erlydtl, git: "https://github.com/erlydtl/erlydtl", tag: "0.15.0", override: true},
{:ex_doc, "~> 0.31", only: [:edoc], runtime: false},
{:fast_tls, "~> 1.1.24"},
{:fast_xml, "~> 1.1.56"},
{:fast_yaml, "~> 1.0"},
{:idna, "~> 6.0"},
{:mqtree, "~> 1.0"},
{:p1_acme, "~> 1.0.27"},
{:p1_acme, ">= 1.0.28"},
{:p1_oauth2, "~> 0.6"},
{:p1_utils, "~> 1.0"},
{:pkix, "~> 1.0"},
{:stringprep, ">= 1.0.26"},
{:xmpp, ">= 1.11.0"},
{:yconf, ">= 1.0.18"}]
{:xmpp, ">= 1.12.0"},
{:yconf, ">= 1.0.22"}]
++ cond_deps()
end
@@ -155,13 +145,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.27"}},
{config(:pgsql), {:p1_pgsql, ">= 1.1.38"}},
{config(:sqlite), {:sqlite3, "~> 1.1"}},
{config(:stun), {:stun, "~> 1.0"}}], do:
dep
@@ -182,7 +171,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 +217,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 +255,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")
+15 -14
View File
@@ -1,39 +1,40 @@
%{
"base64url": {:hex, :base64url, "1.0.1", "f8c7f2da04ca9a5d0f5f50258f055e1d699f0e8bf4cfdb30b750865368403cf6", [:rebar3], [], "hexpm", "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c"},
"cache_tab": {:hex, :cache_tab, "1.0.33", "e2542afb34f17ee3ca19d2b0f546a074922c2b99fb6b2acfb38160d7d0336ec3", [:rebar3], [{:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "4258009eb050b22aabe0c848e230bba58401a6895c58c2ff74dfb635e3c35900"},
"dialyxir": {:hex, :dialyxir, "1.4.5", "ca1571ac18e0f88d4ab245f0b60fa31ff1b12cbae2b11bd25d207f865e8ae78a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b0fb08bb8107c750db5c0b324fa2df5ceaa0f9307690ee3c1f6ba5b9eb5d35c3"},
"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.26", "c0b05f32e35629c4d9bcfb832ff879a92b0f92b19844bc7835e0a45635f2899a", [:rebar3], [{:p1_utils, "~> 1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "d96d4e8572b9dfc40f271e47f0cb1d8849373bc98a21223268781765ed52044c"},
"epam": {:hex, :epam, "1.0.14", "aa0b85d27f4ef3a756ae995179df952a0721237e83c6b79d644347b75016681a", [:rebar3], [], "hexpm", "2f3449e72885a72a6c2a843f561add0fc2f70d7a21f61456930a547473d4d989"},
"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.58", "96bf0c07271f86f03f42778d4a1237099baec0714d00b0b815eb42d0007f73b4", [:rebar3], [{:fast_tls, "1.1.24", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.20", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "e0f4204a5ede0fa7d00da3cc42f6440aa362bac7faf536f71ea29fa3f0fa7c75"},
"ex_doc": {:hex, :ex_doc, "0.38.2", "504d25eef296b4dec3b8e33e810bc8b5344d565998cd83914ffe1b8503737c02", [: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", "732f2d972e42c116a70802f9898c51b54916e542cc50968ac6980512ec90f42b"},
"erlex": {:hex, :erlex, "0.2.8", "cd8116f20f3c0afe376d1e8d1f0ae2452337729f68be016ea544a72f767d9c12", [:mix], [], "hexpm", "9d66ff9fedf69e49dc3fd12831e12a8a37b76f8651dd21cd45fcf5561a8a7590"},
"erlydtl": {:git, "https://github.com/erlydtl/erlydtl", "aae414692b6052e96d890e03bbeeeca0f4dc01c2", [tag: "0.15.0"]},
"esip": {:hex, :esip, "1.0.59", "eb202f8c62928193588091dfedbc545fe3274c34ecd209961f86dcb6c9ebce88", [:rebar3], [{:fast_tls, "1.1.25", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.21", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "0bdf2e3c349dc0b144f173150329e675c6a51ac473d7a0b2e362245faad3fbe6"},
"ex_doc": {:hex, :ex_doc, "0.39.3", "519c6bc7e84a2918b737aec7ef48b96aa4698342927d080437f61395d361dcee", [: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", "0590955cf7ad3b625780ee1c1ea627c28a78948c6c0a9b0322bd976a079996e1"},
"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.15", "d74f5df191784744726a5b1ae9062522c606334f11086363385eb3b772d91357", [:rebar3], [{:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "dd14ba6c12521af5cfe6923e73e3d545f4a0897dc66bfab5287fbb7ae3962eab"},
"fast_tls": {:hex, :fast_tls, "1.1.24", "5492125689e3d84c101323a0bff3d3996b92a903832530fe4f0935ed30b1b7d1", [:rebar3], [{:p1_utils, "~> 1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "fff88ada39fad10464567a160643f4529ef4aed49d156919f5d1f415b6cdbbb6"},
"fast_tls": {:hex, :fast_tls, "1.1.25", "da8ed6f05a2452121b087158b17234749f36704c1f2b74dc51db99a1e27ed5e8", [:rebar3], [{:p1_utils, "~> 1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "59e183b5740e670e02b8aa6be673b5e7779e5fe5bfcc679fe2d4993d1949a821"},
"fast_xml": {:hex, :fast_xml, "1.1.57", "31efc0f9bceda92069704f7a25830407da5dc3dad1272b810d6f2e13e73cc11a", [:rebar3], [{:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "eec34e90adacafe467d5ddab635a014ded73b98b4061554b2d1972173d929c39"},
"fast_yaml": {:hex, :fast_yaml, "1.0.39", "2e71168091949bab0e5f583b340a99072b4d22d93eb86624e7850a12b1517be4", [:rebar3], [{:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "24c7b9ab9e2b9269d64e45f4a2a1280966adb17d31e63365cfd3ee277fb0a78d"},
"file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"},
"file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"},
"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"},
"jose": {:hex, :jose, "1.11.12", "06e62b467b61d3726cbc19e9b5489f7549c37993de846dfb3ee8259f9ed208b3", [:mix, :rebar3], [], "hexpm", "31e92b653e9210b696765cdd885437457de1add2a9011d92f8cf63e4641bab7b"},
"luerl": {:hex, :luerl, "1.2.3", "df25f41944e57a7c4d9ef09d238bc3e850276c46039cfc12b8bb42eccf36fcb1", [:rebar3], [], "hexpm", "1b4b9d0ca5d7d280d1d2787a6a5ee9f5a212641b62bff91556baa53805df3aed"},
"makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"},
"makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"},
"makeup_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"},
"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.19", "d769c25f898810725fc7db0dbffe5f72098647048b1be2e6d772f1c2f31d8476", [:rebar3], [{:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "c81065715c49a1882812f80a5ae2d842e80dd3f2d130530df35990248bf8ce3c"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
"p1_acme": {:hex, :p1_acme, "1.0.27", "43d565cf0e22da51033ae329e773ccad0f44c4cb9c7199d0863f522e570f2767", [: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", "aa64b6a8856b1a229a128bea27631de2e1a2219835e3a833fa11137143a8d773"},
"p1_mysql": {:hex, :p1_mysql, "1.0.26", "574d07c9936c53b1ec3556db3cf064cc14a6c39039835b3d940471bfa5ac8e2b", [:rebar3], [], "hexpm", "ea138083f2c54719b9cf549dbf5802a288b0019ea3e5449b354c74cc03fafdec"},
"p1_acme": {:hex, :p1_acme, "1.0.30", "8ce900dac15e53983b96925fbff0b519d85322fdc0a7479b7c6701d44be664c1", [: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", "2935e20916b806d3b1166953a4d90a690fd80781096140fe5ca1f65d59ebd68a"},
"p1_mysql": {:hex, :p1_mysql, "1.0.27", "e42eee7e9329ab762fe6ac9d47d9dc72923936f73a9a0b18f6825e825e44b366", [:rebar3], [], "hexpm", "066051f240027a76732547e69d96a0974e70dc14ded9453bef263221841eda9b"},
"p1_oauth2": {:hex, :p1_oauth2, "0.6.14", "1c5f82535574de87e2059695ac4b91f8f9aebacbc1c80287dae6f02552d47aea", [:rebar3], [], "hexpm", "1fd3ac474e43722d9d5a87c6df8d36f698ed87af7bb81cbbb66361451d99ae8f"},
"p1_pgsql": {:hex, :p1_pgsql, "1.1.34", "d36bd0d6c9765a47d075a87ad5e3fc3bfd153bdc4c07a1217b9979f33f73e9aa", [:rebar3], [{:xmpp, "~> 1.11.0", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "cb0e32e086c9c35d0e3e966e3863d832737c7b4d2b5f147316a465c0b243ea7f"},
"p1_pgsql": {:hex, :p1_pgsql, "1.1.38", "1580f16ea95a19f116977d13618b9eb402d8aa169fd86c65ad6f09acf37bbd74", [:rebar3], [{:xmpp, "~> 1.12.0", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "06cf6443008178eba387ba2ee924d3620041bae4da1b2c969680284a05cc759e"},
"p1_utils": {:hex, :p1_utils, "1.0.28", "9a7088a98d788b4c4880fd3c82d0c135650db13f2e4ef7e10db179791bc94d59", [:rebar3], [], "hexpm", "c49bd44bc4a40ad996691af826dd7e0aa56d4d0cd730817190a1f84d1a7f0033"},
"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.33", "22f42866b4f6f3c238ea2b9cb6241791184ddedbab55e94a025511f46325f3ca", [:rebar3], [{:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "96f8b30bc50887f605b33b46bca1d248c19a879319b8c482790e3b4da5da98c0"},
"stun": {:hex, :stun, "1.2.20", "62a149cea122a78a104b9e064a12d9e33105b26c23168ecf3aea6e0c26de0748", [:rebar3], [{:fast_tls, "1.1.24", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "79e49f826a4f7d522c939ab633d935c79d7d6b229e4cb7e05f62f33b50177414"},
"stun": {:hex, :stun, "1.2.21", "735855314ad22cb7816b88597d2f5ca22e24aa5e4d6010a0ef3affb33ceed6a5", [:rebar3], [{:fast_tls, "1.1.25", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "3d7fe8efb9d05b240a6aa9a6bf8b8b7bff2d802895d170443c588987dc1e12d9"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.1", "a48703a25c170eedadca83b11e88985af08d35f37c6f664d6dcfb106a97782fc", [:rebar3], [], "hexpm", "b3a917854ce3ae233619744ad1e0102e05673136776fb2fa76234f3e03b23642"},
"xmpp": {:hex, :xmpp, "1.11.0", "a3158c486c9b86a7090c361d876db622381f4312ede8c125d7a52ad390387932", [: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.26", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "~> 1.0.29", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "34a191d6a3b74e8f0a42346f859e2cab5b3a2ae7e5c28f392e5cb56612e7ce85"},
"yconf": {:hex, :yconf, "1.0.20", "f2b38db613fa826966e8d22bdc3e3ebae46919f2a27ab149a5a086c1d99d3bbd", [:rebar3], [{:fast_yaml, "1.0.39", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "f2b3d730756fc2e4afd1c0b0ab6efb99f0e448952d25dc15ed75ac1635bf8882"},
"xmpp": {:hex, :xmpp, "1.12.0", "5a583fe1122f013310147cb7f36bd75de8a4ef0a836487826bf1a9f53403792e", [: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.26", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "~> 1.0.29", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "014bae73659fba256771eb007bc5348618ac727dd1d10b9ab15a9fef871622c8"},
"yconf": {:hex, :yconf, "1.0.22", "52a435f9b60ab1e13950dfe3f7131ecdd8b3d1ca72c44bf66fc74b4571027124", [:rebar3], [{:fast_yaml, "1.0.39", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "aca83457ceabe70756484b5c87ba7b1955f511d499168687eaeaa7c300e857f1"},
}
+26
View File
@@ -0,0 +1,26 @@
<div class="container">
<div class="row">
{% for item in apps %}
<div class="card m-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">
<img src="{{ static }}/{{ item.image }}" class="p-2 img-fluid" alt="{{ item.imagetext }}">
</div>
<div class="col-md-8">
<div class="card-body d-flex flex-column h-100">
<h5 class="card-title text-nowrap mb-1">{{ item.name }}</h5>
<div>
{% for platform in item.platforms %}<span class="badge badge-info client-platform-badge client-platform-badge-{{ platform|lower }} mr-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">{% 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">
{% trans "Showing apps for <span class='platform-name'>your current platform</span> only. You may also <a href='#' id='show-all-clients-button'>view all apps.</a>" %}
</div>
+162
View File
@@ -0,0 +1,162 @@
[
{
"download": {
"buttons": [
{
"image": "{{ static }}/logos/google_ps.png",
"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",
"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",
"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",
"target": "_blank",
"url": "https://apps.apple.com/app/id317711500"
}
]
},
"image": "logos/monal-tmp.svg",
"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",
"target": "_blank",
"url": "https://apps.apple.com/app/id1637078500"
}
]
},
"image": "logos/monal-tmp.svg",
"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/apple_as.svg",
"target": "_blank",
"url": "https://apps.apple.com/us/app/siskin-im/id1153516838"
}
]
},
"image": "logos/siskin-im.svg",
"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",
"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",
"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",
"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",
"link": "https://pulkomandy.tk/projects/renga",
"name": "Renga",
"platforms": [
"Haiku"
],
"text": "{% trans "XMPP client for Haiku" %}"
}
]
+47
View File
@@ -0,0 +1,47 @@
{% extends "base_min.html" %}
{% block rel_alternate %}
<link rel="alternate" href="{{ uri }}">
{% endblock %}
{% block qr_button %}
<div id="qr-button-container" class="float-right w-25 border border-info p-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 d-block btn btn-info" title="{% trans "Send this invite to your device" %}"
data-toggle="modal" data-target="#qr-modal">
<img src="{{ static }}/qr-logo.png" alt="{% trans "QR code icon" %}" class="align-middle h-50 mt-1" style="display:inline" >
{% 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">
<h5 class="modal-title">{% trans "Scan invite code" %}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</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" style="width: 256px;" class="bg-light mx-auto"></div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">{% trans "Close" %}</button>
</div>
</div>
</div>
</div>
{% endblock %}
{% block extra_scripts %}
<script src="{{ static }}/qrcode.min.js"></script>
<script src="{{ static }}/platform.min.js"></script>
<script src="{{ static }}/invite.js"></script>
{% endblock %}
+35
View File
@@ -0,0 +1,35 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}{% blocktrans %}Invite to {{ site_name }}{% endblocktrans %}{% endblock %}</title>
{% block rel_alternate %}{% endblock %}
<link rel="stylesheet" href="/share/bootstrap4/css/bootstrap.min.css">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#fbd308">
<meta name="theme-color" content="#fbd308">
</head>
<body>
<div id="background" class="fixed-top overflow-hidden"></div>
<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 mt-2 mt-md-5{% endblock %}">
<div class="card rounded-lg shadow">
<h1 class="card-header rounded-lg rounded-lg">
{%block h1 %}{% blocktrans %}Invite to {{ site_name }}{% endblocktrans %}{% endblock %}<br/>
</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="/share/jquery/jquery.min.js"></script>
<script src="/share/bootstrap4/js/bootstrap.min.js"></script>
</body>
</html>
+70
View File
@@ -0,0 +1,70 @@
{% extends "base.html" %}
{% 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>
<p>{% blocktrans with app_name=app.name %}You can start chatting right away with {{ app_name }}. Let's get started!{% endblocktrans %}</p>
<div class="card m-3 client-card {% for item in app.platforms %}app-platform-{{ item|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">
<img src="{{ static }}/{{ app.image }}" class="p-2 img-fluid" alt="{{ app.imagetext }}">
</div>
<div class="col-md-8 h-100">
<div class="card-body d-flex flex-column h-100">
<h5 class="card-title text-nowrap mb-1">{{ app.name }}</h5>
<div>
{% for item in app.platforms %}<span class="badge badge-info client-platform-badge client-platform-badge-{{ item|lower }} mr-1 mb-3">{{ item }}</span> {% endfor %}
</div>
<p class="card-text">{{ app.text }}</p>
</div>
</div>
</div>
</div>
<h3 style="clear:both">{% blocktrans with app_name=app.name %}Step 1: Install {{ app_name }}{% endblocktrans %}</h3>
<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="ml-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">
<img src="{{ button.image }}" {% if button.alttext %}alt="{{ button.alttext }}"{% endif %} style="max-width: 160px;">
</a>
{% endif %}
{% if button.text %}
<a href="{{ button.url }}" {% if button.target %}target="{{ button.target }}"{% endif %} class="btn btn-primary" rel="noopener">
{{ 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>
<h3>{% trans "Step 2: Activate your account" %}</h3>
<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>
<a href="{{ uri }}" id="uri-cta" class="btn btn-primary ml-5 mt-1 mb-3">{% 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>
{% endblock %}
{% block extra_scripts %}
<script src="{{ static }}/qrcode.min.js"></script>
<script src="{{ static }}/platform.min.js"></script>
<script src="{{ static }}/invite.js"></script>
{% 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.
+18
View File
@@ -0,0 +1,18 @@
{% extends "base.html" %}
{% 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>
<h5 class="card-title" style="clear:both">{% trans "Get started" %}</h5>
<p>{% trans "To get started, you need to install an app for your platform:" %}</p>
{% include "apps.html" %}
<h5>{% trans "Other software" %}</h5>
<p>{% blocktrans %}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 }}">register an account manually</a>.{% endblocktrans %}</p>
{% endblock %}
+9
View File
@@ -0,0 +1,9 @@
{% 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 mt-2 mt-md-5{% endblock %}
{% block content %}
<h5 class="card-title">{% trans "Invite expired" %}</h5>
<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 %}
+64
View File
@@ -0,0 +1,64 @@
{% extends "base_min.html" %}
{% block title %}{% blocktrans %}Register on {{ site_name }}{% endblocktrans %}{% endblock %}
{% block h1 %}{% blocktrans %}Register on {{ site_name }}{% endblocktrans %}{% 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 mt-2 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>
<h6 class="text-center">{% blocktrans with app_name=app.name %}{{ app_name }} already installed?{% endblocktrans %}</h6>
<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 %}
<h5 class="card-title">{% trans "Create an account" %}</h5>
{%if message %}<div class="alert {%if message.class %}{{ message.class }}{% else %}alert-info{% endif %}" role="alert">
{{ message.text }}
</div>{% endif %}
<form method="post">
<div class="form-group form-row">
<label for="user" class="col-md-4 col-lg-12 col-form-label">{% trans "Username" %}:</label>
<div class="col-md-8 col-lg-12">
<div class="input-group">
<input
type="text" name="user" class="form-control" aria-describedby="usernameHelp"
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>
<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="form-group form-row">
<label for="password" class="col-md-4 col-lg-12 col-form-label">{% trans "Password" %}:</label>
<div class="col-md-8 col-lg-12">
<input type="password" name="password" class="form-control" aria-describedby="passwordHelp"
autocomplete="new-password" required minlength="{{ password_policy.length }}"
>
<small id="passwordHelp" class="form-text text-muted">{% trans "Enter a secure password that you do not use anywhere else." %}</small>
</div>
</div>
<div class="form-group form-row">
<input type="hidden" name="token" value="{{ token }}">
{% if app %}<input type="hidden" name="app_id" value="{{ app.id }}">{% endif %}
<button type="submit" class="btn btn-primary btn-lg">{% trans "Submit" %}</button>
</div>
</form>
{% 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 mt-2 mt-md-5{% endblock %}
{% block content %}
<h5 class="card-title">{% trans "Registration error" %}</h5>
<p>{% if message %}{{ message }}{% else %}{% trans "Sorry, there was a problem registering your account." %}{% endif %}</p>
{% endblock%}
+101
View File
@@ -0,0 +1,101 @@
{% 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 mt-2 mt-md-5{% endblock %}
{% block title %}{{site_name}}{% endblock %}
{% block h1 %}{{site_name}}{% endblock %}
{% block extra_scripts %}
<script>
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 = "{% trans "Hide" %}";
break;
case "text":
input.attributes.type.value = "password";
button.innerText = "{% trans "Show" %}";
break;
}
}
</script>
{% endblock %}
{% block content %}
<h5 class="card-title">{% trans "Congratulations!" %}</h5>
<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="alert alert-success">
<div class="container">
<div class="row">
<div class="col-9">
<p>{% trans "<strong>No suitable software installed right now?</strong> You can also log in to your account through our online web chat!" %}</p>
</div>
<div class="col">
<a class="btn btn-primary" href="{{ webchat_url }}">{% 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>
<h5>{% blocktrans with app_name=app.name %}Step 1: Download and install {{ app_name }}{% endblocktrans %}</h5>
<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="ml-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>
<h5>{% blocktrans with app_name=app.name %}Step 2: Connect {{ app_name }} to your new account{% endblocktrans %}</h5>
<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 col-lg-6 mx-auto">
<div class="form-group form-row">
<label for="user" class="col-md-4 col-lg-12 col-form-label">{% trans "Chat address (JID)" %}:</label>
<div class="col-md-8 col-lg-12">
<input type="text" class="form-control-plaintext" readonly value="{{ username }}@{{ domain }}">
</div>
</div>
{% if password %}
<div class="form-group form-row">
<label for="password" class="col-md-4 col-lg-12 col-form-label">{% trans "Password" %}:</label>
<div class="col-md-8 col-lg-12">
<div class="input-group">
<input type="password" readonly class="form-control" value="{{ password }}">
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" onclick="toggle_password(event)">{% trans "Show" %}</button>
</div>
</div>
</div>
</div>
{% endif %}
</form>
{% if password %}
<p>{% 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 %}{% blocktrans with inviter=invite.inviter|jid %}{{ inviter }} has invited you to connect!{% endblocktrans %}{% endblock %}
{% block h1 %}{% blocktrans with inviter=invite.inviter|user %}{{ inviter }} has invited you to connect!{% endblocktrans %}{% endblock %}
{% block content %}
<div class="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="col-md-4">
<a href="{{ invite.uri }}" class="btn btn-primary my-3 mb-3">{% blocktrans with inviter=invite.inviter|user %}Add {{ inviter }} to your contact list{% endblocktrans %}</a><br/>
<!-- {{ invite.uri }} -->
</div>
</div>
<p>{% trans "If you don't have an XMPP client installed yet, here's a list of suitable clients for your platform." %}</p>
{% include "apps.html" %}
{% endblock %}
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 34 KiB

+91
View File
@@ -0,0 +1,91 @@
(function () {
// 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");
}
// 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) {
// 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');
for (let badge of badges) {
if (badge.classList.contains('client-platform-badge-'+platform_classname)) {
badge.classList.add("badge-success");
badge.classList.remove("badge-info");
} else {
badge.classList.add("badge-secondary");
badge.classList.remove("badge-info");
}
}
}
const show_all_clients_button_container = document.getElementById('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();
});
}
}
})();
@@ -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

+36
View File
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
<filter width="64" height="64" id="shadow">
<feDropShadow dx="3" dy="3" stdDeviation="0" flood-opacity="0.4"/>
</filter>
<g filter="url(#shadow)">
<path fill="none" stroke="#000" 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,4)"
/>
<linearGradient id="gradient0" gradientUnits="userSpaceOnUse" x1="128" y1="2" x2="128" y2="40">
<stop offset="0" stop-color="#fff"/>
<stop offset="1" stop-color="#e5e5e5"/>
</linearGradient>
<path 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,4)"
/>
<path fill="#000"
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.4 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));
Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

File diff suppressed because one or more lines are too long
+31 -5
View File
@@ -15,7 +15,6 @@
{"Access model","Модел на достъп"}.
{"Account doesn't exist","Профилът не съществува"}.
{"Action on user","Действие върху потребител"}.
{"Add a hat to a user","Добави шапка към потребител"}.
{"Add User","Добави потребител"}.
{"Administration of ","Администриране на "}.
{"Administration","Администриране"}.
@@ -46,8 +45,11 @@
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Всеки, който има абонамент за присъствие на двете или от: може да се абонира и да извлича елементи"}.
{"Anyone with Voice","Всеки, с възможност за гласово обаждане"}.
{"Anyone","Всеки"}.
{"API Commands","API Команди"}.
{"April","Април"}.
{"Attribute 'channel' is required for this request","Атрибутът 'канал' е задължителен за тази заявка"}.
{"Arguments","Аргументи"}.
{"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","Атрибутът 'нод' не е разрешен тук"}.
@@ -86,12 +88,15 @@
{"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"}.
{"Configuration","Конфигурация"}.
{"Contact Addresses (normally, room owner or owners)","Адреси за контакт (обикновено собственик или собственици на стая)"}.
{"Contacts","Контакти"}.
{"Country","Държава"}.
{"Create a Hat","Създай Шапка"}.
{"Current Discussion Topic","Текуща тема на дискусита"}.
{"Database failure","Грешка в базата данни"}.
{"Database Tables Configuration at ","Конфигурация на таблиците в базата данни при "}.
@@ -103,6 +108,8 @@
{"Delete User","Изтрий потребителя"}.
{"Deliver event notifications","Достави известията за събития"}.
{"Deliver payloads with event notifications","Достави прикачените обекти с известията за събития"}.
{"Destroy a Hat","Разруши Шапка"}.
{"Disable User","Деактивирай потребителя"}.
{"Disc only copy","Копие само на диска"}.
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Не казвайте паролата си на никого, дори на администраторите на XMPP сървъра."}.
{"Dump Backup to Text File at ","Архивиране в текстов файл при "}.
@@ -154,12 +161,19 @@
{"Full List of Room Admins","Пълен списък на администраторите на стаята"}.
{"Full List of Room Owners","Пълен списък на собствениците на стаята"}.
{"Full Name","Пълно име"}.
{"Get List of Online Users","Списък на онлайн потребителите"}.
{"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 User Last Login Time","Покажи времето, когато потребителят е влязъл за последно"}.
{"Get User Roster","Списък с потребители"}.
{"Get User Statistics","Покажи статистика за потребителя"}.
{"Given Name","Наименование"}.
{"Grant voice to this person?","Предоставяне на глас за потребителя?"}.
@@ -168,7 +182,9 @@
{"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","Превишен е лимитът за шапка"}.
@@ -222,7 +238,7 @@
{"Last year","Миналата година"}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Най-малко значимите битове SHA-256 хеш на текст трябва да са равни на шестнайсетичния етикет"}.
{"leaves the room","напуска стаята"}.
{"List of users with hats","Списък на потребителите с шапки"}.
{"List of Hats","Списък с шапки"}.
{"List users with hats","Избройте потребителите с шапки"}.
{"Logged Out","Излязъл"}.
{"Logging","Регистриране на събития"}.
@@ -316,13 +332,15 @@
{"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","Октомври"}.
@@ -392,6 +410,7 @@
{"Receive notification of new items only","Получаване на известия само за нови елементи"}.
{"Receive notification of new nodes only","Получаване на известия само за нови нодове"}.
{"Recipient is not in the conference room","Получателят не е в конферентната стая"}.
{"Re-Enable User","Активиране на потребител"}.
{"Register an XMPP account","Регистрирай XMPP акаунт"}.
{"Register","Регистрирай"}.
{"Remote copy","Отдалечено копие"}.
@@ -408,6 +427,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","Роли, които могат да изпращат лични съобщения"}.
@@ -458,6 +478,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","Заявките за абонамент трябва да бъдат одобрени и само абонатите могат да извличат елементи"}.
@@ -485,6 +506,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,6 +530,7 @@
{"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","Подателят на последното получено съобщение"}.
@@ -584,6 +609,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","Когато се обработва нов абонамент"}.
+24 -3
View File
@@ -15,7 +15,6 @@
{"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 User","Afegir usuari"}.
{"Administration of ","Administració de "}.
{"Administration","Administració"}.
@@ -49,6 +48,7 @@
{"API Commands","Comandaments API"}.
{"April","Abril"}.
{"Arguments","Arguments"}.
{"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í"}.
@@ -94,7 +94,9 @@
{"Configuration of room ~s","Configuració de la sala ~s"}.
{"Configuration","Configuració"}.
{"Contact Addresses (normally, room owner or owners)","Adreces de contacte (normalment, propietaris de la sala)"}.
{"Contacts","Contactes"}.
{"Country","Pais"}.
{"Create a Hat","Crear un barret"}.
{"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 "}.
@@ -106,6 +108,8 @@
{"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"}.
{"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."}.
{"Dump Backup to Text File at ","Exporta còpia de seguretat a fitxer de text en "}.
@@ -157,12 +161,19 @@
{"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"}.
{"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 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"}.
{"Grant voice to this person?","Concedir veu a aquesta persona?"}.
@@ -171,7 +182,9 @@
{"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"}.
@@ -225,7 +238,7 @@
{"Last year","Últim any"}.
{"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"}.
{"Logged Out","Desconectat"}.
{"Logging","Registre"}.
@@ -319,13 +332,15 @@
{"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"}.
@@ -395,6 +410,7 @@
{"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","Registrar"}.
{"Remote copy","Còpia remota"}.
@@ -461,6 +477,7 @@
{"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"}.
{"Subject","Tema"}.
{"Submit","Enviar"}.
{"Submitted","Enviat"}.
{"Subscriber Address","Adreça del Subscriptor"}.
{"Subscribers may publish","Els subscriptors poden publicar"}.
@@ -489,6 +506,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ó"}.
@@ -510,6 +530,7 @@
{"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"}.
+1
View File
@@ -315,6 +315,7 @@
{"Store binary backup:","Uložit binární zálohu:"}.
{"Store plain text backup:","Uložit zálohu do textového souboru:"}.
{"Subject","Předmět"}.
{"Submit","Odeslat"}.
{"Submitted","Odeslané"}.
{"Subscriber Address","Adresa odběratele"}.
{"Subscriptions are not allowed","Předplatné není povoleno"}.
+120 -7
View File
@@ -4,22 +4,32 @@
%% 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 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 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"}.
@@ -49,6 +59,8 @@
{"API Commands","API Befehle"}.
{"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"}.
@@ -61,6 +73,8 @@
{"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."}.
{"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"}.
@@ -77,6 +91,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"}.
@@ -84,16 +99,27 @@
{"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"}.
{"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."}.
{"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 "}.
@@ -105,8 +131,15 @@
{"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"}.
{"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"}.
@@ -123,11 +156,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"}.
@@ -156,12 +190,20 @@
{"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"}.
{"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"}.
{"Grant voice to this person?","Dieser Person Sprachrechte erteilen?"}.
@@ -170,13 +212,19 @@
{"has been kicked because of an affiliation change","wurde wegen einer Änderung der Zugehörigkeit hinausgeworfen"}.
{"has been kicked because the room has been changed to members-only","wurde hinausgeworfen weil der Raum zu Nur-Mitglieder geändert wurde"}.
{"has been kicked","wurde hinausgeworfen"}.
{"Hash 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 title","Funktionstitel"}.
{"Hat URI","Funktions-URI"}.
{"Hats limit exceeded","Funktionslimit wurde überschritten"}.
{"Hat hue","Hutfarbe"}.
{"Hat title","Huttitle"}.
{"Hat URI","Hüte Funktions-URI"}.
{"Hats limit exceeded","Hütelimit wurde überschritten"}.
{"Hide","Verbergen"}.
{"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 geegineter 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"}.
@@ -195,6 +243,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"}.
@@ -202,6 +251,9 @@
{"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 to {{ site_name }}","Einladung für {{ site_name }}"}.
{"Invite User","Person einladen"}.
{"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"}.
@@ -211,6 +263,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"}.
@@ -222,10 +275,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"}.
@@ -242,9 +298,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)"}.
@@ -313,18 +371,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"}.
@@ -347,9 +408,11 @@
{"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"}.
@@ -361,6 +424,7 @@
{"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"}.
@@ -383,6 +447,7 @@
{"PubSub subscriber request","PubSub-Abonnenten-Anforderung"}.
{"Purge all items when the relevant publisher goes offline","Alle Items löschen, wenn der relevante Veröffentlicher offline geht"}.
{"Push record not found","Push-Eintrag nicht gefunden"}.
{"QR code icon","QR-Code Icon"}.
{"Queries to the conference members are not allowed in this room","Anfragen an die Konferenzteilnehmer sind in diesem Raum nicht erlaubt"}.
{"Query to another users is forbidden","Anfrage an andere Benutzer ist verboten"}.
{"RAM and disc copy","RAM und Festplatte"}.
@@ -393,8 +458,11 @@
{"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"}.
{"Remote copy","Fernkopie"}.
{"Remove a hat from a user","Eine Funktion bei einem Benutzer entfernen"}.
{"Remove User","Benutzer löschen"}.
@@ -423,16 +491,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"}.
@@ -441,10 +514,15 @@
{"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'>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\">sämtliche Apps anzeigen lassen</a>."}.
{"Shut Down Service","Dienst herunterfahren"}.
{"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"}.
@@ -452,12 +530,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","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"}.
@@ -486,6 +573,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"}.
@@ -507,15 +597,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!","Die 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."}.
@@ -524,7 +619,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"}.
@@ -557,15 +654,20 @@
{"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"}.
@@ -601,6 +703,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"}.
@@ -610,8 +713,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 }}\">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 }}\">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 {{ site_name }} zum Chat eingeladen. {{ site_name }} 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"}.
@@ -619,6 +731,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."}.
+1 -3
View File
@@ -15,7 +15,6 @@
{"Access model","Μοντέλο πρόσβασης"}.
{"Account doesn't exist","Ο λογαριασμός δεν υπάρχει"}.
{"Action on user","Eνέργεια για το χρήστη"}.
{"Add a hat to a user","Προσθέστε ένα καπέλο σε έναν χρήστη"}.
{"Add User","Προσθήκη Χρήστη"}.
{"Administration of ","Διαχείριση του "}.
{"Administration","Διαχείριση"}.
@@ -225,7 +224,6 @@
{"Last year","Πέρυσι"}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Τα ψηφία μικρότερης αξίας του αθροίσματος SHA-256 του κειμένου θα έπρεπε να ισούνται με την δεκαεξαδική ετικέτα"}.
{"leaves the room","εγκαταλείπει την αίθουσα"}.
{"List of users with hats","Λίστα των χρηστών με καπέλα"}.
{"List users with hats","Λίστα χρηστών με καπέλα"}.
{"Logged Out","Αποσυνδεδεμένος"}.
{"Logging","Καταγραφή"}.
@@ -325,7 +323,6 @@
{"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","Οκτώβριος"}.
@@ -462,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","Τα αιτήματα για συνδρομή πρέπει να εγκριθούν και μόνο οι συνδρομητές μπορούν να λάβουν αντικείμενα"}.
+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"}.
+113 -4
View File
@@ -4,22 +4,32 @@
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
{" (Add * to the end of field to match substring)"," (Añade * al final del campo para buscar subcadenas)"}.
{"{{ app_name }} already installed?","¿Ya está instalado {{ app_name }}?"}.
{" has set the subject to: "," ha puesto el asunto: "}.
{"{{ inviter }} has invited you to connect!","¡{{ inviter }} te ha invitado a conectarte!"}.
{"# participants","# participantes"}.
{"A description of the node","Una descripción del nodo"}.
{"A friendly name for the node","Un nombre sencillo para el nodo"}.
{"A fully-featured desktop chat client for Windows and Linux.","Un cliente de charla con muchas posibilidades para Windows y Linux."}.
{"A lightweight and powerful XMPP client for iPhone and iPad. It provides an easy way to talk and share moments with your friends.","Un cliente XMPP ligero y potente para iPhone e iPad. Proporciona una forma sencilla de charlar y compartir momentos con tus amistades."}.
{"A modern open-source chat client for iPhone and iPad. It is easy to use and has a clean user interface.","Un cliente de charla moderno y de software libre para iPhone e iPad. Es simple de usar y tiene una interface de usuario limpia."}.
{"A modern open-source chat client for Mac. It is easy to use and has a clean user interface.","Un cliente de charla moderno y de software libre para Mac. Es simple de usar y tiene una interface de usuario limpia."}.
{"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 cliente de charla moderno y de software libre para el escritorio. Está enfocado en proporcionar una experiencia Jabber/XMPP limpia y confiable, mientras mantienes tu privacidad en mente."}.
{"A password is required to enter this room","(Añade * al final del campo para buscar subcadenas)"}.
{"A Web Page","Una página web"}.
{"Accept invite using {{ app_name }}","Aceptar la invitación usando {{ app_name }}"}.
{"Accept","Aceptar"}.
{"Access denied by service policy","Acceso denegado por la política del servicio"}.
{"Access model","Modelo de Acceso"}.
{"Account doesn't exist","La cuenta no existe"}.
{"Action on user","Acción en el usuario"}.
{"Add a hat to a user","Añade un sombrero a un usuario"}.
{"Add {{ inviter }} to your contact list","Añade {{ inviter }} a tu lista de contactos"}.
{"Add User","Añadir usuario"}.
{"Administration of ","Administración de "}.
{"Administration","Administración"}.
{"Administrator privileges required","Se necesita privilegios de administrador"}.
{"After clicking the button you will be taken to {{ app_name }} to finish setting up your new {{ site_name }} account.","Después de pulsar el botón, se te llevará a {{ app_name }} para completar la preparación de tu nueva cuenta en {{ site_name }}."}.
{"After successfully installing {{ app_name }}, come back to this page and <strong>continue with Step 2</strong>.","Después de haber instalado {{ app_name }}, regresa a esta página para <strong>continuar con el Paso 2</strong>."}.
{"All activity","Toda la actividad"}.
{"All Users","Todos los usuarios"}.
{"Allow subscription","Permitir la subscripción"}.
@@ -49,6 +59,8 @@
{"API Commands","Comandos API"}.
{"April","Abril"}.
{"Arguments","Argumentos"}.
{"As a final reminder, your account details are shown below:","Como último recordatorio, los detalles de tu cuenta se muestran aquí:"}.
{"Assign a hat to a user","Asigna un sombrero a un usuario"}.
{"Attribute 'channel' is required for this request","El atributo 'channel' es necesario para esta petición"}.
{"Attribute 'id' is mandatory for MIX messages","El atributo 'id' es necesario para mensajes MIX"}.
{"Attribute 'jid' is not allowed here","El atributo 'jid' no está permitido aqui"}.
@@ -61,6 +73,8 @@
{"Backup to File at ","Guardar copia de seguridad en fichero en "}.
{"Backup","Guardar copia de seguridad"}.
{"Bad format","Mal formato"}.
{"BAD REQUEST","MALA PETICIÓN"}.
{"Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.","Beagle IM de Tigase, Inc. es un cliente XMPP ligero y potente para macOS."}.
{"Birthday","Cumpleaños"}.
{"Both the username and the resource are required","Se requiere tanto el nombre de usuario como el recurso"}.
{"Bytestream already activated","Bytestream ya está activado"}.
@@ -77,24 +91,36 @@
{"Channel JID","JID del Canal"}.
{"Channels","Canales"}.
{"Characters not allowed:","Caracteres no permitidos:"}.
{"Chat address (JID)","Dirección de charla (JID)"}.
{"Chatroom configuration modified","Configuración de la sala modificada"}.
{"Chatroom is created","Se ha creado la sala"}.
{"Chatroom is destroyed","Se ha destruido la sala"}.
{"Chatroom is started","Se ha iniciado la sala"}.
{"Chatroom is stopped","Se ha detenido la sala"}.
{"Chatrooms","Salas de charla"}.
{"Choose a username and password to register with this server","Escoge un nombre de usuario y contraseña para registrarte en este servidor"}.
{"Choose a username and password to register with this server","Escoge un nombre de cuenta y contraseña para registrarte en este servidor"}.
{"Choose a username, this will become the first part of your new chat address.","Escoge un nombre para tu cuenta, este será la primera parte de tu nueva dirección de charla."}.
{"Choose storage type of tables","Selecciona tipo de almacenamiento de las tablas"}.
{"Choose whether to approve this entity's subscription.","Decidir si aprobar la subscripción de esta entidad."}.
{"City","Ciudad"}.
{"Click the button to open the Dino website where you can download and install it on your PC.","Pulsa en el botón para abrir la página de Dino donde podrás descargarlo e instalarlo."}.
{"Client acknowledged more stanzas than sent by server","El cliente ha reconocido más paquetes de los que el servidor ha enviado"}.
{"Close","Cerrar"}.
{"Clustering","Clustering"}.
{"Commands","Comandos"}.
{"Conference room does not exist","La sala de conferencias no existe"}.
{"Configuration of room ~s","Configuración para la sala ~s"}.
{"Configuration","Configuración"}.
{"Congratulations!","¡Enhorabuena!"}.
{"Contact Addresses (normally, room owner or owners)","Direcciones de contacto (normalmente la del dueño o dueños de la sala)"}.
{"Contacts","Contactos"}.
{"Conversations is a Jabber/XMPP client for Android 6.0+ smartphones that has been optimized to provide a unique mobile experience.","Conversations es un cliente Jabber/XMPP para móviles Android 6.0+ optimizado para proporcionar una experiencia móvil única."}.
{"Country","País"}.
{"Create a Hat","Crear un sombrero"}.
{"Create Account","Crear Cuenta"}.
{"Create an account","Crear una cuenta"}.
{"Creating an account will allow to communicate with other people on <strong>{{ site_name }}</strong> and other services on the XMPP network.","Crear una cuenta te permitirá comunicarte con otra gente en <strong>{{ site_name }}</strong> y en otros servidores de la red 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 una cuenta te permitirá comunicarte con <strong>{{ inviter }}</strong> y otras personas en <strong>{{ site_name }}</strong> y en otros servicios de la red XMPP."}.
{"Current Discussion Topic","Tema de discusión actual"}.
{"Database failure","Error en la base de datos"}.
{"Database Tables Configuration at ","Configuración de tablas de la base de datos en "}.
@@ -106,8 +132,15 @@
{"Delete User","Borrar usuario"}.
{"Deliver event notifications","Entregar notificaciones de eventos"}.
{"Deliver payloads with event notifications","Enviar contenidos junto con las notificaciones de eventos"}.
{"Destroy a Hat","Destruir un sombrero"}.
{"Disable User","Deshabilitar un usuario"}.
{"Disc only copy","Copia en disco solamente"}.
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","No le digas tu contraseña a nadie, ni siquiera a los administradores del servidor XMPP."}.
{"Download and install {{ app_name }} below:","Descarga e instala {{ app_name }} aquí abajo:"}.
{"Download Dino for Linux","Descarga Dino para Linux"}.
{"Download from Mac App Store","Descargar de la Tienda de Aplicaciones Mac"}.
{"Download Gajim","Descargar Gajim"}.
{"Download Renga for Haiku","Descargar Renga para Haiku"}.
{"Dump Backup to Text File at ","Exporta copia de seguridad a fichero de texto en "}.
{"Dump to Text File","Exportar a fichero de texto"}.
{"Duplicated groups are not allowed by RFC6121","Los grupos duplicados no están permitidos por RFC6121"}.
@@ -129,6 +162,7 @@
{"Enable message archiving","Activar el almacenamiento de mensajes"}.
{"Enabling push without 'node' attribute is not supported","No está soportado activar Push sin el atributo 'node'"}.
{"End User Session","Cerrar sesión de usuario"}.
{"Enter a secure password that you do not use anywhere else.","Introduce una contraseña segura que no estés usando en ningún otro sitio."}.
{"Enter nickname you want to register","Introduce el apodo que quieras registrar"}.
{"Enter path to backup file","Introduce ruta al fichero de copia de seguridad"}.
{"Enter path to jabberd14 spool dir","Introduce la ruta al directorio de jabberd14 spools"}.
@@ -157,12 +191,20 @@
{"Full List of Room Admins","Lista completa de administradores de la sala"}.
{"Full List of Room Owners","Lista completa de dueños de la sala"}.
{"Full Name","Nombre completo"}.
{"Get List of Active Users","Ver lista de usuarios activos"}.
{"Get List of Disabled Users","Ver lista de usuarios deshabilitados"}.
{"Get List of Idle Users","Ver lista de usuarios inactivos"}.
{"Get List of Online Users","Ver lista de usuarios conectados"}.
{"Get List of Registered Users","Ver lista de usuarios registrados"}.
{"Get Number of Active Users","Ver número de usuarios activos"}.
{"Get Number of Disabled Users","Ver número de usuarios deshabilitados"}.
{"Get Number of Idle Users","Ver número de usuarios inactivos"}.
{"Get Number of Online Users","Ver número de usuarios conectados"}.
{"Get Number of Registered Users","Ver número de usuarios registrados"}.
{"Get Pending","Obtener pendientes"}.
{"Get started","Empecemos"}.
{"Get User Last Login Time","Ver fecha de la última conexión de usuario"}.
{"Get User Roster","Ver lista de contactos del usuario"}.
{"Get User Statistics","Ver estadísticas de usuario"}.
{"Given Name","Nombre de pila"}.
{"Grant voice to this person?","¿Conceder voz a esta persona?"}.
@@ -171,13 +213,19 @@
{"has been kicked because of an affiliation change","ha sido expulsado por un cambio de su afiliación"}.
{"has been kicked because the room has been changed to members-only","ha sido expulsado porque la sala es ahora solo para miembros"}.
{"has been kicked","ha sido expulsado"}.
{"Hash computed from the list of hats available in a room","Hash computado a partir de la lista de sombreros disponibles en una sala"}.
{"Hash of the vCard-temp avatar of this room","Hash del avatar vCard-temp de esta sala"}.
{"Hat hue","Tono de color del sombrero"}.
{"Hat title","Título del sombrero"}.
{"Hat URI","Dirección del sombrero"}.
{"Hats limit exceeded","Se ha excedido el límite de sombreros"}.
{"Hide","Ocultar"}.
{"Host unknown","Dominio desconocido"}.
{"Hostname invalid","Dominio no válido"}.
{"HTTP File Upload","Subir fichero por HTTP"}.
{"Idle connection","Conexión sin uso"}.
{"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 ya tienes {{ app_name }} instalado, te recomendamos que continúes la creación de tu cuenta usando esa aplicación, para ello pulsa el botón:"}.
{"If you don't have an XMPP client installed yet, here's a list of suitable clients for your platform.","Si no tienes ningún cliente XMPP instalado aún, aquí hay una lista de clientes disponibles para tu plataforma."}.
{"If you don't see the CAPTCHA image here, visit the web page.","Si no ves la imagen CAPTCHA aquí, visita la página web."}.
{"Import Directory","Importar directorio"}.
{"Import File","Importar fichero"}.
@@ -196,6 +244,7 @@
{"Incorrect value of 'action' in data form","Valor incorrecto de 'action' en el formulario de datos"}.
{"Incorrect value of 'path' in data form","Valor incorrecto de 'path' en el formulario de datos"}.
{"Installed Modules:","Módulos Instalados:"}.
{"Installed ok? Great! <strong>Click or tap the button below</strong> to accept your invite and continue with your account setup:","¿Se ha instalado bien? ¡Genial! <strong>Pulsa el siguiente botón</strong> para aceptar tu invitación y continuar con la preparación de tu cuenta:"}.
{"Install","Instalar"}.
{"Insufficient privilege","Privilegio insuficiente"}.
{"Internal server error","Error interno en el servidor"}.
@@ -203,6 +252,9 @@
{"Invalid node name","Nombre de nodo no válido"}.
{"Invalid 'previd' value","Valor de 'previd' no válido"}.
{"Invitations are not allowed in this conference","Las invitaciones no están permitidas en esta sala"}.
{"Invite expired","Invitación caducada"}.
{"Invite to {{ site_name }}","Invitación a {{ site_name }}"}.
{"Invite User","Invitar Usuario"}.
{"IP addresses","Direcciones IP"}.
{"is now known as","se cambia el nombre a"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","No está permitido enviar mensajes de error a la sala. Este participante (~s) ha enviado un mensaje de error (~s) y fue expulsado de la sala"}.
@@ -212,6 +264,7 @@
{"January","Enero"}.
{"JID normalization denied by service policy","Se ha denegado la normalización del JID por política del servicio"}.
{"JID normalization failed","Ha fallado la normalización del JID"}.
{"Join {{ site_name }} with {{ app_name }}","Únete a {{ site_name }} con {{ app_name }}"}.
{"Joined MIX channels of ~ts","Canales MIX unidos de ~ts"}.
{"Joined MIX channels:","Canales MIX unidos:"}.
{"joins the room","entra en la sala"}.
@@ -223,10 +276,13 @@
{"Last message","Último mensaje"}.
{"Last month","Último mes"}.
{"Last year","Último año"}.
{"Launch {{ app_name }} and sign in using your account credentials.","Lanza {{ app_name }} y entra en la cuenta usando tus credenciales."}.
{"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, y pulsa 'Sí' para añadir una nueva cuenta. Pulsa el botón '+' debajo de la lista de cuentas vacía e introduce tus credenciales."}.
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Los bits menos significativos del hash SHA-256 del texto deberían ser iguales a la etiqueta hexadecimal"}.
{"leaves the room","sale de la sala"}.
{"List of users with hats","Lista de usuarios con sombreros"}.
{"List of Hats","Lista de sombreros"}.
{"List users with hats","Listar usuarios con sombreros"}.
{"Log in via web","Entrar usando la web"}.
{"Logged Out","Desconectad@"}.
{"Logging","Histórico de mensajes"}.
{"Make participants list public","La lista de participantes es pública"}.
@@ -243,9 +299,11 @@
{"Max payload size in bytes","Máximo tamaño del contenido en bytes"}.
{"Maximum file size","Tamaño máximo de fichero"}.
{"Maximum Number of History Messages Returned by Room","Máximo número de mensajes del historial devueltos por la sala"}.
{"Maximum number of invites reached","Alcanzado el máximo número de invitaciones"}.
{"Maximum number of items to persist","Máximo número de elementos que persisten"}.
{"Maximum Number of Occupants","Número máximo de ocupantes"}.
{"May","Mayo"}.
{"Members are allowed to invite others","Los miembros puede invitar a otras personas"}.
{"Membership is required to enter this room","Necesitas ser miembro de esta sala para 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.","Memoriza tu contraseña, o apúntala en un papel en un lugar seguro. En XMPP no hay un método automatizado para recuperar la contraseña si la olvidas."}.
{"Mere Availability in XMPP (No Show Value)","Disponible en XMPP (sin valor de Mostrado)"}.
@@ -314,18 +372,21 @@
{"None","Ninguno"}.
{"Not allowed","No permitido"}.
{"Not Found","No encontrado"}.
{"NOT FOUND","NO ENCONTRADO"}.
{"Not subscribed","No suscrito"}.
{"Notify subscribers when items are removed from the node","Notificar subscriptores cuando los elementos se borran del nodo"}.
{"Notify subscribers when the node configuration changes","Notificar subscriptores cuando cambia la configuración del nodo"}.
{"Notify subscribers when the node is deleted","Notificar subscriptores cuando el nodo se borra"}.
{"November","Noviembre"}.
{"Number of active users","Número de usuarios activos"}.
{"Number of answers required","Número de respuestas necesarias"}.
{"Number of disabled users","Número de usuarios deshabilitados"}.
{"Number of idle users","Número de usuarios inactivos"}.
{"Number of occupants","Número de ocupantes"}.
{"Number of Offline Messages","Número de mensajes diferidos"}.
{"Number of online users","Número de usuarios conectados"}.
{"Number of registered users","Número de usuarios registrados"}.
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Número de segundos después de los cuales se purgarán elementos automáticamente, o `max` para no especificar un límite, más que el máximo impuesto por el servidor"}.
{"Occupants are allowed to invite others","Los ocupantes pueden invitar a otras personas"}.
{"Occupants are allowed to query others","Los ocupantes pueden enviar peticiones a otros"}.
{"Occupants May Change the Subject","Los ocupantes pueden cambiar el Asunto"}.
{"October","Octubre"}.
@@ -348,9 +409,11 @@
{"Only service administrators are allowed to send service messages","Solo los administradores del servicio tienen permiso para enviar mensajes de servicio"}.
{"Only those on a whitelist may associate leaf nodes with the collection","Solo quienes están en una lista blanca pueden asociar nodos hoja a la colección"}.
{"Only those on a whitelist may subscribe and retrieve items","Solo quienes están en una lista blanca pueden suscribirse y recibir elementos"}.
{"Open the app","Abrir la aplicación"}.
{"Organization Name","Nombre de la organización"}.
{"Organization Unit","Unidad de la organización"}.
{"Other Modules Available:","Otros módulos disponibles:"}.
{"Other software","Otros programas"}.
{"Outgoing s2s Connections","Conexiones S2S salientes"}.
{"Owner privileges required","Se requieren privilegios de propietario de la sala"}.
{"Packet relay is denied by service policy","Se ha denegado el reenvío del paquete por política del servicio"}.
@@ -385,6 +448,7 @@
{"PubSub subscriber request","Petición de subscriptor de PubSub"}.
{"Purge all items when the relevant publisher goes offline","Borra todos los elementos cuando el publicador relevante se desconecta"}.
{"Push record not found","No se encontró registro Push"}.
{"QR code icon","Icono de código QR"}.
{"Queries to the conference members are not allowed in this room","En esta sala no se permiten solicitudes a los miembros de la sala"}.
{"Query to another users is forbidden","Enviar solicitudes a otros usuarios está prohibido"}.
{"RAM and disc copy","Copia en RAM y disco"}.
@@ -395,8 +459,11 @@
{"Receive notification of new items only","Recibir notificaciones solo de nuevos elementos"}.
{"Receive notification of new nodes only","Recibir notificaciones solo de nuevos nodos"}.
{"Recipient is not in the conference room","El receptor no está en la sala de conferencia"}.
{"Re-Enable User","Rehabilitar usuario"}.
{"Register an XMPP account","Registrar una cuenta XMPP"}.
{"Register on {{ site_name }}","Registrar en {{ site_name }}"}.
{"Register","Registrar"}.
{"Registration error","Error en el registro"}.
{"Remote copy","Copia remota"}.
{"Remove a hat from a user","Quitarle un sombrero a un usuario"}.
{"Remove User","Eliminar usuario"}.
@@ -425,16 +492,21 @@
{"Roster size","Tamaño de la lista de contactos"}.
{"Running Nodes","Nodos funcionando"}.
{"~s invites you to the room ~s","~s te invita a la sala ~s"}.
{"Sad person holding empty box","Persona triste sujetando una caja vacía"}.
{"Saturday","Sábado"}.
{"Scan invite code","Escanear el código de invitación"}.
{"Scan with mobile device","Escanear (fotografiar) con el móvil"}.
{"Search from the date","Buscar desde la fecha"}.
{"Search Results for ","Buscar resultados por "}.
{"Search the text","Buscar el texto"}.
{"Search until the date","Buscar hasta la fecha"}.
{"Search users in ","Buscar usuarios en "}.
{"Select","Seleccionar"}.
{"Send announcement to all online users on all hosts","Enviar anuncio a todos los usuarios conectados en todos los dominios"}.
{"Send announcement to all online users","Enviar anuncio a todos los usuarios conectados"}.
{"Send announcement to all users on all hosts","Enviar anuncio a todos los usuarios en todos los dominios"}.
{"Send announcement to all users","Enviar anuncio a todos los usuarios"}.
{"Send this invite to your device","Enviar esta invitación a tu dispositivo"}.
{"September","Septiembre"}.
{"Server:","Servidor:"}.
{"Service list retrieval timed out","Ha caducado la obtención de la lista de servicio"}.
@@ -445,9 +517,13 @@
{"Show Integral Table","Mostrar Tabla Integral"}.
{"Show Occupants Join/Leave","Mostrar personas activas Entrar/Salir"}.
{"Show Ordinary Table","Mostrar Tabla Ordinaria"}.
{"Showing apps for <span class='platform-name'>your current platform</span> only. You may also <a href='#' id='show-all-clients-button'>view all apps.</a>","Mostrando aplicaciones para <span class='platform-name'>tu plataforma actual</span> nada más. También puedes <a href='#' id='show-all-clients-button'>mostrar todas las aplicaciones.</a>"}.
{"Show","Mostrar"}.
{"Shut Down Service","Detener el servicio"}.
{"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.","Algunos clientes XMPP pueden guardar tu contraseña en la máquina, pero solo deberías hacer esto en tu propia máquina personal, por razones de seguridad."}.
{"Sorry, it looks like this invite code has expired!","Lo siento ¡parece que este código de invitación ha caducado!"}.
{"Sorry, there was a problem registering your account.","Lo siento, ha habido un problema durante el registro de tu cuenta."}.
{"Sources Specs:","Especificaciones de Códigos Fuente:"}.
{"Specify the access model","Especifica el modelo de acceso"}.
{"Specify the event message type","Especifica el tipo del mensaje de evento"}.
@@ -455,12 +531,21 @@
{"Stanza id is not valid","El identificador de la estrofa no es válido"}.
{"Stanza ID","ID del paquete"}.
{"Statically specify a replyto of the node owner(s)","Especificar de forma estática un 'replyto' de dueño(s) del nodo"}.
{"Step 1: Download and install {{ app_name }}","Paso 1: Descarga e instala {{ app_name }}"}.
{"Step 1: Install {{ app_name }}","Paso 1: Instala {{ app_name }}"}.
{"Step 2: Activate your account","Paso 2: Activar tu cuenta"}.
{"Step 2: Connect {{ app_name }} to your new account","Paso 2: Conectar {{ app_name }} a tu nueva cuenta"}.
{"Stopped Nodes","Nodos detenidos"}.
{"Store binary backup:","Guardar copia de seguridad binaria:"}.
{"Store plain text backup:","Guardar copia de seguridad en texto plano:"}.
{"Stream management is already enabled","Ya está activada la administración de la conexión"}.
{"Stream management is not enabled","No está activada la administración de la conexión"}.
{"<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> es parte de XMPP, una red de mensajería segura y decentralizada. Para comenzar a charlar usando <strong>{{ app_name }}</strong>, primero créate una cuenta."}.
{"<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> es parte de XMPP, una red de mensajería segura y decentralizada. Para comenzar a charlar, primero has de registrar una cuenta."}.
{"<strong>No suitable software installed right now?</strong> You can also log in to your account through our online web chat!","<strong>¿No tienes instalada ninguna aplicación ahora mismo?</strong> También puedes entrar en tu cuenta ¡usando el chat web en linea!"}.
{"<strong>Tip:</strong> You can open this invite on your mobile device by scanning a barcode with your camera.","<strong>Truco:</strong> Puedes abrir esta invitación en tu móvil escaneando el código QR con la cámara de fotos."}.
{"Subject","Asunto"}.
{"Submit","Enviar"}.
{"Submitted","Enviado"}.
{"Subscriber Address","Dirección del subscriptor"}.
{"Subscribers may publish","Los suscriptores pueden publicar"}.
@@ -489,6 +574,9 @@
{"The JIDs of those to contact with questions","Los JIDs a quienes contactar con preguntas"}.
{"The JIDs of those with an affiliation of owner","Los JIDs de quienes tienen una afiliación de dueños"}.
{"The JIDs of those with an affiliation of publisher","Los JIDs de quienes tienen una afiliación de publicadores"}.
{"The list of all active users","La lista de todos los usuarios activos"}.
{"The list of all disabled users","La lista de todos los usuarios deshabilitados"}.
{"The list of all idle users","La lista de todos los usuarios inactivos"}.
{"The list of all online users","La lista de todos los usuarios conectados"}.
{"The list of all users","La lista de todos los usuarios"}.
{"The list of JIDs that may associate leaf nodes with a collection","La lista de JIDs que pueden asociar nodos hijo con una colección"}.
@@ -510,16 +598,20 @@
{"The presence states for which an entity wants to receive notifications","Los estados de presencia para los cuales una entidad quiere recibir notificaciones"}.
{"The query is only allowed from local users","La solicitud está permitida solo para usuarios locales"}.
{"The query must not contain <item/> elements","La solicitud no debe contener elementos <item/>"}.
{"The role","El rol"}.
{"The room subject can be modified by participants","El asunto de la sala puede ser modificado por los participantes"}.
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","La información semántica de los datos del nodo, normalmente es especificada por el espacio de los nombres de la carga útil (si existe)"}.
{"The sender of the last received message","El emisor del último mensaje recibido"}.
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","El paquete DEBE contener solo un elemento <active/>, un elemento <default/>, o un elemento <list/>"}.
{"The subscription identifier associated with the subscription request","El identificador de suscripción asociado con la petición de suscripción"}.
{"The token provided is either invalid or expired.","El token proporcionado no es válido o ha caducado."}.
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","La URL de una transformación XSL que puede aplicarse a payloads para generar un elemento de contenido del mensaje apropiado."}.
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","La URL de una transformación XSL que puede aplicarse al formato de payload para generar un resultado de Formulario de Datos válido, que el cliente pueda mostrar usando un mecanismo de dibujado genérico de Formulario de Datos"}.
{"There was an error changing the password: ","Hubo uno error al cambiar la contaseña: "}.
{"There was an error creating the account: ","Hubo uno error al crear la cuenta: "}.
{"There was an error deleting the account: ","Hubo un error borrando la cuenta: "}.
{"This button works only if you have the app installed already!","¡Este botón funciona solamente si ya tienes la aplicación instalada!"}.
{"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!","Esto es una invitación de <strong>{{ inviter }}</strong> para conectarte y charlar en la red XMPP. Si ya tienes un cliente XMPP instalado ¡simplemente pulsa el botón de aquí abajo!"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","No importa si usas mayúsculas: macbeth es lo mismo que MacBeth y 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.","Esta página te permite crear una cuenta XMPP este servidor XMPP. Tu JID (Jabber ID) será de la forma: nombredeusuario@servidor. Por favor lee detenidamente las instrucciones para rellenar correctamente los campos."}.
{"This page allows to unregister an XMPP account in this XMPP server.","Esta página te permite borrar tu cuenta XMPP en este servidor XMPP."}.
@@ -528,7 +620,9 @@
{"Thursday","Jueves"}.
{"Time delay","Retraso temporal"}.
{"Timed out waiting for stream resumption","Ha pasado demasiado tiempo esperando que la conexión se restablezca"}.
{"To get started, you need to install an app for your platform:","Para empezar, instala una aplicación en tu sistema:"}.
{"To register, visit ~s","Para registrarte, visita ~s"}.
{"To start chatting, you need to enter your new account credentials into your chosen XMPP software.","Para comenzar a charlar, introduce las credenciales de tu nueva cuenta en el programa XMPP que has elegido."}.
{"To ~ts","A ~ts"}.
{"Token TTL","Token TTL"}.
{"Too many active bytestreams","Demasiados bytestreams activos"}.
@@ -561,6 +655,7 @@
{"Updating the vCard is not supported by the vCard storage backend","La actualización de la vCard no es compatible con el vCard almacenamiento backend"}.
{"Upgrade","Actualizar"}.
{"URL for Archived Discussion Logs","URL del registro de discusiones archivadas"}.
{"Use a <em>QR code</em> scanner on your mobile device to scan the code below:","Usa un escaneador de <em>códigos QR</em> en tu móvil para escanear este código:"}.
{"User already exists","El usuario ya existe"}.
{"User JID","Jabber ID del usuario"}.
{"User (jid)","Usuario (jid)"}.
@@ -570,6 +665,9 @@
{"User session not found","Sesión de usuario no encontrada"}.
{"User session terminated","Sesión de usuario terminada"}.
{"User ~ts","Usuario ~ts"}.
{"Username invalid","Nombre de usuario no válido"}.
{"Username is reserved","El nombre de usuario está reservado"}.
{"Username","Nombre de usuario"}.
{"Username:","Nombre de usuario:"}.
{"Users are not allowed to register accounts so quickly","Los usuarios no tienen permitido crear cuentas con tanta rapidez"}.
{"Users Last Activity","Última actividad de los usuarios"}.
@@ -606,6 +704,7 @@
{"Wrong parameters in the web formulary","Parámetros incorrectos en el formulario web"}.
{"Wrong xmlns","XMLNS incorrecto"}.
{"XMPP Account Registration","Registro de Cuenta XMPP"}.
{"XMPP client for Haiku","Cliente XMPP para Haiku"}.
{"XMPP Domains","Dominios XMPP"}.
{"XMPP Show Value of Away","Valor 'Show' de XMPP: Ausente"}.
{"XMPP Show Value of Chat","Valor 'Show' de XMPP: Charlador"}.
@@ -615,8 +714,17 @@
{"You are being removed from the room because of a system shutdown","Estás siendo expulsado de la sala porque el sistema se va a detener"}.
{"You are not allowed to send private messages","No tienes permitido enviar mensajes privados"}.
{"You are not joined to the channel","No has entrado en el canal"}.
{"You can connect to {{ site_name }} using any XMPP-compatible software. If your preferred software is not listed above, you may still <a href=\"{{ registration_url }}\">register an account manually</a>.","Puedes conectarte a {{ site_name }} usando cualquier programa compatible con XMPP. Si tu programa preferido no está en esta lista, puedes <a href=\"{{ registration_url }}\">registrarte una cuenta manualmente</a>."}.
{"You can later change your password using an XMPP client.","Puedes cambiar tu contraseña después, usando un cliente XMPP."}.
{"You can now set up {{ app_name }} and connect it to your new account.","Ahora puedes configurar {{ app_name }} y conectarte a tu nueva cuenta."}.
{"You can start chatting right away with {{ app_name }}. Let's get started!","Puedes empezar ya a charlar usando {{ app_name }}. ¡Empecemos!"}.
{"You can transfer this invite to your mobile device by scanning a code with your camera.","Puedes transferir esta invitación a tu móvil si escaneas el código QR con la cámara de fotos."}.
{"You have been banned from this room","Has sido bloqueado en esta sala"}.
{"You have been invited to chat on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Te han invitado a charlar en {{ site_name }}, que forma parte de la red XMPP de mensajería segura y decentralizada."}.
{"You have been invited to chat on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Te han invitado a charlar en <strong>{{ site_name }}</strong>, que forma parte de la red XMPP de mensajería segura y decentralizada."}.
{"You have been invited to chat with <strong>{{ inviter }}</strong> on {{ site_name }}, part of the XMPP secure and decentralized messaging network.","Has recibido una invitación para charlar con <strong>{{ inviter }}</strong> en {{ site_name }}, que forma parte de la red XMPP de mensajería segura y decentralizada."}.
{"You have been invited to chat with <strong>{{ inviter }}</strong> on <strong>{{ site_name }}</strong>, part of the XMPP secure and decentralized messaging network.","Has recibido una invitación para charlar con <strong>{{ inviter }}</strong> en <strong>{{ site_name }}</strong>, que forma parte de la red XMPP de mensajería segura y decentralizada."}.
{"You have created an account on <strong>{{ site_name }}</strong>.","Has registrado tu cuenta en <strong>{{ site_name }}</strong>."}.
{"You have joined too many conferences","Has entrado en demasiadas salas de conferencia"}.
{"You must fill in field \"Nickname\" in the form","Debes rellenar el campo \"Apodo\" en el formulario"}.
{"You need a client that supports x:data and CAPTCHA to register","Necesitas un cliente con soporte de x:data y CAPTCHA para registrarte"}.
@@ -624,6 +732,7 @@
{"You need an x:data capable client to search","Necesitas un cliente con soporte de x:data para poder buscar"}.
{"Your active privacy list has denied the routing of this stanza.","Tu lista de privacidad activa ha denegado el envío de este paquete."}.
{"Your contact offline message queue is full. The message has been discarded.","Tu cola de mensajes diferidos de contactos está llena. El mensaje se ha descartado."}.
{"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.","Tu contraseña se guardará cifrada en el servidor, y no será accesible una vez que cierres esta página. Mantenla segura y no la compartas con nadie más."}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Tu petición de suscripción y/o mensajes a ~s ha sido bloqueado. Para desbloquear tu petición de suscripción visita ~s"}.
{"Your XMPP account was successfully registered.","Tu cuenta XMPP se ha registrado correctamente."}.
{"Your XMPP account was successfully unregistered.","Tu cuenta XMPP se ha borrado correctamente."}.
+38 -6
View File
@@ -45,7 +45,10 @@
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Nimporte qui avec un abonnement de présence peut sabonner et récupérer les items"}.
{"Anyone with Voice","Nimporte qui avec Voice"}.
{"Anyone","Nimporte qui"}.
{"API Commands","Commandes d'API"}.
{"April","Avril"}.
{"Arguments","Paramètres"}.
{"Assign a hat to a user","Attribuer un badge à un utilisateur"}.
{"Attribute 'channel' is required for this request","Lattribut « channel » est requis pour la requête"}.
{"Attribute 'id' is mandatory for MIX messages","Lattribut « id » est obligatoire pour les messages MIX"}.
{"Attribute 'jid' is not allowed here","Lattribut « jid » nest pas autorisé ici"}.
@@ -71,6 +74,7 @@
{"Changing role/affiliation is not allowed","La modification role/affiliation n'est pas autorisée"}.
{"Channel already exists","Ce canal existe déjà"}.
{"Channel does not exist","Le canal nexiste pas"}.
{"Channel JID","JID du canal"}.
{"Channels","Canaux"}.
{"Characters not allowed:","Caractères non autorisés :"}.
{"Chatroom configuration modified","Configuration du salon modifiée"}.
@@ -84,12 +88,15 @@
{"Choose whether to approve this entity's subscription.","Choisissez d'approuver ou non l'abonnement de cette entité."}.
{"City","Ville"}.
{"Client acknowledged more stanzas than sent by server","Le client accuse réception de plus de strophes que ce qui est envoyé par le serveur"}.
{"Clustering","Clustering"}.
{"Commands","Commandes"}.
{"Conference room does not exist","Le salon de discussion n'existe pas"}.
{"Configuration of room ~s","Configuration pour le salon ~s"}.
{"Configuration","Configuration"}.
{"Contact Addresses (normally, room owner or owners)","Adresses de contact (normalement les administrateurs du salon)"}.
{"Contacts","Contacts"}.
{"Country","Pays"}.
{"Create a Hat","Créer un badge"}.
{"Current Discussion Topic","Sujet de discussion courant"}.
{"Database failure","Échec sur la base de données"}.
{"Database Tables Configuration at ","Configuration des tables de base de données sur "}.
@@ -101,6 +108,8 @@
{"Delete User","Supprimer l'utilisateur"}.
{"Deliver event notifications","Envoyer les notifications d'événement"}.
{"Deliver payloads with event notifications","Inclure le contenu du message avec la notification"}.
{"Destroy a Hat","Détruire un badge"}.
{"Disable User","Désactiver l'utilisateur"}.
{"Disc only copy","Copie sur disque uniquement"}.
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Ne révélez votre mot de passe à personne, pas même aux administrateurs du serveur XMPP."}.
{"Dump Backup to Text File at ","Enregistrer la sauvegarde dans un fichier texte sur "}.
@@ -115,9 +124,10 @@
{"ejabberd SOCKS5 Bytestreams module","Module SOCKS5 Bytestreams per ejabberd"}.
{"ejabberd vCard module","Module vCard ejabberd"}.
{"ejabberd Web Admin","Console Web d'administration de ejabberd"}.
{"ejabberd","ejabberd"}.
{"ejabberd","Administration d'ejabberd"}.
{"Email Address","Adresse courriel"}.
{"Email","Courriel"}.
{"Enable hats","Activer les badges"}.
{"Enable logging","Activer l'archivage"}.
{"Enable message archiving","Activer l'archivage de messages"}.
{"Enabling push without 'node' attribute is not supported","L'activation push ne peut se faire sans l'attribut 'node'"}.
@@ -150,11 +160,19 @@
{"Full List of Room Admins","Liste complète des administrateurs des salons"}.
{"Full List of Room Owners","Liste complète des propriétaires des salons"}.
{"Full Name","Nom complet"}.
{"Get List of Active Users","Récupérer les utilisateurs actifs"}.
{"Get List of Disabled Users","Récupérer les utilisateurs désactivés"}.
{"Get List of Idle Users","Récupérer les utilisateurs inactifs"}.
{"Get List of Online Users","Récupérer les utilisateurs en ligne"}.
{"Get List of Registered Users","Récupérer les utilisateurs enregistrés"}.
{"Get Number of Active Users","Récupérer le nombre d'utilisateurs actifs"}.
{"Get Number of Disabled Users","Récupérer le nombre d'utilisateurs désactivés"}.
{"Get Number of Idle Users","Récupérer le nombre d'utilisateurs inactifs"}.
{"Get Number of Online Users","Récupérer le nombre d'utilisateurs en ligne"}.
{"Get Number of Registered Users","Récupérer le nombre d'utilisateurs enregistrés"}.
{"Get Pending","En attente"}.
{"Get User Last Login Time","Récupérer la dernière date de connexion de l'utilisateur"}.
{"Get User Roster","Récupérer les contacts de l'utilisateur"}.
{"Get User Statistics","Récupérer les statistiques de l'utilisateur"}.
{"Given Name","Nom"}.
{"Grant voice to this person?","Accorder le droit de parole à cet utilisateur ?"}.
@@ -163,6 +181,8 @@
{"has been kicked because of an affiliation change","a été éjecté à cause d'un changement d'autorisation"}.
{"has been kicked because the room has been changed to members-only","a été éjecté car la salle est désormais réservée aux membres"}.
{"has been kicked","a été expulsé"}.
{"Hash computed from the list of hats available in a room","Hash calculé à partir de la liste des badges disponibles dans le salon"}.
{"Hat title","Titre du badge"}.
{"Hats limit exceeded","La limite a été dépassée"}.
{"Host unknown","Serveur inconnu"}.
{"HTTP File Upload","Téléversement de fichier HTTP"}.
@@ -184,6 +204,7 @@
{"Incorrect value of 'action' attribute","Valeur de l'attribut 'action' incorrecte"}.
{"Incorrect value of 'action' in data form","Valeur de l'attribut 'action' incorrecte dans le formulaire"}.
{"Incorrect value of 'path' in data form","Valeur de l'attribut 'path' incorrecte dans le formulaire"}.
{"Installed Modules:","Modules installés :"}.
{"Install","Installer"}.
{"Insufficient privilege","Droits insuffisants"}.
{"Internal server error","Erreur interne du serveur"}.
@@ -198,6 +219,8 @@
{"It is not allowed to send private messages to the conference","Il n'est pas permis d'envoyer des messages privés à la conférence"}.
{"Jabber ID","Jabber ID"}.
{"January","Janvier"}.
{"Joined MIX channels of ~ts","Canaux MIX rejoints par ~ts"}.
{"Joined MIX channels:","Canaux MIX rejoints :"}.
{"joins the room","rejoint le salon"}.
{"July","Juillet"}.
{"June","Juin"}.
@@ -208,6 +231,7 @@
{"Last month","Dernier mois"}.
{"Last year","Dernière année"}.
{"leaves the room","quitte le salon"}.
{"List of Hats","Liste des badges"}.
{"Make participants list public","Rendre la liste des participants publique"}.
{"Make room CAPTCHA protected","Protéger le salon par un CAPTCHA"}.
{"Make room members-only","Réserver le salon aux membres uniquement"}.
@@ -300,7 +324,7 @@
{"Number of Offline Messages","Nombre de messages hors ligne"}.
{"Number of online users","Nombre d'utilisateurs en ligne"}.
{"Number of registered users","Nombre d'utilisateurs enregistrés"}.
{"Occupants are allowed to invite others","Les occupants sont autorisés à inviter dautres personnes"}.
{"Occupants are allowed to query others","Les occupants peuvent consulter les informations des autres"}.
{"Occupants May Change the Subject","Les occupants peuvent changer le sujet"}.
{"October","Octobre"}.
{"OK","OK"}.
@@ -313,6 +337,7 @@
{"Only members may query archives of this room","Seuls les membres peuvent accéder aux archives de ce salon"}.
{"Only moderators and participants are allowed to change the subject in this room","Seuls les modérateurs et les participants peuvent changer le sujet dans ce salon"}.
{"Only moderators are allowed to change the subject in this room","Seuls les modérateurs peuvent changer le sujet dans ce salon"}.
{"Only moderators are allowed to retract messages","Seuls les modérateurs peuvent rétracter des messages"}.
{"Only moderators can approve voice requests","Seuls les modérateurs peuvent accépter les requêtes voix"}.
{"Only occupants are allowed to send messages to the conference","Seuls les occupants peuvent envoyer des messages à la conférence"}.
{"Only occupants are allowed to send queries to the conference","Seuls les occupants sont autorisés à envoyer des requêtes à la conférence"}.
@@ -320,8 +345,10 @@
{"Only service administrators are allowed to send service messages","Seuls les administrateurs du service sont autoriser à envoyer des messages de service"}.
{"Organization Name","Nom de l'organisation"}.
{"Organization Unit","Unité de l'organisation"}.
{"Other Modules Available:","Autres modules disponibles :"}.
{"Outgoing s2s Connections","Connexions s2s sortantes"}.
{"Owner privileges required","Les droits de propriétaire sont nécessaires"}.
{"Participant ID","ID du participant"}.
{"Participant","Participant"}.
{"Password Verification","Vérification du mot de passe"}.
{"Password Verification:","Vérification du mot de passe :"}.
@@ -382,7 +409,7 @@
{"Roster groups allowed to subscribe","Groupes de liste de contact autorisés à s'abonner"}.
{"Roster size","Taille de la liste de contacts"}.
{"Running Nodes","Nœuds actifs"}.
{"~s invites you to the room ~s","~s vous invite dans la salle de discussion ~s"}.
{"~s invites you to the room ~s","~s vous a invité dans le salon de discussion ~s"}.
{"Saturday","Samedi"}.
{"Search Results for ","Résultats de recherche pour "}.
{"Search the text","Recherche le texte"}.
@@ -401,7 +428,7 @@
{"Show Integral Table","Montrer la table intégralement"}.
{"Show Ordinary Table","Montrer la table ordinaire"}.
{"Shut Down Service","Arrêter le service"}.
{"SOCKS5 Bytestreams","SOCKS5 Bytestreams"}.
{"SOCKS5 Bytestreams","Transferts SOCKS5"}.
{"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Certains clients XMPP peuvent stocker votre mot de passe sur votre ordinateur. N'utilisez cette fonctionnalité que si vous avez confiance en la sécurité de votre ordinateur."}.
{"Specify the access model","Définir le modèle d'accès"}.
{"Specify the event message type","Définir le type de message d'événement"}.
@@ -412,6 +439,7 @@
{"Store plain text backup:","Sauvegarde texte :"}.
{"Stream management is already enabled","La gestion des flux est déjà activée"}.
{"Subject","Sujet"}.
{"Submit","Soumettre"}.
{"Submitted","Soumis"}.
{"Subscriber Address","Adresse de l'abonné"}.
{"Subscribers may publish","Les souscripteurs peuvent publier"}.
@@ -452,7 +480,7 @@
{"The room subject can be modified by participants","Le sujet du salon peut être modifié par les participants"}.
{"The sender of the last received message","Lexpéditeur du dernier message reçu"}.
{"The subscription identifier associated with the subscription request","Lidentificateur dabonnement associé à la demande dabonnement"}.
{"There was an error changing the password: ","Une erreur sest produite lors de la modification du mot de passe : "}.
{"There was an error changing the password: ","Une erreur est survenue lors du changement de mot de passe : "}.
{"There was an error creating the account: ","Il y a eu une erreur en créant le compte : "}.
{"There was an error deleting the account: ","Il y a eu une erreur en effaçant le compte : "}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","C'est insensible à la casse : macbeth est identique à MacBeth et Macbeth."}.
@@ -488,6 +516,7 @@
{"Unsupported version","Version non prise en charge"}.
{"Update message of the day (don't send)","Mise à jour du message du jour (pas d'envoi)"}.
{"Update message of the day on all hosts (don't send)","Mettre à jour le message du jour sur tous les domaines (ne pas envoyer)"}.
{"Update Specs","Mise à jour des specs"}.
{"Upgrade","Mise à niveau"}.
{"URL for Archived Discussion Logs","URL des journaux de discussion archivés"}.
{"User already exists","L'utilisateur existe déjà"}.
@@ -509,6 +538,7 @@
{"Value of '~s' should be integer","La valeur de '~s' doit être un entier"}.
{"Value 'set' of 'type' attribute is not allowed","La valeur de l'attribut 'type' ne peut être 'set'"}.
{"vCard User Search","Recherche dans l'annnuaire"}.
{"View joined MIX channels","Voir les canaux MIX rejoints"}.
{"Virtual Hosts","Serveurs virtuels"}.
{"Visitors are not allowed to change their nicknames in this room","Les visiteurs ne sont pas autorisés à changer de pseudo dans ce salon"}.
{"Visitors are not allowed to send messages to all occupants","Les visiteurs ne sont pas autorisés à envoyer des messages à tout les occupants"}.
@@ -522,11 +552,13 @@
{"Whether owners or publisher should receive replies to items","Quand les propriétaires ou annonceurs doivent revoir des réponses à leurs éléments"}.
{"Whether to allow subscriptions","Autoriser ou non les abonnements"}.
{"Whether to notify owners about new subscribers and unsubscribes","Quand notifier le propriétaire à propos des nouvelles souscriptions et désinscriptions"}.
{"Who can send private messages","Qui peut envoyer des messages privés"}.
{"Wrong parameters in the web formulary","Paramètres erronés dans le formulaire Web"}.
{"Wrong xmlns","Xmlns incorrect"}.
{"XMPP Account Registration","Enregistrement de compte XMPP"}.
{"XMPP Domains","Domaines XMPP"}.
{"You are being removed from the room because of a system shutdown","Vous avez été éjecté du salon de discussion en raison de l'arrêt du système"}.
{"You are not allowed to send private messages","Vous n'êtes pas autorisé à envoyer des messages privés"}.
{"You are not joined to the channel","Vous n'avez pas rejoint ce canal"}.
{"You can later change your password using an XMPP client.","Vous pouvez modifier ultérieurement votre mot de passe à laide dun client XMPP."}.
{"You have been banned from this room","Vous avez été exclus de ce salon"}.
@@ -539,5 +571,5 @@
{"Your contact offline message queue is full. The message has been discarded.","La file d'attente de message de votre contact est pleine. Votre message a été détruit."}.
{"Your subscription request and/or messages to ~s have been blocked. To unblock your subscription request, visit ~s","Vos messages pour ~s sont bloqués. Pour les débloquer, veuillez visiter ~s"}.
{"Your XMPP account was successfully registered.","Votre compte XMPP a été enregistré avec succès."}.
{"Your XMPP account was successfully unregistered.","Votre compte XMPP a été désinscrit avec succès."}.
{"Your XMPP account was successfully unregistered.","Votre compte XMPP a été supprimé avec succès."}.
{"You're not allowed to create nodes","Vous n'êtes pas autorisé à créer des nœuds"}.
+1
View File
@@ -311,6 +311,7 @@
{"Store binary backup:","Gardar copia de seguridade binaria:"}.
{"Store plain text backup:","Gardar copia de seguridade en texto plano:"}.
{"Subject","Asunto"}.
{"Submit","Enviar"}.
{"Submitted","Enviado"}.
{"Subscriber Address","Dirección do subscriptor"}.
{"Subscriptions are not allowed","Non se permiten subscricións"}.
+1
View File
@@ -286,6 +286,7 @@
{"Store plain text backup:","אחסן גיבוי טקסט גלוי (plain text):"}.
{"Subject","נושא"}.
{"Submitted","נשלח"}.
{"Submit","שלח"}.
{"Subscriber Address","כתובת מנוי"}.
{"Subscriptions are not allowed","הרשמות אינן מורשות"}.
{"Sunday","יום ראשון"}.
+2 -1
View File
@@ -325,6 +325,7 @@
{"Stream management is already enabled","A folyamkezelés már engedélyezve van"}.
{"Stream management is not enabled","A folyamkezelés nincs engedélyezve"}.
{"Subject","Tárgy"}.
{"Submit","Elküldés"}.
{"Submitted","Elküldve"}.
{"Subscriptions are not allowed","Feliratkozások nem engedélyezettek"}.
{"Sunday","vasárnap"}.
@@ -358,7 +359,7 @@
{"Too many child elements","Túl sok gyermekelem"}.
{"Too many <item/> elements","Túl sok <item/> elem"}.
{"Too many <list/> elements","Túl sok <list/> elem"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Túl sok (~p) sikertelen hitelesítés erről az IP-címről (~ts) A cím ~ts-kor lesz feloldva UTC szerint"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Túl sok (~p) sikertelen hitelesítés erről az IP-címről (~s) A cím ~s-kor lesz feloldva UTC szerint"}.
{"Too many receiver fields were specified","Túl sok fogadómező lett meghatározva"}.
{"Too many unacked stanzas","Túl sok nyugtázatlan stanza"}.
{"Too many users in this conference","Túl sok felhasználó ebben a konferenciában"}.
+1
View File
@@ -338,6 +338,7 @@
{"Stream management is already enabled","Manajemen stream sudah diaktifkan"}.
{"Stream management is not enabled","Manajemen stream tidak diaktifkan"}.
{"Subject","Subyek"}.
{"Submit","Serahkan"}.
{"Submitted","Ulangi masukan"}.
{"Subscriber Address","Alamat Pertemanan"}.
{"Subscribers may publish","Pelanggan dapat mempublikasikan"}.

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