call_end

    • chevron_right

      Prosody 13.0.2 released

      pubsub.prosody.im / blog • 29 May • 2 minutes • 3 visibility

    We are pleased to announce a new minor release from our stable branch. This update addresses various issues that have been noticed since the previous release, as well as a few improvements, including some important fixes for invites. Some log messages and prosodyctl commands have been improved as well. A summary of changes in this release: Fixes and improvements mod_storage_internal: Fix queries with only start returning extra items mod_invites_register: Stricter validation of registration events Minor changes MUC: Ensure allow MUC PM setting has valid value (fixes #1933: PM does not work on new MUCs) mod_storage_sql: Delay showing SQL library error until attempted load mod_storage_sql: Handle failure to deploy new UNIQUE index mod_storage_sql: Add shell command to create tables and indices (again) mod_s2s: Fix log to use formatting instead of concatenation (fixes #1461: Logging issues uncovered by mod_log_json) modulemanager, util.

    We are pleased to announce a new minor release from our stable branch.

    This update addresses various issues that have been noticed since the previous release, as well as a few improvements, including some important fixes for invites. Some log messages and prosodyctl commands have been improved as well.

    A summary of changes in this release:

    Fixes and improvements

    • mod_storage_internal: Fix queries with only start returning extra items
    • mod_invites_register: Stricter validation of registration events

    Minor changes

    • MUC: Ensure allow MUC PM setting has valid value (fixes #1933: PM does not work on new MUCs)
    • mod_storage_sql: Delay showing SQL library error until attempted load
    • mod_storage_sql: Handle failure to deploy new UNIQUE index
    • mod_storage_sql: Add shell command to create tables and indices (again)
    • mod_s2s: Fix log to use formatting instead of concatenation (fixes #1461: Logging issues uncovered by mod_log_json)
    • modulemanager, util.pluginloader: Improve error message when load fails but some candidates were filtered
    • prosodyctl check config: add recommendation to switch from admin_telnet to shell
    • mod_storage_sql: Retrieve all indices to see if the new one exists
    • prosodyctl check config: List modules which Prosody cannot successfully load
    • net.http.files: Fix issue with caching
    • util.jsonschema: Fix handling of false as schema
    • mod_invites: Consider password reset a distinct type wrt invite page
    • configmanager: Emit config warning when referencing non-existent value
    • mod_admin_shell: Add role:list() and role:show() commands
    • MUC: Fix nickname registration form error handling (#1930)
    • MUC: Fix Error when join stanza sent without resource (#1934)
    • MUC: Factor out identification of join stanza
    • mod_invites_register: Don’t restrict username for roster invites (thanks lissine)
    • mod_admin_shell: Fix matching logic in s2s:close (Thanks Menel)
    • mod_authz_internal: Improve error message when invalid role specified
    • mod_http_file_share: Add media-src ‘self’ to Content-Security-Policy header
    • mod_admin_shell: Visual tweaks to the output of debug:cert_index()
    • mod_http: Log problems parsing IP addresses in X-Forwarded-For (Thanks Boris)
    • mod_http: Fix IP address normalization (Thanks Boris)
    • util.prosodyctl.check: Improve reporting of DNS lookup problems

    Download

    As usual, download instructions for many platforms can be found on our download page

    If you have any questions, comments or other issues with this release, let us know!

    • wifi_tethering open_in_new

      This post is public

      blog.prosody.im /prosody-13.0.2-released/

    • chevron_right

      Prosody 13.0.1 released

      pubsub.prosody.im / blog • 3 April • 2 minutes

    We are pleased to announce a new minor release from our stable branch. As is the tradition with software, here is our first patch release following shortly behind our major 13.0.0 release announced a few weeks ago. It fixes some important bugs that were discovered after the release. Many thanks to everyone who reported issues and helped with testing the fixes for this release. We appreciate it! For those of you on 0.

    We are pleased to announce a new minor release from our stable branch.

    As is the tradition with software, here is our first patch release following shortly behind our major 13.0.0 release announced a few weeks ago. It fixes some important bugs that were discovered after the release.

    Many thanks to everyone who reported issues and helped with testing the fixes for this release. We appreciate it!

    For those of you on 0.12.x who haven’t upgraded yet, skip 13.0.0 and jump straight to 13.0.1 if you can. It will be a smoother upgrade.

    A summary of changes in this release:

    Fixes and improvements

    • mod_admin_shell: Add debug:cert_index() command to aid debugging of automatic certificate selection
    • mod_tls: Enable Prosody’s certificate checking for incoming s2s connections (fixes #1916: Impossible to override certificate verification policy in 13.0)
    • portmanager: Multiple fixes to use correct certificates for direct TLS ports (fixes #1915)
    • net.server_epoll: Use correct connection timeout when initiating Direct TLS
    • mod_roster: Fix shell commands when a component is involved (fixes #1908: error in prosodyctl shell roster attempting to subscribe a component)
    • mod_http_file_share: Explicitly reject all unsupported ranges
    • mod_http_file_share: Fix off by one in Range response
    • mod_admin_shell, prosodyctl shell: Report command failure when no password entered (fixes #1907: prosodyctl adduser: unexpected account creation on password mismatch)

    Minor changes

    • mod_storage_sql: Drop legacy index without confirmation to ease upgrades
    • util.adminstream: Fix traceback on double-close (fixes #1913: Prosody fails to completely stop while shell watch:log is active)
    • certmanager: Improve logging for all cases where certs are skipped
    • mod_tls: Collect full certificate chain validation information
    • mod_s2s: Fix error detection with newer versions of OpenSSL
    • portmanager: Add debug log message to state which certificate we end up using
    • prosodyctl check certs: Use correct hostname in warning message about HTTPS
    • prosodyctl check: Be more robust against invalid disco_items, and show warning
    • spec/tls: Add TLS/certificate integration tests
    • mod_http_file_share: Improve error reporting by using util.error more
    • core.storagemanager: Fix tests by removing an assert that upset luarocks
    • core.usermanager: Fix COMPAT layer for legacy is_admin() function
    • certmanager: Remove obsolete and verbose index log (replaced by shell command)
    • doap: Add XEP-0333, XEP-0334, XEP-0156 and mod_http_altconnect

    Download

    As usual, download instructions for many platforms can be found on our download page

    If you have any questions, comments or other issues with this release, let us know!

    • wifi_tethering open_in_new

      This post is public

      blog.prosody.im /prosody-13.0.1-released/

    • chevron_right

      Prosody 13.0.0 released!

      pubsub.prosody.im / blog • 17 March • 7 minutes

    Welcome to a new major release of the Prosody XMPP server! While the 0.12 branch has served us well for a while now, this release brings a bunch of new features we’ve been busy polishing. If you’re unfamiliar with Prosody, it’s an open-source project that implements XMPP, an open standard protocol for online communication. Prosody is widely used to power everything from small self-hosted messaging servers to worldwide real-time applications such as Jitsi Meet.

    Welcome to a new major release of the Prosody XMPP server! While the 0.12 branch has served us well for a while now, this release brings a bunch of new features we’ve been busy polishing.

    If you’re unfamiliar with Prosody, it’s an open-source project that implements XMPP, an open standard protocol for online communication. Prosody is widely used to power everything from small self-hosted messaging servers to worldwide real-time applications such as Jitsi Meet. It’s part of a large ecosystem of compatible software that you can use for realtime online communication.

    Before we begin…

    The first thing anyone who has been following the project for a while will notice about this release is the version number.

    Long adherents of the cult of 0ver, we finally decided it was time to break away. While, as Shakespeare wrote, “That which we call a rose, by any other name would smell as sweet”, such is true of version numbers. Prosody has been stable and used in production deployments for many years, however the ‘0.x’ version number occasionally misled people to believe otherwise. Apart from shifting the middle component leftwards, nothing has changed.

    If you’re really curious, you can read full details in our versioning and support policy.

    Our version numbers have also been in step with Debian’s for several versions now. Could this become a thing? Maybe!

    Overview of changes

    This release brings a wide range of improvements that make Prosody more secure, performant, and easier to manage than ever before. Let’s review the most significant changes that administrators and users can look forward to across a range of different topics.

    Security and authentication

    Security takes centre stage in this release with several notable improvements. Building on DNSSEC, the addition of full DANE support for server-to-server connections strengthens the trust between federating XMPP servers.

    We’ve enhanced our support for channel binding, which is now compatible with TLS 1.3, and we’ve added support for XEP-0440 which helps clients know which channel binding methods the server supports. Channel binding protects your connection from certain machine-in-the-middle attacks, even if the server’s TLS certificate is compromised.

    Account management

    Administrators now have more granular control over user accounts with the ability to disable and enable them as needed. This can be particularly useful for public servers, where disabling an account can act as a reversible alternative to deletion.

    In fact, we now have the ability to set a grace period for deleted accounts to allow restoring an account (within the grace period) in case of accidental deletion.

    Roles and permissions

    A new role and permissions framework provides more flexible access control. Prosody supplies several built-in roles:

    • prosody:operator - for operators of the whole Prosody instance. By default, accounts with this role have full access, including to operations that affect the whole server.
    • prosody:admin - the usual role for admins of a specific virtual host (or component). Accounts with this role have permission to manage user accounts and various other aspects of the domain.
    • prosody:member - this role is for “normal” user accounts, but specifically those ones which are trusted to some extent by the administrators. Typically accounts that are created through an invitation or through manual provisioning by the admin have this role.
    • prosody:registered - this role is also for general user accounts, but is used by default for accounts which registered themselves, e.g. if the server has in-band registration enabled.
    • prosody:guest - finally, the “guest” role is used for temporary/anonymous accounts and is also the default for remote JIDs interacting with the server.

    For more details about how to use these roles, customize permissions, and more, read our new roles and permissions documentation. You will also find the link there for the development documentation, so module developers can make use of the new system.

    Shell commands

    Since the earliest releases, the prosodyctl command has been the admin’s primary way of managing and interacting with Prosody. In 0.12 we introduced the prosodyctl shell interface to send administrative commands to Prosody at runtime via a local connection. It has been a big success, and this release significantly extends its capabilities.

    • prosodyctl adduser/passwd/deluser commands now use the admin connection to create users, which improves compatibility with various storage and authentication plugins. It also ensures Prosody can instantly respond to changes, such as immediately disconnecting users when their account is deleted.
    • Pubsub management commands have been added, to create/configure/delete nodes and items on pubsub and PEP services without needing an XMPP client.
    • One of our own favourites as Prosody developers is the new prosodyctl shell watch log command, which lets you stream debug logs in real-time without needing to store them on the filesystem.
    • Similarly, there is now prosodyctl shell watch stanzas which lets you monitor stanzas to/from arbitrary JIDs, which is incredibly helpful for developers trying to diagnose various client issues.
    • Server-wide announcements can now be sent via the shell, optionally limiting the recipients by online status or role.
    • MUC has gained a few new commands for interacting with MUC rooms.

    Improved Multi-User Chat (MUC) Management

    The MUC system has received a significant overhaul focusing on security and administrative control. By default, room creation is now restricted to local users, providing better control over who can create persistent and public rooms.

    Server administrators get new shell commands to inspect room occupants and affiliations, making day-to-day operations more straightforward.

    One notable change is that component admins are no longer automatically owners. This can be reverted to the old behaviour with component_admins_as_room_owners = true in the config, but this has known incompatibilities with some clients. Instead, admins can use the shell or ad-hoc commands to gain ownership of rooms when it’s necessary.

    Better Network Performance

    Network connectivity sees substantial improvements with the implementation of RFC 8305’s “Happy Eyeballs” algorithm, which enhances IPv4/IPv6 dual-stack performance and increases the chance of a successful connection.

    Support for TCP Fast Open and deferred accept capabilities (in the server_epoll backend) can potentially reduce connection latency.

    The server now also better handles SRV record selection by respecting the ‘weight’ parameter, leading to more efficient connection distribution.

    Storage and Performance Improvements

    Under the hood, Prosody now offers better query performance with its internal archive stores by generating indexes.

    SQLite users now have the option to use LuaSQLite3 instead of LuaDBI, potentially offering better performance and easier deployment.

    We’ve also added compatibility with SQLCipher, a fork of SQLite that adds support for encrypted databases.

    Configuration Improvements

    The configuration system has been modernized to support referencing and appending to previously set options, making complex configurations more manageable.

    While direct Lua API usage in the config file is now deprecated, it remains accessible through the new Lua.* namespace for those who need it.

    Also new in this release is the ability to reference credentials or other secrets in the configuration file, without storing them in the file itself. It is compatible with the credentials mechanisms supported by systemd, podman and more.

    Developer/API changes

    The development experience has always been an important part of our project - we set out to make an XMPP server that was very easy to extend and customize. Our developer API has improved with every release. We’ve even had first-time coders write Prosody plugins!

    There are too many improvements to list here, but some notable ones:

    • Storage access from modules has been simplified with a new ‘keyval+’ store type, which combines the old ‘keyval’ (default) and ‘map’ stores into a single interface. Before this change, many modules had to open the store twice to utilize the two APIs.
    • Any module can now replace custom permission handling with Prosody’s own permission framework via the simple module:may() API call.
    • Providing new commands for prosodyctl shell is now much easier for module developers.

    Backwards compatibility is of course generally preserved, although is_admin() has been deprecated in favour of module:may(). Modules that want to remain compatible with older versions can use mod_compat_roles to enable (limited) permission functionality.

    Important Notes for Upgrading

    A few breaking changes are worth noting:

    • Lua 5.1 support has been removed (this also breaks compatibility with LuaJIT, which is based primarily on Lua 5.1).
    • Some MUC default behaviors have changed regarding room creation and admin permissions (see above).

    Conclusion

    We’re very excited about this release, which represents a significant step forward for Prosody, and contains improvements for virtually every aspect of the server. From enhanced security to better performance and more flexible administration tools, there has never been a better time to deploy Prosody and take control of your realtime communications.

    As always, if you have any problems or questions with Prosody or the new release, drop by our community chat!

    • wifi_tethering open_in_new

      This post is public

      blog.prosody.im /prosody-13.0.0-released/

    • chevron_right

      Prosody 0.12.5 released

      pubsub.prosody.im / blog • 31 December • 2 minutes

    We are pleased to announce a new minor release from our stable branch. Hope everyone has had a good 2024, and you’re looking forward to a better 2025! We’re ending this year with a bugfix release for our stable 0.12 branch. This brings some general polish and a collection of fixes for various small issues people have reported in the past months. A notable behaviour change in this release is that Prosody will no longer send delivery errors to people you have blocked.

    We are pleased to announce a new minor release from our stable branch.

    Hope everyone has had a good 2024, and you’re looking forward to a better 2025!

    We’re ending this year with a bugfix release for our stable 0.12 branch. This brings some general polish and a collection of fixes for various small issues people have reported in the past months.

    A notable behaviour change in this release is that Prosody will no longer send delivery errors to people you have blocked. Instead it will now just silently discard messages from the blocked JID, to avoid informing them that they have been blocked - which tends to be the preference of people we have spoken with, as well as the behaviour of many other online platforms. Obviously there are trade-offs here, so the behaviour is now configurable (see the mod_blocklist documentation).

    This will be among the last releases from the 0.12 branch, as we are preparing a new major release with lots of new features. Stay tuned, and happy new year!

    A summary of changes in this release:

    Fixes and improvements

    • mod_blocklist: Drop blocked messages without error, option to restore compliant behavior

    Minor changes

    • core.certmanager: Validate that ‘tls_profile’ is one of the valid values
    • net.http: Throw error if missing TLS context for HTTPS request
    • net.http.parser: Reject overlarge header section earlier
    • net.http.files: Validate argument to setup function
    • MUC: optimizations for broadcast of visitor presence (thanks Jitsi team)
    • net.server_event: Add ‘wrapserver’ API
    • scansion: Enable blocklist compat during tests to fix CI
    • prosodyctl check: Warn about invalid domain names in the config file
    • util.prosodyctl.check: Correct modern replacement for ‘disallow_s2s’
    • util.prosodyctl.cert: Ensure old cert is moved out of the way
    • util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
    • mod_smacks: Destroy timed out session in async context (fixes #1884: ASYNC-01 in mod_smacks hibernation timeout)
    • mod_invites: Fix traceback when token_info isn’t set
    • mod_admin_shell: Allow matching on host or bare JID in c2s:show
    • mod_admin_adhoc: Fix log messages for reloading modules.
    • core.moduleapi: Default labels to empty list to fix error if omitted
    • mod_muc_mam: Improve wording of enable setting
    • mod_bookmarks: Suppress error publishing empty legacy bookmarks w/ no PEP node
    • mod_bookmarks: Clarify log messages on failure to sync to modern PEP bookmarks
    • mod_invites_adhoc: Fix result form type (thanks betarays)
    • mod_disco: Advertise disco#info and #items on bare JIDs to fix #1664: mod_disco on account doesn’t return disco#info feature
    • util.xtemplate: Fix error on applying each() to zero stanzas

    Download

    As usual, download instructions for many platforms can be found on our download page

    If you have any questions, comments or other issues with this release, let us know!

    • wifi_tethering open_in_new

      This post is public

      blog.prosody.im /prosody-0.12.5-released/

    • chevron_right

      New server, new sponsor

      pubsub.prosody.im / blog • 4 November, 2024 • 4 minutes

    It shouldn’t surprise you, but here we have an obsession for self-hosting. We fought off many requests to migrate our hosting to Github (even before it was cool to hate Github - Prosody and Github were both founded in the same year!). As a result, we self-host our XMPP service (of course), our website, our code repos, our issue tracker, package repository and our CI and build system. This is not always easy - our project has always been a rather informal collaboration of individuals, meaning it’s not a commercial venture and we don’t have any employees.

    It shouldn’t surprise you, but here we have an obsession for self-hosting. We fought off many requests to migrate our hosting to Github (even before it was cool to hate Github - Prosody and Github were both founded in the same year!).

    As a result, we self-host our XMPP service (of course), our website, our code repos, our issue tracker, package repository and our CI and build system.

    This is not always easy - our project has always been a rather informal collaboration of individuals, meaning it’s not a commercial venture and we don’t have any employees. For better or worse, we’re firmly rooted in the free and open-source software principles that focus on growing communities rather than profits.

    As a result, we love working with people who have similar roots and values.

    For many years we had a happy home for our servers with Bytemark, who were very supportive of open-source projects, including ours (they used Prosody themselves for communication, and some of their employees contributed to the project). We are grateful to them for sponsoring the hosting of our build server for many years. However, all good things come to an end - and when Bytemark was acquired in recent years by the much larger iomart Group PLC enterprise as part of a string of other acquisitions, we knew our good times with them were likely drawing to a close.

    This was recently confirmed, as we and the other remaining Bytemark customers were notified that all services are being moved to another location and another of iomart’s brands. We also received an email to inform us that our sponsorship would no longer be in effect after this transition. The monthly price we were told we would have to pay for the server was many multiples of what an equivalent server would cost by today’s standards, even if we had income to pay for it.

    So, we bid a final farewell to Bytemark! But as one chapter ends, another can begin.

    At the time of the acquisition, many ex-Bytemark customers recommended various alternatives. However among those, one independent provider, Mythic Beasts, really stood out. You may have stumbled across them already, for their innovative Raspberry Pi hosting and handling Raspberry Pi launch announcements on a stack of Raspberry Pi devices, or you may have come across them on the Fediverse via their (self-hosted, of course) @beasts Mastodon account. As well as Raspberry Pi hosting, of course they also offer conventional (dedicated and virtual) servers, DNS, traditional web space, and more.

    Mythic Beasts logo

    Mythic Beasts turned out to be just what we were looking for - a no-nonsense service-driven provider where you’ll find founders answering support tickets and where providing amazing service and having fun while doing so are deemed more important than maximizing growth and shareholder value.

    Running services with a hosting provider is a kind of partnership that requires placing a certain amount of trust. Trust that they are competent, that it’s easy to contact someone if things go wrong, and that their values are aligned with yours for the long term. It’s hard to find providers that tick all these boxes.

    Having used Mythic Beasts for a few things personally in recent years, I felt increasingly confident they would be a good home for Prosody’s infrastructure too. In fact they’ve been very supportive and understanding from the moment I reached out about Prosody’s situation, and have generously provided us with capacity to migrate all our services across and retire our old servers. You may have noticed a few blips in recent weeks as we did just that. Thanks for bearing with us!

    All our services are now running smoothly on VMs provided by Mythic Beasts, and we can’t thank them enough as they enable us to continue our journey. It feels great to be with a provider that not only knows but cares about things like open-source, environmental impact, as well as IPv6, DNSSEC and all the other internet tech we care about too.

    For those of you curious, here’s a list (probably not exhaustive) of things we are currently running as part of the project’s infrastructure:

    If you notice any post-migration issues with our site or services, drop by the chat and let us know! Also, if you’re in need of hosting, now you know where we would suggest looking first :)

    • wifi_tethering open_in_new

      This post is public

      blog.prosody.im /new-server-new-sponsor/

    • chevron_right

      Prosody 0.12.4 released

      pubsub.prosody.im / blog • 6 September, 2023 • 1 minute

    We are pleased to announce a new minor release from our stable branch. We’re relieved to announce this overdue maintenance release containing a number of bug fixes and also some improvements from the last few months. Especially the prosodyctl check tool which gained some new diagnostic checks as well as handling of configuration option types the same way Prosody itself does. A summary of changes in this release: Minor changes core.

    We are pleased to announce a new minor release from our stable branch.

    We’re relieved to announce this overdue maintenance release containing a number of bug fixes and also some improvements from the last few months.

    Especially the prosodyctl check tool which gained some new diagnostic checks as well as handling of configuration option types the same way Prosody itself does.

    A summary of changes in this release:

    Minor changes

    • core.certmanager: Update Mozilla TLS config to version 5.7
    • util.error: Fix error on conversion of invalid error stanza #1805
    • util.array: Fix new() library function
    • util.array: Expose new() on module table
    • prosodyctl: Fix output of error messages containing ‘%’
    • util.prosodyctl.check: Correct suggested replacement for ‘disallow_s2s’
    • util.prosodyctl.check: Allow same config syntax variants as in Prosody for some options #896
    • util.prosodyctl.check: Fix error where hostname can’t be turned into A label
    • util.prosodyctl.check: Hint about the ‘external_addresses’ config option
    • util.prosodyctl.check: Suggest ‘http_cors_override’ instead of older CORS settings
    • util.prosodyctl.check: Validate format of module list options
    • mod_websocket: Add a ‘pre-session-close’ event #1800
    • mod_smacks: Fix stray watchdog closing sessions
    • mod_csi_simple: Disable revert-to-inactive timer when going to active mode
    • mod_csi_simple: Clear delayed active mode timer on disable
    • mod_admin_shell: Fix display of remote cert status when expired etc
    • mod_smacks: Replace existing watchdog when starting hibernation
    • mod_http: Fix error if ‘access_control_allow_origins’ is set
    • mod_pubsub: Send correct ‘jid’ attribute in disco#items
    • mod_http: Unhook CORS handlers only if active to fix an error #1801
    • mod_s2s: Add event where resolver for s2sout can be tweaked

    Download

    As usual, download instructions for many platforms can be found on our download page

    If you have any questions, comments or other issues with this release, let us know!

    • wifi_tethering open_in_new

      This post is public

      blog.prosody.im /prosody-0.12.4-released/

    • chevron_right

      Prosody 0.12.2 released

      pubsub.prosody.im / blog • 13 December, 2022 • 1 minute

    We are pleased to announce a new minor release from our stable branch. This is a regularly delayed release containing a number of fixes for issues that we have come across since the last release of the 0.12 series. A summary of changes in this release: Fixes and improvements util.stanza: Allow U+7F when constructing stazas net.unbound: Preserve built-in defaults and Prosodys settings for luaunbound (fixes #1763: luaunbound not reading resolv.

    We are pleased to announce a new minor release from our stable branch.

    This is a regularly delayed release containing a number of fixes for issues that we have come across since the last release of the 0.12 series.

    A summary of changes in this release:

    Fixes and improvements

    • util.stanza: Allow U+7F when constructing stazas
    • net.unbound: Preserve built-in defaults and Prosodys settings for luaunbound (fixes #1763: luaunbound not reading resolv.conf) (thanks rgd)
    • mod_smacks: Disable not implemented resumption behavior on s2s
    • mod_http: Allow disabling CORS in the http_cors_override option and by default

    Minor changes

    • util.json: Accept empty arrays with whitespace (fixes #1782: util.json fails to parse empty array with whitespace)
    • util.stanza: Adjust number of return values to handle change in dependency of test suite (fix test with luassert >=1.9)
    • util.startup: Ensure import() is available in prosodyctl (thanks keyzer)
    • mod_storage_sql: Fix initialization when called from prosodyctl
    • mod_storage_sql: Fix the summary API with Postgres (#1766)
    • mod_admin_shell: Fixes for showing data related to disconnected sessions (fixes #1777)
    • core.s2smanager: Don’t remove unrelated session on close of bidi session
    • mod_smacks: Don’t send redundant requests for acknowledgement (#1761)
    • mod_admin_shell: Rename commands user:roles() to user:setroles() and user:showroles() to user:roles()
    • mod_smacks: Bounce unhandled stanzas from local origin (fix #1759)
    • mod_bookmarks: Reduce log level of message about not having any bookmarks
    • mod_s2s: Fix firing buffer drain events
    • mod_http_files: Log warning about legacy modules using mod_http_files
    • util.startup: Wait for last shutdown steps
    • util.datamapper: Improve handling of schemas with non-obvious “type”
    • util.jsonschema: Fix validation to not assume presence of “type” field
    • util.jsonschema: Use same integer/float logic on Lua 5.2 and 5.3

    Download

    As usual, download instructions for many platforms can be found on our download page

    If you have any questions, comments or other issues with this release, let us know!

    • wifi_tethering open_in_new

      This post is public

      blog.prosody.im /prosody-0.12.2-released/

    • chevron_right

      Prosody 0.11.14 released

      pubsub.prosody.im / blog • 12 December, 2022

    We are pleased to announce a new minor release from our stable branch. This release fixes an issue in the library Prosody uses to build XML stanzas, wherein it was too strict and disallowed the character “DEL”, which is actually allowed by XML. This has no effect on normal stanza routing and delivery, but may cause reading stanzas from message archives or offline message stores to fail. A summary of changes in this release:

    We are pleased to announce a new minor release from our stable branch.

    This release fixes an issue in the library Prosody uses to build XML stanzas, wherein it was too strict and disallowed the character “DEL”, which is actually allowed by XML. This has no effect on normal stanza routing and delivery, but may cause reading stanzas from message archives or offline message stores to fail.

    A summary of changes in this release:

    Fixes and improvements

    • util.stanza: Allow U+7F when constructing stazas

    Download

    As usual, download instructions for many platforms can be found on our download page

    If you have any questions, comments or other issues with this release, let us know!

    • wifi_tethering open_in_new

      This post is public

      blog.prosody.im /prosody-0.11.14-released/

    • chevron_right

      Bringing FASTer authentication to Prosody and XMPP

      pubsub.prosody.im / blog • 28 November, 2022 • 10 minutes

    As our work continues on modernizing XMPP authentication, we have some more new milestones to share with you. Until now our work has mostly been focused on internal Prosody improvements, such as the new roles and permissions framework. Now we are starting to extend our work to the actual client-to-server protocol in XMPP. Prosody and Snikket are both regularly used from mobile devices, which have intermittent connectivity. Even if it’s only a change between networks, or when driving through a tunnel for a few minutes, these things can temporarily break your connection - requiring a new one to be established.

    As our work continues on modernizing XMPP authentication, we have some more new milestones to share with you. Until now our work has mostly been focused on internal Prosody improvements, such as the new roles and permissions framework. Now we are starting to extend our work to the actual client-to-server protocol in XMPP.

    Prosody and Snikket are both regularly used from mobile devices, which have intermittent connectivity. Even if it’s only a change between networks, or when driving through a tunnel for a few minutes, these things can temporarily break your connection - requiring a new one to be established.

    We’ve had solutions and optimizations in the XMPP protocol for this situation for years (really… the first version of XEP-0198 was published in 2004!). XEP-0198 allows a client to reconnect to the server as soon as the network comes back, easily discover if anything failed to be sent/received due to the network interruption, and then resync any lost packets in either direction.

    This effectively allows resuming and repairing the session as if no disconnect occurred, while skipping a bunch of traffic that would usually be exchanged when establishing a new session (instead, everything is simply cached from the old session).

    However, there is one important thing we don’t allow the client to skip. To keep this resumption step secure, we require authentication. It’s a new connection, and we need to prove it’s from who it claims to be from.

    Authentication in XMPP today

    The most common authentication method for XMPP connections today is SCRAM. This is a neat password-based authentication mechanism that has many nice properties, such as allowing both the client and the server to store only a hash of the password. It also allows the client to determine that the server really knows the user’s password, and supports channel binding. These features allow the client to detect various kinds of attack.

    Even though we have been using SCRAM in XMPP for many years now, it still offers more protective features today than the vast majority of online services you use - which generally all send your password to the server in plain text, albeit within TLS or HTTPS.

    A new SCRAM alternative is currently being developed, known as OPAQUE, which adds even more nice properties. But that’s for future blog post… :)

    However, there are some drawbacks of SCRAM (and similar mechanisms, including OPAQUE) that can’t realistically be solved. To adequately protect your password, it requires some back-and-forth negotiation with the server. In protocol speak, we refer to such situations as “round trips” - every time the client sends something to the server and has to wait for a response before it can proceed. On a very slow network, round trips can add a bunch of latency, and as anyone who has used audio/video calls or gaming online knows, latency can be frustrating and hard to eliminate from a connection.

    Simpler authentication methods just have the client say “here are my credentials”, and the server say “your credentials look great, you’re authenticated!“. That’s how HTTP and most websites work today. Such approaches are quick and easy, but they don’t protect your credentials as well as SCRAM does.

    Passwords are the problem

    SCRAM’s protections are important for passwords. Passwords are (unfortunately) often chosen by users to be the same or similar across multiple services, and even if they are strong and unique they can be vulnerable to phishing. If leaked, many memorable passwords contain private information about the user.

    We don’t want to drop any of our important password security features just to improve connection speed. So instead we found a better solution: drop passwords!

    Our new solution allows the client to log in initially using a password (or any other method the XMPP server supports). After that, it can upgrade to a strong unique authentication token provided by the server, which it can use to quickly re-authenticate on future connections.

    Tokens are the answer

    Tokens have many advantages compared to passwords:

    • They are unique to the service that generated them, so cross-service attacks like credential stuffing are useless against tokens.
    • Tokens don’t need to be memorable, so they can be very long and random (both desirable properties for increasing account security!).
    • As they are not memorized by the user, they can be rotated frequently without any inconvenience.
    • Different tokens can be generated for each of a user’s devices, instead of sharing the user’s password across all of them. This also allows selectively removing a device’s access from the user’s account, e.g. if it gets lost or stolen.

    With these security advantages, we suddenly unlock the ability to use simpler authentication mechanisms without risking the security of the user’s account or password.

    Still, we can do a bit better than just sending the token to the server as plain text. Fortunately, just the kind of modern token authentication method we need has already been in development by Florian Schmaus: the SASL HT mechanism family.

    HT mechanisms have the following properties:

    • The actual token itself is not exchanged over the connection during authentication.
    • And yet, the server receives proof that the client has the full correct token.
    • The client also receives proof that the server has the full correct token (and isn’t just impersonating the real server).
    • Finally, if channel binding is used, both sides receive proof that no MITM or relay attack being performed.

    And… all this can be completed within a single round trip!

    The protocol to achieve this has been submitted to the XSF as “Fast Authentication Streamlining Tokens”. It is in the acceptance queue, so doesn’t have a XEP number assigned yet.

    Updating and integrating with SASL2

    If FAST authentication was the only thing we had been working on recently, we would be happy enough. But there’s more…

    In collaboration with Thilo Molitor from the Monal project, a new version of XEP-0388 (SASL 2) has been submitted. SASL 2 was originally proposed back in 2017, and it defines a new authentication protocol for XMPP (still based on SASL, so we can reuse all the existing mechanisms we already have in place).

    Several features of SASL 2 are very relevant to our work. For example, it allows negotiation of session features in parallel with the authentication process. The old way required the client to authenticate, and then proceed to negotiate whatever features and parameters it wanted for the new session. With SASL2 the client can provide this information at the same time it provides its credentials. This saves yet more round trips.

    As well as SASL 2, we’ve also updated a related proposal from around the same time, XEP-0386 (Bind 2). This is also a critical piece of session establishment that integrates with SASL 2.

    With the work we’ve done across these three specifications - XEP-0388, XEP-0386 and FAST - we’ve essentially overhauled the entire authentication and session establishment protocol of XMPP. Even with all our additional authentication security features, it’s now possible for a client to connect, authenticate, and resume or create a session in a single request and response.

    This post shouldn’t be taken as being entirely about performance improvements. It’s nice to be able to (re)connect to the server in the blink of an eye. But there are other reasons to be working on this.

    As anyone who used XMPP in 2012 and 2022 knows, XMPP has been continuously evolving as both the internet and the way people use it has changed. Over time we have “bolted on” various features to the connection process to achieve this evolution.

    Now, with these new changes, we are bringing all these enhancements together into a single framework that was designed for them to fit neatly into. Not only are we reducing round trips, we are also simplifying connection establishment for the next generation of XMPP developers.

    When can I use all this?

    Even though this is all cutting edge stuff, you’ll be able to use it much sooner than you might think!

    Prosody has support for the new SASL 2, Bind 2 and FAST protocols. They are all available as community modules right now, though we intend for them to become part of the main Prosody distribution eventually.

    To get started, you’ll need a Prosody trunk nightly build, and simply enable the following community modules:

    To take advantage of the new features, you’ll need a compatible client. FAST is already implemented in multiple clients, and will be available from Conversations 2.11 for Android, as well as the next major versions of Monal, Siskin and Beagle for iOS and MacOS.

    Gajim already has SASL 2 implemented, and other client developers have also already expressed an interest in support.

    If you’re a client or library developer interested in supporting any of this, we have a test server available that you are welcome to use. Just let us know!

    Do remember that all this is still very new and experimental. The relevant protocol specifications are still working their way through the XSF standards process and there may be changes to come in the future. There may also be undiscovered bugs. We encourage brave souls to help test it all in real world deployments, but if your priority is keeping a stable setup, you should probably wait a little longer before deploying any of this.

    TCP Fast Open

    While this post is not just about performance improvements, we’ve talked a lot about performance improvements. Therefore it’s worth noting an extra little side feature at this point.

    Prosody trunk builds, when used with the new LuaSocket 3.1.0, support something known as TCP Fast Open. This is a low-level TCP extension that allows new connections to skip a round trip, by exchanging initial data packets while the connection is being established.

    It’s disabled for servers by default on Linux, but you can enable it on most modern systems by creating the file /etc/sysctl.d/tcp-fastopen.conf with the contents:

    net.ipv4.tcp_fastopen=3
    

    Run systemctl restart systemd-sysctl.service to apply the changes. More information on the sysctl configuration can be found in the Linux kernel documentation.

    In Prosody’s config, add the following in the global section:

    network_settings = {
        tcp_fastopen = 256;
    }
    

    Restart Prosody to apply these changes. Be aware that some networks and routers have been reported to be incompatible with TCP Fast Open (support was removed from Firefox for this reason). Although Linux has built-in recovery mechanisms that should work around such issues, if you experience trouble connecting to your server from certain networks, you may want to try turning this off again.

    We’re also looking at support for TLS 1.3’s 0-RTT mode, which can be combined with FAST authentication and TCP Fast Open to achieve full connection establishment within a single round-trip. Pretty impressive!

    Next steps

    These protocol changes are yet another step on our XMPP authentication modernization journey. With the new protocols now written and implemented, we can start looking forward to the next milestones for the project.

    In the coming months, we’ll be working on the ability to sign in to your XMPP account from third-party clients and services without sharing your password with them. Subscribe to our blog or Mastodon account and keep an eye out for that future post!

    • wifi_tethering open_in_new

      This post is public

      blog.prosody.im /fast-auth/