v4.3.24
Security fix release for Coolify 4.3. Apply it with: curl -fsSL https://cdn.coollabs.io/coolify/patch.sh | sudo bash
Security fix release for Coolify 4.3. Apply it with: curl -fsSL https://cdn.coollabs.io/coolify/patch.sh | sudo bash
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
APPEND and COPY/MOVE into another account's mailbox do not change the JMAP EmailDelivery state.SEARCH RETURN with MIN or MAX alongside ALL returns only the minimum and maximum in ALL, and SAVE combined with MIN or MAX and ALL or COUNT saves only the minimum and maximum instead of every match.VTIMEZONE definitions it carries, so an occurrence moved by an external organizer can reference a TZID (for example W. Europe Standard Time) the stored event no longer defines, and Apple Calendar shows both the original and the moved occurrence.http://127.0.0.1:45678) are not matched against registered loopback URIs on any port and are rejected by dynamic client registration.PROPFIND allprop returns DAV:current-user-principal, so Windows Explorer shows every file and folder under the account name.
Graphics improvements
Misc UX
APIs
Expressions
Variables
Controls
Misc
Full Changelog: v5.0.7...v5.1.0
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
sd_notify support.Mailbox/set allows moving a mailbox under a parent that already has a child with the same name, and rejects renames that only change the case of a mailbox name with alreadyExists.hickory-resolver patched fork at https://github.com/stalwartlabs/hickory-dns.SMFIP_NOHDRS without SMFIP_NOEOH, so the transaction stalls until it times out.claimUsername claim but has an email claim, the account is built from email without consulting the userinfo endpoint.onSuccessUpdateEmail and onSuccessDestroyEmail entries in EmailSubmission/set that name an existing submission by id update or destroy the Email with the same id instead of the submission's own Email.VacationResponse/set that only sets isEnabled on an account without a vacation response activates an empty Sieve script.
General
API
Media-Over-QUIC
RTSP
RTMP
HLS
WebRTC
Dependencies
Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.
Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
MaskedEmail with emailDomain fails with forbidden for every domain when the account has addresses on more than one domain.mobilesync), are answered with the Outlook settings instead of error 601.LOGIN and AUTHENTICATE with a wrong, expired or unknown app password or API key are answered with an untagged NO, so clients keep waiting for the command to complete until the connection times out.NO before the connection is closed.DkimManagement task is created for them.PYZOR.match expression are never enforced, including the global queue quota created on first start.LOG, LOG.old.*) grows without limit because log rotation and retention are left at RocksDB defaults.
Full Changelog: v5.0.6...v5.0.7
Security:
Security:
OnClientValidatePassword, or error text and UIDs sent by remote servers) could break out of their string. With either script language, a rule's "Run function" name could carry code. This would allow an attacker to run arbitrary code in the hMailServer process. Values are now escaped, and rule function names may only contain letters, digits and underscores.If you are unable to install this version, disable JScript execution and do not give end-users access to the hMailServer COM API.
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
TLSA records are looked up for every MX host, including hosts whose zone is not DNSSEC signed.PushSubscription created within the verification rate limit window of another one on the same account never receives its PushVerification, since the blocked verification is dropped instead of being sent once the window expires.aud claim is derived from a hand-written parse of the push URL, so a crafted push URL can make the server sign a token for a push service other than the one the request is sent to.Email/import rejects a blobId that refers to a Blob/upload creation id in the same request ("#u0") with Invalid blob id..Email/set with a full mailboxIds object identical to the current mailboxes, together with a keyword change, stores the message with IMAP UID 0, so IMAP clients stop seeing it.outboundMta role stops replying to DATA and to JMAP submissions once about 1024 messages have been queued on it.DATA stage Sieve script does not see headers added by milters or MTA hooks, and discards every milter and MTA hook change when it edits the message.DELETE and switch to chunks only after a timeout.COPY and MOVE fail with NO [CONTACTADMIN] when another session changes the same message at the same time.<Encryption>TLS</Encryption>, which Outlook reads as STARTTLS.
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
bit_and function.RCPT TO and then rejected at local delivery with 550 5.5.0 Mailbox not found.spf elements per record and the version element of a DMARC aggregate report is written as 1 instead of 1.0.addr-type in Original-Recipient (rfc822;rfc822;user@example.org).TOP msg n counts the n lines from the first byte of the message instead of from the first byte of the body.. is not byte-stuffed.envelope "orcpt" yields the bare address for an ORCPT supplied over SMTP. It now carries the addr-type prefix in every case, as required by RFC 6009._acme-challenge TXT records published for a DNS-01 authorization are never removed.hickory-resolver race that cancels the TCP retry when two nameservers return a truncated response in parallel.email, preferred_username or upn claim are always authenticated against the default directory.failOnTimeout is disabled, so an index whose batches take longer than pollInterval x maxRetries never completes an indexing task and resubmits the same batch indefinitely.Application offline.INCR and EXPIRE as a MULTI/EXEC transaction, whose MOVED redirects collapse into a single EXECABORT that never refreshes the slot map.PING.
General
RTSP
Quantization < 127RTMP
HLS
WebRTC
Dependencies
Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.
Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
PROPFIND responses do not declare the namespace of every requested property on the DAV:multistatus element.STARTTLS is discarded once the TLS handshake completes, as required by RFC 3207.match expressions evaluate their if/then conditions.fail instead of none in logs.temperror instead of fail.p tag is only applied, as p=none, when it contains a rua tag, even if it declares sp or np.Application is discarded when its resourceUrl changes or the record is deleted, so the next unpack fetches the new resource.. to MX record hostnames.fileinto by a user script are treated as ham and are no longer moved to Junk when classified as spam.SELECT, EXAMINE and STATUS on a shared mailbox require the r (read) right.AUTHENTICATE is refused on clear-text connections unless allowPlainTextAuth is enabled, and the greeting and CAPABILITY response advertise LOGINDISABLED instead of the AUTH= mechanisms in that case.STARTTLS or STLS are discarded once the TLS handshake completes.STARTTLS, are aborted after the listener's tlsTimeout, releasing the connection slot.encryptionKey or HMAC signatureKey cannot be read, instead of an empty key.{local} and {domain} filter placeholders are escaped.CalendarEvent/set stores useDefaultAlerts per user, and CalendarEvent/get returns false when it was never set.CalendarEvent/get returns null for baseEventId unless the id is a synthetic recurrence instance.CalendarEvent/get returns null for requested recurrenceRule and recurrenceOverrides properties on synthetic recurrence instances.CalendarEvent/get and ContactCard/get return only id when the properties argument is an empty list, instead of every property.
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
SieveUserInterpreter.dkimSignDomain setting, which defaults to the account's own domain.CalendarEvent/set requests that ask for scheduling messages are rejected with a forbidden error when the account cannot send them.Calendar/get and AddressBook/get return every property when the properties argument is omitted or null.ping events advertise the interval in seconds rather than milliseconds.STATUS or FETCH batch receives its tagged completion, instead of the first failing command dropping the responses for all commands queued behind it.DAV:quota-available-bytes.METHOD:REQUEST carrying the RECURRENCE-ID instead of a METHOD:ADD.fileinto :specialuse and specialuse_exists accept special-use attributes in the \Trash form.[::]) fall back to IPv4 when socket creation fails with EPROTONOSUPPORT.
Media-over-QUIC
API
General
alwaysAvailableRecorded parameter that controls whether recording happens during offline periods for always-available paths. When set to false, recording only starts when a real source is connected.API
Media-Over-QUIC
RTSP
RTMP
HLS
WebRTC
RPI Camera
Dependencies
Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.
Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
CalendarEvent/set support for updating and deleting synthetic ids (#2925).TLSA records are looked up whenever the MX RRset is signed, even when the MX host's own zone is not.TLSA records fall back to the configured TLS strategy, permitting cleartext delivery where TLS is required.af-south-1 region configuration.rediss:// URLs now connect to the master over TLS instead of silently falling back to cleartext.Message-ID headers use the hostname of the node that built the message instead of the configured server hostname.inboundReportAddresses match are only discarded when they actually contain a report (#1088).Stale or Inactive indefinitely.
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
oauthClientId setting in Application, which allows the WebUI to use a different OAuth client than the default.env.spam.score and env.spam.is_spam variables, which expose the spam filter result to system scripts running at the DATA stage.vCardVersion setting in AddressBook, which allows the default vCard version to be specified when the client does not request a specific version.VARBINARY(255) with a full-length primary key instead of TINYBLOB. Note: Existing deployments should run, once per table, for each of the tables a, d, e, f, g, h, j, k, l, m, n, o, p, q, r, s, t, u, w, x and y the command ALTER TABLE a MODIFY k VARBINARY(255) NOT NULL;.mailto: URI percent-encodes a full name-addr are silently dropped from the scheduling snapshot.SCHEDULE-STATUS=3.7.PARTSTAT on the organizer's copy of the event only, leaving a local attendee's own copy at NEEDS-ACTION and sending the organizer no reply.MKCALENDAR, MKCOL and PROPPATCH store the display name, description, time zone and the other per-user properties under the authenticated account rather than the account that owns the collection./api/discover splits the account name on @ without accounting for the % master user separator or the recovery administrator.SETACL and DELETEACL fail to resolve an identifier spelled with uppercase characters.TZID parameter with no matching VTIMEZONE component whenever the event was stored without one.AddressBook/get: A new account's default address book is never recorded.Email/get and Email/parse with fetchAllBodyValues return body values only for the parts listed in textBody or htmlBody, omitting every other text/* part in bodyStructure.Email/set writes display names as an RFC 2047 encoded-word wrapped in a quoted-string, which RFC 2047 forbids.Mailbox/set, AddressBook/set and Calendar/set store isSubscribed and the other per-user properties under the authenticated account rather than the account named in the request.Principal/query returns no results when the name or email filter is spelled with uppercase characters.FileNode/set: File nodes created over JMAP are returned with a <D:href> holding the raw name over WebDAV.maxTotalHits pagination setting is left at the Meilisearch default.failOnTimeout is disabled.--import always aborts with the target database already containing data in the key range being imported.catchAllAddress pointing to a mailing list or a sub-addressed mailbox is accepted at RCPT TO and then rejected at local delivery with 550 5.5.0 Mailbox not found.is_local_address() and is_local_domain() expression functions do not match an address or domain spelled with uppercase characters.host resolves loopback address, which prevents relaying through a local proxy or tunnel.local_port and local_ip report the address Stalwart is bound to rather than the address the client connected to when the connection arrives through a trusted proxy.totalDeadline is not enforced on tasks that fail with a specific retry time.maxAttempts failures, so a search store that is unavailable or overloaded leaves messages permanently missing from the index.spamtest returns only 1 or 10 (and spamtest :percent only 0 or 100), so scripts cannot act on intermediate spam scores.MIME_BAD is tagged whenever the declared Content-Type of an attachment is not byte identical to the type detected from its magic bytes.
General
API
Media-Over-QUIC
RTSP
RTMP
inform about authentication failures (#5657) (#6072) Reply with NetStream.Play.Failed or NetStream.Publish.Unauthorized when a client is not authorized to play or publish. This makes clients like OBS to stop recreating the connection in case of authentication failures.
reader: do not emit empty frames (bluenviron/gortmplib#106)
parse video PTS delta as signed (bluenviron/gortmplib#88)
HLS
prefer hls.js on iOS too (#6090) In the embedded HLS reader, use hls.js on iOS, that was previously disabled due to compatibility issues that should have been solved.
unlock the session-in-query+iOS combination (#6088) this was previously blocked because the session in query was meant to be dynamic, therefore incompatible with static playlists required by iOS. It is not anymore, so we can support that.
stop using cookies with plain HTTP (#6089) in case of plain HTTP, fall back to query parameters, which are safer than HTTP cookies because they are not shared between different pages/domains, although they are visible in the URL.
WebRTC
SRT
RPI Camera
Dependencies
Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.
Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
inboundReportMaxSize setting, which bounds the size of a decompressed inbound DMARC or TLS report (default 25MB).cacheSize setting, which bounds the total memory shared by the block caches of every column family (default 128MB).Identity/get keeps identities in sync with the account's e-mail addresses.uploadTtl to 1ms triggers panic.CalendarEvent/set does not assign organizerCalendarAddress nor send scheduling messages when an event is created with participants.CalendarEvent/get omits isOrigin when it is listed explicitly in properties.CalendarEventNotification/changes and FileNode/changes reject with cannotCalculateChanges the state that /get returned for an account with no change history.CalendarEvent/set and ContactCard/set do not write a vanished tombstone for the previous CalDAV/CardDAV href when calendarIds or addressBookIds moves an item between collections.mailto: URI are queued verbatim.REPORTs and JMAP CalendarEvent/query results a few years after their first occurrence.MOVE on a folder honors a Depth header of 0 or 1 instead of always moving the whole subtree.Message-ID wrapped in doubled angle brackets.source never match at enqueue.testing mode are enforced, turning any TLS error into a permanent failure.mx patterns published as U-labels never authorize the MX host they name.application/octet-stream as Content-Type for encrypted payloads.550 Relay not allowed, unless the domain's primary name happened to be resolved earlier and is still cached.bufferSize setting was applied to the unused default column family and had no effect.include statements fail to find system and user global scripts whose name contains uppercase characters.totalDeadline is measured from the time a task was created instead of its first failed attempt.
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
Range and If-Range header support on file downloads (RFC 7233) (#2377).url_original expression variable for Url rules.jemallocator crate with tikv-jemallocator (contributed by @checkraisefold).description as label property.FUTURERELEASE HOLDUNTIL uses Unix timestamps instead of RFC 3339 date-times.EmailSubmission/query filtering on undoStatus contradicts EmailSubmission/get, reporting held FUTURERELEASE submissions as final instead of pending.EmailSubmission/get requests without an ids argument iterates the wrong index.Accept: text/vcard version negotiation is ignored whenever another parameter such as q or charset follows version=.text/calendar part outside the multipart/alternative and disposed as an attachment.impersonate permission never have their ACL grants collected, so shared items are never listed in JMAP sessions, CalDAV/CardDAV discovery or IMAP.COPY/MOVE into a shared folder fails with NO [ALREADYEXISTS] when the destination account already holds the message, leaving the message in the source mailbox and clients in a retry loop.BODYSTRUCTURE and ENVELOPE return MIME parameters, Content-Description, subjects and display names as raw UTF-8 even to sessions that never enabled UTF8=ACCEPT.
General
Media-Over-QUIC
General
Media-Over-QUIC
RTSP
RTMP
HLS
WebRTC
SRT
Dependencies
Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.
Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
orcpt during the DATA stage.accessKey can now be read from an environment variable or file.GET instead of creating a new task which times out on busy servers.LF line endings, producing a single 4247 octet line that strict SMTP relays reject with line too long.Identity-Alignment: none when a mechanism authenticated successfully but against an identity that is not aligned with the From domain.BDAT chunks sent without a valid MAIL FROM are answered with 552 5.3.4 Message too big for system instead of 503 5.5.1.maxMessageSize of 0 rejects every message with 552 5.3.4 Message too big for system instead of disabling the size limit.[::]), including all defaults, refuse IPv4 connections such as 127.0.0.1, since IPV6_V6ONLY is enabled by default on Windows.
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
Email/copy should return alreadyExists when copying a message to a mailbox that already contains it.Email/copy with onSuccessDestroyOriginal destroys the copy's creation id instead of the source Email id.CalendarEvent/set does not generate a uid on create when the client omits it.CalendarEvent/set does not refresh the updated property (iCalendar DTSTAMP) on create or update.EmailSubmission/set rejects valid recipients whose domain is itself a public suffix (e.g. gov.in, co.uk).notRequest when a method name contains a JSON-escaped solidus (e.g. Core\/echo)./.well-known/mta-sts.txt.SysApiKeyCreate or SysApiKeyUpdate permissions can regain its own account's full rights.EC PRIVATE KEY) format, or with a leading byte-order mark.encryptOnAppend.quick-cache shard, causing constant database rebuilds.#certificate-...) fail to resolve on defaultCertificateId, defaultAdminRoleIds, listenerIds and publicKey.reindex drops calendar and contact index tasks for accounts with fewer than a full batch of items.--import when the target already contains data in the key range being imported.
General
API
Media-Over-QUIC
WebRTC
RTSP
HLS
SRT
Dependencies
Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.
Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
STORE and EXPUNGE can execute out of order.isSubscribed on a shared mailbox.Content-Encoding: aes128gcm should not be base64-encoded but sent as raw bytes.PushSubscription/set rejects the unpadded base64url keys the W3C Push API produces.Email/import does not send push notifications for imported messages.CalendarEvent/set silently ignores ifInState.calendar-query REPORT returns empty calendar-data for JMAP-created events.queue_name variable not available in rate limiter expressions.MAILTO calendar addresses become invalid SMTP recipients.MAIL FROM unauthorized.allowedEndpoints expression in recovery mode.
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
imap, smtp, pop3 and sieve as valid resource indicators for OAuth access tokens.isEnabled reset to false whenever properties are changed.0001-01-01T00:00:00Z, max 9999-12-31T23:59:59Z.dns-update crate changelog).1h30m).Received headers to auto-generated messages and detect loops.
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
bogus as a temporary failures to prevent downgrade attacks.ECDSA private key support for SEC1 format.redirect_uri for loopback addresses.name and group claims from userinfo endpoint when missing from the JWT token.user to group panics.UnknownRecipient only for disabled or expired masked emails.sanitize_email rejects valid Punycode domains.attributesToSearchOn.calendar-query REPORT returns invalid HTTP 404 when no events match the query.EMFILE (too many open files).
General
RTSP
WebRTC
RPI Camera
Dependencies
Binaries are compiled from source code by the Release workflow, which is a fully-visible process that prevents any change or external interference in produced artifacts.
Checksums of binaries are also published in a public blockchain by using GitHub Attestations, and they can be verified by running:
ls mediamtx_* | xargs -L1 gh attestation verify --repo bluenviron/mediamtx
You can verify checksums of binaries by downloading checksums.sha256 and running:
cat checksums.sha256 | grep "$(ls mediamtx_*)" | sha256sum --check
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
AES-256-GCM and ChaCha20-Poly1305 for S/MIME (#161).allowInvalidCerts option to allow connecting to S3 endpoints with invalid TLS certificates.Principal/query returns broad results when a name or email filter cannot be resolved.
If you are upgrading from v0.16.x, replace the binary (or run docker pull). If you are upgrading from v0.15.x and below, please read the upgrading documentation for more information on how to upgrade from previous versions.
redirectRoot option to Http object to allow redirecting requests to the root path to a different path (e.g. /account).reuseKey option to allow reusing private keys in renewals.GETJMAPACCESS command to discover the JMAP session resource URL (#2736).using.application/json in the Content-Type header.accountId argument on requests.notFound / notUpdated / notDestroyed / notCopied instead of dropping them.*/set: Unchanged immutable id property is rejected on update.*/query and */queryChanges: nullrejected asnotRequest`.Email/query:
anchor handling.collapseThreads is enabled.hasKeyword, allInThreadHaveKeyword, and someInThreadHaveKeyword conditions.Email/copy: Take the source message id from the value's id property.Email/set: Bump reference-resolution max_depth from 1 to 2.Email/import: Reject blobs that do not contain valid messages.EmailSubmission/set: return sendAt and undoStatus in the created response.Mailbox/set: Return alreadyExists instead of invalidProperties when creating a mailbox with an existing name.SearchSnippet/get: incorrect response structure.Thread/changes: emit a container delete when a thread becomes empty.VacationResponse/set: incorrect singleton handling.TLSA record validation (#2328 - credits to @vdukhovni).include statements ignore capitalisation of sub-script names (#1643)